没有细胞的人 发表于 2022-1-19 18:59

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:}

青山绿水meng 发表于 2022-1-19 19:11

url=url,data=data

howsk 发表于 2022-1-19 19:25

F12下断点,调试textName的编码过程,里面会有js代码,也许不是和你的猜测一样。

ccwuax 发表于 2022-1-19 20:37

urllib.parse.quote(url) ?

thepoy 发表于 2022-1-19 20:39

requests.post中的data参数可不只一个dict类型,还可以是str或bytes,你为什么不试试先手动把请求体转换为bytes后再发送请求呢?

qianshang666 发表于 2022-1-20 08:00

ccwuax 发表于 2022-1-19 20:37
urllib.parse.quote(url) ?

这个是urlencode,楼主这个是二进制形式,不一样

ligxi 发表于 2022-1-20 11:50

urllib.parse.urlencode(data)

ligxi 发表于 2022-1-20 11:56

import requests
headers={...} //自填
data={...} //自填
url='' //自填
data=urllib.parse.urlencode(data) //后面不要加.encode('utf8')试试看
response=requests.post(url=url, headers=headers, data=data)
页: [1]
查看完整版本: Python post发送数据的编码问题