微信web常用接口

因为项目需要,我用python研究了基于http的微信接口。

其实,常用的接口,各大社区和论坛都有详细的介绍和说明了,在这些有不提了。

我说下,发送图片的功能。

首先,发送图片的思想是,先把图片上传到微信服务器上,服务器返回MediaId,接着调发送信息接口。

详细:

    1.图片上传到微信服务器:

    url:https://file2.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json

    python代码:

# 上传图片到微信服务器上
def webwxuploadmedia(image_name,cookie):
    global media_count
    # print('-----cookie------->>'+cookie)
    url = 'https://file2.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json'
    # 计数器
    media_count = media_count + 1
    # 文件名
    file_name = image_name
    # MIME格式
    # mime_type = application/pdf, image/jpeg, image/png, etc.
    mime_type = mimetypes.guess_type(image_name, strict=False)[0]
    # 微信识别的文档格式,微信服务器应该只支持两种类型的格式。pic和doc
    # pic格式,直接显示。doc格式则显示为文件。
    media_type = 'pic' if mime_type.split('/')[0] == 'image' else 'doc'
    # 上一次修改日期
    lastModifieDate = 'Thu Mar 17 2017 00:55:10 GMT+0800 (CST)'
    # 文件大小
    file_size = os.path.getsize(file_name)
    # PassTicket
    # pass_ticket = pass_ticket
    # clientMediaId
    client_media_id = str(int(time.time() * 1000)) + \
        str(random.random())[:5].replace('.', '')
    # webwx_data_ticket
    webwx_data_ticket = ''
    # for item in cookie:
    #     if item.name == 'webwx_data_ticket':
    #         webwx_data_ticket = item.value
    #         break
    # if (webwx_data_ticket == ''):
    #     return "None Fuck Cookie"

    uploadmediarequest = json.dumps({
        "BaseRequest": BaseRequest,
        "ClientMediaId": client_media_id,
        "TotalLen": file_size,
        "StartPos": 0,
        "DataLen": file_size,
        "MediaType": 4
    }, ensure_ascii=False).encode('utf8')

    multipart_encoder = MultipartEncoder(
        fields={
            'id': 'WU_FILE_' + str(media_count),
            'name': file_name,
            'type': mime_type,
            'lastModifieDate': lastModifieDate,
            'size': str(file_size),
            'mediatype': media_type,
            'uploadmediarequest': uploadmediarequest,
            'webwx_data_ticket': webwx_data_ticket,
            'pass_ticket': pass_ticket,
            'filename': (file_name, open(file_name, 'rb'), mime_type.split('/')[1])
        },
        boundary='-----------------------------1575017231431605357584454111'
    )

    headers = {
        'Host': 'file2.wx.qq.com',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        'Accept-Encoding': 'gzip, deflate',
        'Referer': 'https://wx2.qq.com/',
        'Content-Type': multipart_encoder.content_type,
        'Origin': 'https://wx2.qq.com',
        'Connection': 'keep-alive',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache'
    }

    r = requests.post(url, data=multipart_encoder, headers=headers)
    # r = urllib.request.Request(url, data=multipart_encoder, headers=headers)
    response_json = r.json()
    if response_json['BaseResponse']['Ret'] == 0:
        return response_json
    return None

参数说明:

   cookie:http.cookiejar.CookieJar()

    BaseRequest: {
        'Uin': int(wxuin),
        'Sid': wxsid,
        'Skey': skey,
        'DeviceID': deviceId,
    }

 

返回数据:

{
"BaseResponse": {
"Ret": 1,
"ErrMsg": ""
}
,
"MediaId": "XXXXXXXXXXXXXXXXXXXX看起来想乱码的东西",
"StartPos": 13243,
"CDNThumbImgHeight": 34,
"CDNThumbImgWidth": 42
}

2.发送图片

# 发送图片
def webwxsendmsgimg(MyUserName, ToUserName, media_id):
    url = 'https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg?fun=async&f=json&pass_ticket=%s' % (pass_ticket)
    clientMsgId = str(int(time.time() * 1000)) + \
            str(random.random())[:5].replace('.', '')
    data_json = {
        "BaseRequest": BaseRequest,
        "Msg": {
            "Type": 3,
            "MediaId": media_id,
            "FromUserName": MyUserName,
            "ToUserName": ToUserName,
            "LocalID": clientMsgId,
            "ClientMsgId": clientMsgId
        }
    }
    headers = {'content-type': 'application/json; charset=UTF-8'}
    data = json.dumps(data_json, ensure_ascii=False).encode('utf8')
    r = urllib.request.Request(url, data=data, headers=headers)
    # r = requests.post(url, data=data, headers=headers)
    dic = r.json()
    return dic['BaseResponse']['Ret'] == 0

参数说明:

   media_id:上传图片成功返回的数据

    BaseRequest: {
        'Uin': int(wxuin),
        'Sid': wxsid,
        'Skey': skey,
        'DeviceID': deviceId,
    }

     先看,获取好友列表返回的一条数据:

{'PYQuanPin': 'test22', 'EncryChatRoomId': '', 'KeyWord': '', 'ChatRoomId': 0, 'MemberList': [], 'Sex': 0, 'City': '', 'OwnerUin': 0, 'SnsFlag': 0, 'Uin': 0, 'Province': '', 'HideInputBarFlag': 0, 'StarFriend': 0, 'AttrStatus': 0, 'Alias': '', 'Statues': 1, 'Signature': '', 'MemberCount': 0, 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=657299195&username=@@af75b2f842c9805c8263ebed075e0623d5113d0e1790ea7a2663992220de03fe&skey=@crypt_5dd98d25_c7d4661fb1a13d196200f0eab0e004ee', 'NickName': 'test22', 'UserName': '@@af75b2f842c9805c8263ebed075e0623d5113d0e1790ea7a2663992220de03fe', 'PYInitial': 'TEST22', 'UniFriend': 0, 'RemarkPYQuanPin': '', 'IsOwner': 1, 'RemarkName': '', 'VerifyFlag': 0, 'AppAccountFlag': 0, 'RemarkPYInitial': '', 'DisplayName': '', 'ContactFlag': 3}
 

    MyUserName:这里的参数MyUserName是自己信息中的'UserName'

    ToUserName:ToUserName你要发送好友信息中的'UserName'

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/hsl520/blog/891157

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值