【工作日记11】python+post

    技术2024-11-05  17

    继昨天的POST请求返回值不一致的问题,今天又被卡了挺久,不知道排查的思路,后面同事提醒了下,进行抓包看看构造出来的POST请求发的数据是否和web端发出的post请求是一样的。

    使用wireshark对web端发送的POST请求和使用python构造的post请求 分别抓包,结果如下:

    如图:

    左边为web端发送的,右边自己构造的。可以看出,主要的不同点就是post数据那一块。

    发现是数据那块的问题,那就尝试使用不同的方法处理数据,因为这个数据是json格式的,所以搜了下处理json格式的库,

    之前是这么干的:

      url = 'http://%s/cgi-bin/fat_ap.cgi'%ip     headers = {         "POST":"/cgi-bin/fat_ap.cgi HTTP/1.1",         "Host":"%s"%ip,         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',         'Accept': 'application/json, text/plain, */*',         'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',         'Accept-Encoding': 'gzip, deflate',         'Content-Type': 'application/json',         'Access-Control-Allow-Headers': '*',         'Content-Length':'77',         'Origin': 'http://192.23.35.2',         'Connection': 'close',         'Referer': 'http://192.23.35.2/index.html'     }     values = {         "opr":"login",         "account":"admin",         "passwd":"%s"%password_md5     }     values = json.dumps(values)     print(url,values,headers)     data = urllib.parse.quote_plus(values).encode('utf-8')     request = urllib.request.Request(url, data, headers)     html = urllib.request.urlopen(request).read().decode('utf-8')     print(html)

    数据values使用json.dumps将字典形式的数据转化为字符串,再使用urllib库。

    尝试换个库,使用requests库:

      url = 'http://%s/cgi-bin/fat_ap.cgi'%ip     headers = {         "POST":"/cgi-bin/fat_ap.cgi HTTP/1.1",         "Host":"%s"%ip,         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',         'Accept': 'application/json, text/plain, */*',         'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',         'Accept-Encoding': 'gzip, deflate',         'Content-Type': 'application/json',         'Access-Control-Allow-Headers': '*',         'Content-Length':'77',         'Origin': 'http://192.23.35.2',         'Connection': 'close',         'Referer': 'http://192.23.35.2/index.html'     }     values = {         "opr":"login",         "account":"admin",         "passwd":"%s"%password_md5     } "     values = json.dumps(values)     print(url,values,headers)     data = urllib.parse.quote_plus(values).encode('utf-8')     request = urllib.request.Request(url, data, headers)     html = urllib.request.urlopen(request).read().decode('utf-8')     print(html) "     values = json.dumps(values)     html =requests.post(url, values , headers)     print(html)

    其余不变,就把使用requests.post库,还不用另外编码解码,发送之后发现终于是想要的效果了。

    这两者的区别到底是啥呢?哪位大佬指导指导。

    区别可参考:https://www.cnblogs.com/liuchaodada/p/12050745.html

    看完区别,总体就是requests是对urllib的再次封装,使用更便捷,所以按理来说urllib应该也能实现相同的效果,可以之后尝试以下,方法可以参考https://www.cnblogs.com/php-linux/p/8818436.html

    Processed: 0.011, SQL: 9