zoukankan      html  css  js  c++  java
  • requests发送multipart/form-data请求(文件)

    在写爬虫有时候会发现这种请求数据,其实就是一个上传图片的请求。
    
    
    def send_file(user,user_key,tousername,file,cookice):
        '''
        发送文件表情之类
        :param user: 发送消息的用户 [{'FromUserName':FromUserName,'Content':Content}]
        :param user_key: 当前登录用户的凭证信息
        :param tousername:
        :param file: 文件地址
        :param cookice:
        :return:
        '''
    
        filename = os.path.basename(file)
        stime = time.asctime( time.localtime(time.time())).split(' ')
        stime.insert(4,stime[-1])
        stime[-1] = 'GMT+0800'
        stime = ' '.join(stime)
        m1 = hashlib.md5()
        with open(file,'rb') as f:
            m1.update(f.read())
        md5 = m1.hexdigest()
    
        size = os.path.getsize(file)
    
        json_data = {
            "BaseRequest":
                {
                    "Uin": user_key['wxuin'],
                    "Sid": user_key['wxsid'],
                    "Skey": user_key['skey'],
                    "DeviceID": "e823192381686302"
                },
            "ClientMediaId": int(time.time() * 1000),
            "TotalLen": size,
            "StartPos": 0,
            "DataLen": size,
            "MediaType": 4,
            "FromUserName": user['UserName'],
            "ToUserName": tousername,
            "FileMd5": md5
        }
    
        file_headers_1 = {
            'id':(None,'WU_FILE_0'),
            'name':(None,filename),
            'type':(None,'image/gif'),
            'lastModifiedDate':(None,stime),
            'size':(None,str(size)),
            'mediatype':(None,'doc'),
            'uploadmediarequest':(None,json.dumps(json_data,ensure_ascii=False)),
            'webwx_data_ticket':(None,cookice.get('webwx_data_ticket')),
            'pass_ticket':(None,user_key['pass_ticket']),
            'filename':(filename, open(file, 'rb'),'image/gif'),
            'Content-Type':'image/gif',
        }
        multipar_encoder = MultipartEncoder(fields=file_headers_1,boundary='---------------------------22619409317427')
    
    
        url = 'https://file.wx2.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json'
        headers ={
            'Host': 'file.wx2.qq.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
            'Accept': '*/*',
            '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, br',
            'Referer': 'https://wx2.qq.com/',
            'Content-Type': multipar_encoder.content_type,
            'Origin': 'https://wx2.qq.com',
        }
    
        res = requests.post(url,cookies=cookice,data=multipar_encoder,headers=headers)
        mediaid = res.json().get('MediaId')
    
        baseurl = 'https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendemoticon?fun=sys&lang=zh_CN&pass_ticket=pass_ticket={0}'
        sendurl = baseurl.format(user_key['pass_ticket'])
        ctime = int(time.time() * 10000000)
        send_data = {"BaseRequest":
                         {"Uin": user_key['wxuin'], "Sid": user_key['wxsid'], "Skey": user_key['skey'],
                          "DeviceID": "e823192381686302"},
                     "Msg":
                         {"Type": 47, "FromUserName": user['UserName'],
                          "EmojiFlag":2,
                          "MediaId":mediaid,
                          'ClientMsgId':ctime,
                          'LocalID':ctime,
                          "ToUserName": tousername,},
                     "Scene": 0}
        send_res = requests.post(sendurl, json=send_data,cookies=cookice).json()
    return send_res
  • 相关阅读:
    LeetCode 1122. Relative Sort Array (数组的相对排序)
    LeetCode 46. Permutations (全排列)
    LeetCode 47. Permutations II (全排列 II)
    LeetCode 77. Combinations (组合)
    LeetCode 1005. Maximize Sum Of Array After K Negations (K 次取反后最大化的数组和)
    LeetCode 922. Sort Array By Parity II (按奇偶排序数组 II)
    LeetCode 1219. Path with Maximum Gold (黄金矿工)
    LeetCode 1029. Two City Scheduling (两地调度)
    LeetCode 392. Is Subsequence (判断子序列)
    写程序判断系统是大端序还是小端序
  • 原文地址:https://www.cnblogs.com/wtil/p/10081369.html
Copyright © 2011-2022 走看看