因为项目需要,我用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'