Python post发送数据的编码问题
不知道如何简短形容这个问题,只能细细赘述某个网站想要post登录,参数都已经确定了,但是用户名不知道该如何传入(用户名是中文)
发现问题:
先是使用requests.post()发送请求,发现返回的一直是登陆失败;再用易语言发送请求,结果却是登陆成功
寻找原因:
上网查了一下,python中的requests.post()默认会将发送的数据进行url编码,用fiddler抓了下包,发送的数据是这个样子的
经过多次比对发现,导致登录失败的是textname,传入的数据是:%E5%BC%A0%E4%B8%89(经过url解码后是“张三”)
而易语言不进行url编码,fiddler抓包是这样的
(第二张图已进行url解码)(第一张图中的部分数据在发送前被我手动编码,因为有一个参数经过测试必须进行url编码,而textname这个参数经过实测绝对不能进行url编码)(textname参数已在图中用红线标出)
查看易语言发送数据时的textname十六进制数据为 { 0xD5, 0xC5, 0xC8, 0xFD },进行十进制转换再在易语言里面从字节集到文本得到正确解析
(将D5,C5,C8,FD转换为了十进制)
而python requests发送数据进行url编码,textname十六进制数据为{ 0x25, 0x45, 0x35, 0x25, 0x42, 0x43, 0x25, 0x41, 0x30, 0x25, 0x45, 0x34, 0x25, 0x42, 0x38, 0x25, 0x38, 0x39 }
所以我的解决思路是在python发送数据时,让其发送我指定的二进制数据(当然也可以有其他解决方案,但是我没想到)
问题明确,尝试解决:
经过搜索后,网络建议不使用requests模块,而改用urllib模块
但是urllib构造post时,数据必须使用bytes类型,尝试过使用json.dumps再转bytes,也试了urllib.parser均无法直接传递“张三”的二进制数据
请问大佬我该怎么解决这个问题,可以不按照我的思路,球球了{:1_889:} url=url,data=data F12下断点,调试textName的编码过程,里面会有js代码,也许不是和你的猜测一样。 urllib.parse.quote(url) ? requests.post中的data参数可不只一个dict类型,还可以是str或bytes,你为什么不试试先手动把请求体转换为bytes后再发送请求呢? ccwuax 发表于 2022-1-19 20:37
urllib.parse.quote(url) ?
这个是urlencode,楼主这个是二进制形式,不一样 urllib.parse.urlencode(data) import requests
headers={...} //自填
data={...} //自填
url='' //自填
data=urllib.parse.urlencode(data) //后面不要加.encode('utf8')试试看
response=requests.post(url=url, headers=headers, data=data)
页:
[1]