requests 模拟multipart/formdata格式发送的post请求

以某登录论坛发帖为例

方式一:导入OrderedDict模块

from collections import OrderedDict
import requests
import re
session_req=requests.session()
#打开论坛
response01=session_req.get('http://47.107.178.45/phpwind/')
body=response01.content.decode('utf-8')
tokenid=re.findall('name="csrf_token" value="(.+?)"/>',body)[0]
print(tokenid)

get_param_data={'m':'u','c':'login','a':'dologin'}
form_data={
    'username':'test01',
    'password':'123456',
    'csrf_token':tokenid,
    'csrf_token':tokenid
}
headerinfos={
    'Accept':'application/json, text/javascript, */*; q=0.01',
    'X-Requested-With':'XMLHttpRequest',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
}

#登录论坛
response02=session_req.post(url='http://47.107.178.45/phpwind/index.php',
                        params=get_param_data,
                        data=form_data,
                        headers=headerinfos)
body=response02.content.decode('utf-8')
statu_id=re.findall('_statu=(.+?)"',body)[0]
# print(statu_id)

#登录后的跳转
get_param_data={'m':'u',
                'c':'login',
                'a':'welcome',
                '_statu':statu_id
                }

response03=session_req.get(url='http://47.107.178.45/phpwind/index.php',
                        params=get_param_data)

# #发帖
get_data={
    'c':'post',
    'a':'doadd',
    '_json':'1',
    'fid':'73'
}

form_data1=OrderedDict(
    [
        ('atc_title',(None,'newdream123')),
        ('atc_content',(None,'newdream123')),
        ('pid',(None,'')),
        ('tid',(None,'')),
        ('special',(None,'default')),
        ('reply_notice',(None,'1')),
        ('csrf_token',(None,tokenid))

    ]
)
response04=session_req.post(url='http://47.107.178.45/phpwind/index.php',
                        params=get_data,
                        headers=headerinfos,
                        files=form_data1)
print(response04.content.decode('utf-8'))

方式二:引入multipartformdata类

import requests
import re
session_req=requests.session()
#打开论坛
response01=session_req.get('http://47.107.178.45/phpwind/')
body=response01.content.decode('utf-8')
tokenid=re.findall('name="csrf_token" value="(.+?)"/>',body)[0]
print(tokenid)

get_param_data={'m':'u','c':'login','a':'dologin'}
form_data={
    'username':'test01',
    'password':'123456',
    'csrf_token':tokenid,
    'csrf_token':tokenid
}
headerinfos={
    'Accept':'application/json, text/javascript, */*; q=0.01',
    'X-Requested-With':'XMLHttpRequest',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}

#登录论坛
response02=session_req.post(url='http://47.107.178.45/phpwind/index.php',
                        params=get_param_data,
                        data=form_data,
                        headers=headerinfos)
body=response02.content.decode('utf-8')
statu_id=re.findall('_statu=(.+?)"',body)[0]
# print(statu_id)

#登录后的跳转
get_param_data={'m':'u',
                'c':'login',
                'a':'welcome',
                '_statu':statu_id
                }

response03=session_req.get(url='http://47.107.178.45/phpwind/index.php',
                        params=get_param_data)

# #发帖
class MultipartFormData(object):
    """multipart/form-data格式转化"""

    @staticmethod
    def format(data, boundary="----WebKitFormBoundary0AWyxfjzulY8IBvI", headers={}):
        """
        form data
        :param: data:  {"req":{"cno":"18990876","flag":"Y"},"ts":1,"sig":1,"v": 2.0}
        :param: boundary: "----WebKitFormBoundary0AWyxfjzulY8IBvI"
        :param: headers: 包含boundary的头信息;如果boundary与headers同时存在以headers为准
        :return: str
        :rtype: str
        """
        # 从headers中提取boundary信息
        if "content-type" in headers:
            fd_val = str(headers["content-type"])
            if "boundary" in fd_val:
                fd_val = fd_val.split(";")[1].strip()
                boundary = fd_val.split("=")[1].strip()
            else:
                raise Exception("multipart/form-data头信息错误,请检查content-type key是否包含boundary")
        # form-data格式定式
        jion_str = '--{}\r\nContent-Disposition: form-data; name="{}"\r\n\r\n{}\r\n'
        end_str = "--{}--".format(boundary)
        args_str = ""

        if not isinstance(data, dict):
            raise Exception('multipart/form-data参数错误,data参数应为dict类型')
        for key, value in data.items():
            args_str = args_str + jion_str.format(boundary, key, value)

        args_str = args_str + end_str.format(boundary)
        args_str = args_str.replace("\'", "\"")
        return args_str
form_data={
    'atc_title':'hello,world',
    'atc_content':'hello,world',
    'pid':'',
    'tid':'',
    'special':'default',
    'reply_notice':'1',
    'csrf_token':tokenid
}

get_data={
    'c':'post',
    'a':'doadd',
    '_json':'1',
    'fid':'73'
}

headerinfos={
    'Accept':'application/json, text/javascript, */*; q=0.01',
    'X-Requested-With':'XMLHttpRequest',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
    'Content-Type':'multipart/form-data; boundary=----WebKitFormBoundary0AWyxfjzulY8IBvI'
}

m = MultipartFormData.format(data=form_data,headers=headerinfos)


response04=session_req.post(url='http://47.107.178.45/phpwind/index.php',
                        headers=headerinfos,
                        params=get_data,
                        data=m)
print(response04.content.decode('utf-8'))
原文地址:https://www.cnblogs.com/lvhuayan/p/14880022.html