wtil

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

 

分类:

技术点:

相关文章: