這幾天在用python寫了一個模擬登陸web微信,發送和接受信息的程序。發現步驟不多,但需要的參數太多了
整個過程中,務必保證session、headers、cookie一致,不然的話,中間會出現登陸異常。
把流程和細節分享出來
第一步:登陸
1、get訪問微信首頁https://wx.qq.com
提供session、headers
用途:獲取cookie
后續訪問必須帶session、headers、cookie這三個參數,並保持不變
2、get訪問https://wx.qq.com/jslogin
get參數分別是
appid:值為自定義,格式為wx782c26e4c19acffb
fun:值為new
lang:值為en_us
redirect_uri:值為https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage
_:值為當前時間戳
完整的URL例子https://wx2.qq.com/jslogin?redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&appid=wx782c26e4c19acffb&lang=en_US&_=1485065568&fun=new
用途:獲取二維碼uuid
3、get訪問https://wx.qq.com/qrcode/{{uuid}}
例子:https://wx2.qq.com/qrcode/AfdK5U5qyw==
用途:下載和展示二維碼
4、掃碼和確認,訪問https://wx.qq.com/cgi-bin/mmwebwx-bin/login,
get參數
loginicon:值必須為true
uuid:值為{{uuid}}
r:值為當前時間戳/1524
_:值為當前時間戳
完整的URL例子:https://wx2.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=AacJ62nlRg==&tip=0&r=-974452&_=1485065779
用途:返回登陸狀態,登陸成功之后的redirect_uri
返回狀態碼說明如下:
200,掃碼和確認成功
201,掃碼,未確認
其他,未掃碼或者其他原因
第二步、初始化頁面和獲取登陸信息
1、get訪問{{redirect_uri}}
完整的URL例子:https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=A0k1PKCiAX8_8nyisAG0R9d5@qrticket_0&uuid=AacJ62nlRg==&lang=en_US&scan=1485065793
用途:返回登陸認證等信息,一個字典類型的json格式,下文用login_info表示
2、post訪問https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=【當前時間戳】
post參數為
BaseRequest:通過1返回參數獲取值
例子:{"BaseRequest": {"DeviceID": "uKUD8e%2Bp7iXqNpbOuPTntL7OdbsfxEv5JdQjKtb7Mc%2FVQK2leE%2BRrNVkI5fQZZjB", "Sid": "xkQE8IoFPjwXEf2W", "Uin": "575635712", "Skey": "@crypt_2b05caf0_2290c785d1bc5646d2ff0ff771ec3324", "isgrayscale": "1"}}
用途:返回微信用戶信息、第一頁好友信息、和BaseRequest、最新聊天信息等等
第三步、獲取好友信息
get訪問https://wx.qq.com/webwxgetcontact
get參數
r:值為當前時間戳
seq:值為0
skey:值為login_info[Skey]
完整的URL例子:https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?r=1485065800&seq=0&skey=@crypt_2b05caf0_2290c785d1bc5646d2ff0ff771ec3324
用途:返回所有的好友信息,字典json格式
有用的好友信息字段說明:
Sex:1表示男,2表示女,0為其他【沒有設置性別的好友、公眾號、群、系統賬號等等】
UserName,微信系統為每個微信號分配一個唯一號碼,開頭@@表示群、字母或者數字開頭表示系統賬號,其他【公眾號、好友等】以單@開頭
NickName,個人設置的昵稱,重復可能性很大
Alias,微信號,如果沒有設置為空,不會出現重復
第四步、接受和發送新信息
1、接受信息
1)、定時檢查是否有新信息
get訪問https://{{sync_url}}/synccheck
get參數是:
'r' : 當前時間戳*1000
'skey' : login_info[skey]
'sid' : login_info[sid]
'uin' : login_info[uin]
'deviceid' : login_info[deviceid]
'synckey' : login_info[synckey]
'_' : 當前時間戳*1000
完整的URL例子:https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck?deviceid=e565817597249768&synckey=List_%5B%7B%27Key%27%3A+1%2C+%27Val%27%3A+645531166%7D%2C+%7B%27Key%27%3A+2%2C+%27Val%27%3A+645531276%7D%2C+%7B%27Key%27%3A+3%2C+%27Val%27%3A+645531125%7D%2C+%7B%27Key%27%3A+1000%2C+%27Val%27%3A+1485058018%7D%5D%7CCount_4&skey=%40crypt_2b05caf0_2290c785d1bc5646d2ff0ff771ec3324&sid=xkQE8IoFPjwXEf2W&r=1485065802608&_=1485065802608&uin=575635712
用途:返回最新信息數,0表示沒有新消息
2)、獲取新信息內容,post訪問https://wx.qq.com/webwxsync?sid=login_info[sid]&skey=login_info[skey]&lang=en_US&pass_ticket=login_info[pass_ticket]
post參數為
'BaseRequest' : login_info[BaseRequest]
'SyncKey' : login_info[SyncKey]
'rr' :~當前時間戳*1000
例子:{"rr": -1485065809, "BaseRequest": {"Ret": 0, "ErrMsg": ""}, "SyncKey": {"List": [{"Key": 1, "Val": 645531166}, {"Key": 2, "Val": 645531278}, {"Key": 3, "Val": 645531125}, {"Key": 11, "Val": 645531260}, {"Key": 13, "Val": 645524153}, {"Key": 201, "Val": 1485065810}, {"Key": 203, "Val": 1485064747}, {"Key": 1000, "Val": 1485058018}, {"Key": 1001, "Val": 1485057992}, {"Key": 1002, "Val": 1485058221}, {"Key": 1004, "Val": 1484911834}], "Count": 11}}
完整的URL例子:https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=xkQE8IoFPjwXEf2W&skey=@crypt_2b05caf0_2290c785d1bc5646d2ff0ff771ec3324&lang=en_US&pass_ticket=uKUD8e%2Bp7iXqNpbOuPTntL7OdbsfxEv5JdQjKtb7Mc%2FVQK2leE%2BRrNVkI5fQZZjB
用途:返回最新信息列表
注意:群信息的發送者放在Content開頭部分
2、發送信息
post訪問https://wx.qq.com/webwxsendmsg
post參數
'BaseRequest': self.base_request,
'Msg': {
'Type': login_info[BaseRequest],
'Content': content,
'FromUserName': 自己的username,
'ToUserName': 發送的username,
'LocalID': int(time.time() * 1000 * 1000 * 10),
'ClientMsgId': int(time.time() * 1000 * 1000 * 10),
},
'Scene' : 0
返回發送結果json字典
有錯誤之處,請指教