我尝试通过python requests
向某个API发送授权请求。
代码看起来像
import requests
import argparse
import json
URL = "some url"
parser = argparse.ArgumentParser()
parser.add_argument("username", help="Username")
parser.add_argument("password", help="Password")
args = parser.parse_args()
def get_token(username, password):
url = URL + "/auth"
headers = {'Content-type': 'application/json'}
params = {
"username": username,
"password": password
}
r = requests.post(url, json=params, headers=headers)
return json.loads(r.content.decode('utf-8'))['data']['token']
token = get_token(args.username, args.password)
print(token)
密码包含不同的符号,包括。$)?等
当我通过Pycharm运行/调试配置传递参数时,带引号的参数(例如"abcde" "abcde"
)都可以。
但是当我尝试通过python -m scriptname "abcde" "abcde"
从终端(Pycharm或Ubuntu终端)运行脚本时,我收到以下消息作为响应:{"message":"invalid login data","statusCode":400,"status":"BAD_REQUEST"}
我想字符串编码存在一些问题,但找不到。
文件编码(显示在Pycharm窗口的右下角)是UTF-8。终端echo $LANG
中的字符串编码为en_US.UTF-8。 python -c "import sys; print(sys.stdout.encoding)"
还会返回UTF-8。
更新
我刚刚注意到,当我将密码作为参数传递给终端时,密码的某些部分正在消失。
我有一个密码,其中包含$qTyqf
文本(例如abcde$qTyqf§abcde
),并且从终端运行时仅删除了该部分。为什么以及如何避免这种情况?
答案 0 :(得分:0)
确定要将参数传递给命令行时是否需要引号? https://docs.python.org/2/library/argparse.html
python -c "import sys; print(sys.argv)" x$ y
按预期工作,我收到“ x $”,“ y”作为参数
答案 1 :(得分:0)
使用python中的sys.arg可能会容易得多,并且不会以任何方式操纵您的输入。
cmd> myfile.py用户名密码
sys.argv [0]是文件名
sys.argv [1]将是您的用户名
sys.argv [2]是您的密码
用法:
import requests
import argparse
import json
import sys
URL = "some url"
arguments = sys.argv[1:]
print("Argument Test: " + str(arguments))
def get_token(username, password):
url = URL + "/auth"
headers = {'Content-type': 'application/json'}
params = {
"username": username,
"password": password
}
r = requests.post(url, json=params, headers=headers)
return json.loads(r.content.decode('utf-8'))['data']['token']
token = get_token(arguments[0] , arguments[1])
print(token)
答案 2 :(得分:0)
好的。我找到了答案。
我使用双倍配额(“)来传递参数,并且以$abc
开头的部分密码参数被(我认为)env变量abc
的空值所代替。密码刚刚消失,我无法使用错误的密码登录。
解决方案。我用单配额(')代替了双配额(“),现在一切正常。