requests(五) - 發送 form-data 格式的 http 請求


聲明:

本文來自檸檬班py30期學員,處理公司接口請求時遇到的問題及相應的解決方案。

以本文作為記錄,方便其它學員遇到類似問題時,可以參考解決。

 

背景

嘗試用python語言的requests庫,編寫腳本登陸公司的APP。

 

遇到的問題

問題1:

       將手機號、密碼數據傳入后,始終登陸不成功,經過與開發溝通后知道需要簽名才能登陸。

問題2:

       簽名算法寫好后仍然無法登陸成功。

      通過后台日志發現是傳入數據格式不正確導致的,公司的post接口入參方式為form-data , 而我是用json串的方式入參的。

 

解決方案中涉及到的知識點

 

1、簽名時需要的時間戳

import time

t = time.time()

print (t)            #原始時間數據

print (int(t))          #秒級時間戳

print (int(round(t * 1000)))   #毫秒級時間戳

print (int(round(t * 1000000))) #微秒級時間戳

# 取出來的時間戳想驗證時間是否正確,可以百度(https://tool.lu/timestamp/)在線時間戳工具轉換看看

 


2、簽名時需要的MD5加密

import hashlib
data = “待加密數據”
m = hashlib.md5(data)

 

Tips:

如遇報錯:Unicode-objects must be encoded before hashing

解決方法:

此處必須為encode,但是python3此處默認為unicode,所以修改如下:

 hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()

注:編碼方式有很多種,此處用UTF-8編碼舉例,實際中可按照編碼不同自己選擇

 


3、發送http請求時,以form-data的格式作為requests的參數

使用requests的requests_toolbelt模塊 ,需要自行安裝。

from requests_toolbelt import MultipartEncoder
import requests

m = MultipartEncoder(
    fields={'field0': 'value',
           'field1': 'value',
            'field2': ('文件名稱', open('文件地址/file.py', 'rb'), 'text/plain')}
    )

r = requests.post('http://httpbin.org/post',
                  data=m,
                  headers={'Content-Type': m.content_type})

 

requests官方網站地址:https://www.osgeo.cn/requests/user/quickstart.html#more-complicated-post-requests

requests_toolbelt官方網站地址:https://toolbelt.readthedocs.io/en/latest/user.html

 

 

最終處理代碼

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM