1. 程式人生 > >Python學習---模擬微信網頁登錄180410

Python學習---模擬微信網頁登錄180410

link 符號 byod 分析 字符 uid order ons tro

WEB微信

網頁登錄的猜想:

a. 訪問頁面出現二維碼

b. 長輪詢監聽是否已經掃碼並且點擊確認

c. 如何進行會話保持

d. 如何獲取用戶列表

e. 如何發送消息(接收消息)

過程:訪問微信官網[https://wx.qq.com/] --> 打開微信[已登錄]掃一掃 --> 掃描網頁圖片

技術分享圖片

App內獲取數據都是通過RUL進行獲取的

長輪詢: 發送一次請求後,就一直在等待消息的返回,如果超過規定時間後,就結束該請求,發送下次的請求。

輪 詢: 定時的不停的交替的發送請求到服務器,不等待消息的返回

技術分享圖片

註:pending:表示一直在進行中的請求

二維碼分析

獲取二維碼:

二維碼的URL:

   https://login.weixin.qq.com/qrcode/{0} 

生成二維碼的URL:

https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1523003695511 

長輪詢的URL【監聽是否掃碼的URL】:

https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=AY0FL0UZwA==&tip=1&r=1700853510&_=1523012536082 

二維碼組成:

技術分享圖片

生成二維碼的URL

技術分享圖片

監聽後臺是否掃描二維碼的URL:

長輪詢的URL【Ajax請求】:

https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=AY0FL0UZwA==&tip=1&r=1700853510&_=1523012536082 

技術分享圖片

狀態碼分析

狀態碼 # 201: 掃碼,未確認

# 200: 掃碼,確認

# 408: pengding請求結束

# 400: pending中

技術分享圖片

技術分享圖片

技術分享圖片

消息接收分析

獲取pass_ticket請求URL:

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ATsWUC3qlrRteYUWzz_8hBMH@qrticket_0&uuid=QY2NxTcDcw==&lang=zh_CN&scan=1523018755&fun=new&version=v2&lang=zh_CN 

獲取一個票據【內有pass_ticket憑據】

 <error> 
	<ret>0</ret> 	
	<message></message> 	
	<skey>@crypt_317889ae_68dfe71ead4387706d86b05e68a8c467</skey> 	
	<wxsid>/QEleZmXf4vzAkHb</wxsid> 	
	<wxuin>1466456560</wxuin>       
	<pass_ticket>cDQsACmeE%2FDaGGJHEHywz</pass_ticket> 	
	<isgrayscale>1</isgrayscale> 	
</error> 

用戶初始化:登錄並且獲取最近聯系人以及公眾號

用戶初始化URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1687552055&lang=zh_CN&pass_ticket=eSd509Kzdhcw4%252BDOYB7s0iV8ik2D%252FxYdOL5fwTSm9cvAaa7sLxZoz3mE88unS4sT 

獲取聯系人列表【Ajax請求】:每個人的用戶唯一ID,用戶名

獲取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=iH0mJhfpq1FrP44X18ovjrVFJfYqEszXSXGuuknxYJ4MATxoaFuPys&r=152302957&seq=0&skey=@crypt_29c62c055f8ff7e6d66c2fa05fb7 

發送或接受消息:

獲取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=WGuxtLFLPXUiXteMkgmTmSeq5BPUJlEdXk92%252FtnYEGnj3fnB8K3%252ByODprlQBNC9u 

Pass_ticket

技術分享圖片

用戶初始化:

用戶初始化URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1687552055&lang=zh_CN&pass_ticket=eSd509Kzdhcw4%252BDOYB7s0iOL5fwTSm9cvAaaE88unS4sT 

註意:這裏的請求Request_payload代表的就是JSON請求

技術分享圖片

獲取聯系人列表:

獲取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=iH0mJhfpq1FrP44X18ovjrVFJfYqEszXSXGuuknxYJ4MATxoaFuPys&r=152302957&seq=0&skey=@crypt_29c62c055f8ff7e6d66c2fa05fb7 

技術分享圖片

接受消息的狀態碼:

技術分享圖片

消息接收:

技術分享圖片

發送消息:

技術分享圖片

技術分享圖片

解決發送消息中文亂碼問題:

技術分享圖片

【輔助學習】Python學習---Django的request.post源碼分析

中文亂碼問題解決:方案一:

form_data = {
    ‘BaseRequest‘: {
        ‘DeviceID‘: ‘e531777446530354‘,
        ‘Sid‘: TICKET_DICT[‘wxsid‘],
        ‘Skey‘: TICKET_DICT[‘skey‘],
        ‘Uin‘: TICKET_DICT[‘wxuin‘]
    },
    ‘Msg‘: {
        "ClientMsgId": str(time.time()),
        # "Content": ‘%(content)s‘,   # 方案二用
        "Content": msg,  # 方案一直接傳遞內容
        "FromUserName": from_user_id,
        "LocalID": str(time.time()),
        "ToUserName": to_user_id,
        "Type": 1
    },
    ‘Scene‘: 0
}
import json
form_data_str = json.dumps(form_data, ensure_ascii=False)
form_data_bytes = bytes(form_data_str, encoding=‘utf-8‘)
all_cookie_dict = {}
all_cookie_dict.update(LOGIN_COOKIE_DICT)
all_cookie_dict.update(TICKET_COOKIE_DICT)
# 因為我們data發送的字符串,但是微信用的是JSON格式,所以我們需要自己添加請求頭
# 告訴服務器,我發送的是data數據,且是以JSON格式發送  ==》 等價於發送了JSON格式數據
# requests.post(url, json={‘key‘:‘value"})  ==> requests.post(url, data={‘key‘:‘value"} ,headers={‘Content-Type‘: ‘application/json‘})
response = requests.post(send_url, data=form_data_bytes, cookies=all_cookie_dict, headers={
    ‘Content-Type‘: ‘application/json‘})

中文亂碼問題解決:方案二:

form_data = {
    ‘BaseRequest‘: {
        ‘DeviceID‘: ‘e531777446530354‘,
        ‘Sid‘: TICKET_DICT[‘wxsid‘],
        ‘Skey‘: TICKET_DICT[‘skey‘],
        ‘Uin‘: TICKET_DICT[‘wxuin‘]
    },
    ‘Msg‘: {
        "ClientMsgId": str(time.time()),
        "Content": ‘%(content)s‘,   # 方案二用
        # "Content": msg, # 方案一用
        "FromUserName": from_user_id,
        "LocalID": str(time.time()),
        "ToUserName": to_user_id,
        "Type": 1
    },
    ‘Scene‘: 0
}
import json
# form_data_str是字符串
form_data_str = json.dumps(form_data)
# 字符串進行格式化
form_data_str = form_data_str % {‘content‘: msg}  # content是上面字典中的占位符號
# 字符串轉換成字節
form_data_bytes = bytes(form_data_str, encoding=‘utf-8‘)
all_cookie_dict = {}
all_cookie_dict.update(LOGIN_COOKIE_DICT)
all_cookie_dict.update(TICKET_COOKIE_DICT)
# 因為我們data發送的字符串,但是微信用的是JSON格式,所以我們需要自己添加請求頭
# 告訴服務器,我發送的是data數據,且是以JSON格式發送  ==》 等價於發送了JSON格式數據
# requests.post(url, json={‘key‘:‘value"})  ==> requests.post(url, data={‘key‘:‘value"} ,headers={‘Content-Type‘: ‘application/json‘})
response = requests.post(send_url, data=form_data_bytes, cookies=all_cookie_dict, headers={
    ‘Content-Type‘: ‘application/json‘})

【輔助學習】Python學習---JSON補充內容[中文編碼 + dumps解析]

微信接收消息

接收消息的URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=PdtuiorPozsWH4r3&skey=@crypt_29bab75e_c405fdf274568e5d5cb96e945449d5bc&pass_ticket=FqGrU0jBkvsmxIRa%252BtbaI8eUWScVv3DKAIAQrHoVLOYJ73AInLYuzs097cDgr4iR

檢查接收消息類型URL:

https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=1523357524934&skey=%40crypt_29bab75e_c405fdf274568e5d5cb96e945449d5bc&sid=PdtuiorPozsWH4r3&uin=1600696821&deviceid=e262718862528046&synckey=1_683967369%7C2_683969564%7C3_683969533%7C11_683969510%7C201_1523357498%7C1000_1523351282%7C1001_1523351354%7C2001_1523351252%7C2002_1523332191&_=1523355846860

技術分享圖片

技術分享圖片

技術分享圖片

無法獲取用戶列表問題解決:

技術分享圖片

技術分享圖片

Web微信二維碼的實現

技術分享圖片

更多參考

Python學習---模擬微信網頁登錄180410