日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Python之路】特別篇

 highoo 2019-03-20

  文章所使用Python版本為py3.5

1.微信服務(wù)器返回一個會話ID

微信Web版本不使用用戶名和密碼直接登錄,而是采用二維碼登錄,所以服務(wù)器需要首先分配一個唯一的會話ID,用來標識當前的一次登錄。

通過查看網(wǎng)絡(luò)請求我們找到了這個 二維碼圖片代表的隨機字符串,(IcelandB9Entig==),

2.通過會話ID獲得二維碼

然后找到該隨機字符串的來源請求

請求方式為 GET形式 , 具體連接為:

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
&_=1492591577859

我們只需要改變最后一個變量 _值即可獲得新的字符串序列: (這個值是當前距離林威治標準時間的毫秒)可以自行構(gòu)造!

通過分割,我們就可以獲得隨機字符串,自己在前端頁面上構(gòu)造一個二維碼出來.

HomeHandle
前端二維碼頁面

3.輪詢手機端是否已經(jīng)掃描二維碼并確認在Web端登錄

當我們還沒進行掃碼登錄時,發(fā)現(xiàn)微信web網(wǎng)頁會自動向服務(wù)器 輪詢手機端是否已經(jīng)掃碼并且確認登錄!!

每一分鐘發(fā)送一次,如果沒有登錄,請求會返回

1
window.code=408;

掃碼后為

1
window.code=201;

確認登陸后為:

1
2
window.code=200;
window.redirect_uri="https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=A_ToQqd_AFXpsrLMH6RNgi3W@qrticket_0&uuid=we6XJEZYDg==&lang=zh_CN&scan=1492592531";

需要獲得其中的跳轉(zhuǎn)url,對rensponse進行分割后取得。

redirect_url = re.split('=', http_res_code.text, 2)[-1].strip().replace('"', '').replace(';', '')

4.訪問登錄地址,獲得uin和sid

在接下來的連接中,我們發(fā)現(xiàn)服務(wù)器發(fā)給了我們skey,sid,pass_ticket 的重要信息, 分析發(fā)現(xiàn)該請求的發(fā)送地址為: GET方式,

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=A_ToQqd_AFXpsrLMH6RNgi3W@qrticket_0&uuid=we6XJEZYDg==&lang=zh_CN&scan=1492592531
&fun=new&version=v2

發(fā)現(xiàn),該請求地址為 跳轉(zhuǎn)url + &fun=new&version=v2 構(gòu)造而成!

直接GET發(fā)送請求,我們就拿到返回信息,發(fā)現(xiàn)是 xml 格式的數(shù)據(jù)!

構(gòu)造一個方法方便獲取我們的連接信息

復制代碼
def auth_analysis(self,str_xml):
    '''
    xml中取出數(shù)據(jù),返回字典
    :param http_res_ticket:
    :return:
    '''
    from xml.etree import ElementTree as ET
    root = ET.XML(str_xml)
    ret = {}
    for child in root:
        ret[child.tag] = child.text
    return ret
復制代碼

我們還需要獲得該請求下的cookies參數(shù),直接通過requests模塊的  requests.cookies.get_dict()

復制代碼
# 獲取xml 登錄信息
user_ticket_url  = redirect_url+ '&fun=new&version=v2'
user_xml_ticket = requests.get(user_ticket_url)

TICKET_COOKIR = user_xml_ticket.cookies.get_dict()
ALL_COOKIE_DICT.update(TICKET_COOKIR)       #記錄cookies

# 獲取xml中信息
user_ticket_dic = self.auth_analysis(user_xml_ticket.text)
USER_RESULT_DICT.update(user_ticket_dic)      #記錄xml中的具體信息
復制代碼

5.初使化微信信息

# 初始化Url :
USER_INIT_URL = 'https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?pass_ticket={0}&skey={1}&r={2}'

pass_ticket,skey為上一步驟獲得的xml信息樹中,r為時間戳

View Code

這一步的發(fā)送請求,使用了urllib.requests來發(fā)送,注意格式轉(zhuǎn)換!

此時我們已經(jīng)獲得了服務(wù)端返回的部分數(shù)據(jù).如果需要進一步獲取全部信息,......如下

6.獲得所有的好友列表

該請求返回了全部的用戶信息.

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?
pass_ticket=YK57xcgn4qT0n0qoGtxvtLvsV6XXzTDka7Z9DOFAIcGDK0wtZ6GrNpGdHGIHKiiu
&r=1492592546748
&seq=0
&skey=@crypt_8226323c_fd634988b8e43769cb3b7b9fc99ca549

構(gòu)造請求并發(fā)送:

獲得所有信息的handler

7.保持與服務(wù)器的信息同步

與服務(wù)器保持同步需要在客戶端做輪詢,該輪詢的URL如下:

復制代碼
https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck?
r=1492594498787
&skey=%40crypt_8226323c_fd634988b8e43769cb3b7b9fc99ca549
&sid=mM%2BFZGbHxGcO3x93
&uin=976834800
&deviceid=e738560216565557
&synckey=1_661566297%7C2_661566394%7C3_661565574%7C11_661566180%7C13_661374753%7C201_1492594315%7C203_1492582669%7C1000_1492594202%7C1001_1492563271
&_=1492592515065
復制代碼

skey,sid,uin,與上面步驟的值相對應(yīng)此處的synkey是上步步驟獲得的同步鍵值,但需要按一定的規(guī)則組合成以下的字符串:

1_124125|2_452346345|3_65476547|1000_5643635 

合成synckey

| 被URL編碼成%7C,通過對上面的地址發(fā)送請求:,

1
res_sync = requests.get(synccheck_url,params=payloads,cookies = ALL_COOKIE_DICT)

會返回如下的字符串:

1
window.synccheck={retcode:"0",selector:"0"}

當有人發(fā)送信息給你時, :

1
window.synccheck={retcode:"0",selector:"2"}

8.獲得別人發(fā)來的消息

我們通過該URL地址獲取發(fā)送給我們的消息:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?
sid=XQvf1MmZ7W8O2BU2
&skey=@crypt_75efaa00_3afa77c01d45461eef7eac88da37f70d
&pass_ticket=YArFw%252BDpJHCpRtKCTTabpe2ytETBDmYsp%252BB7ywe%252BtplmzxQZ6ohX7d14sJgjgk6T

制造相應(yīng)的payload 發(fā)送GET請求,獲得返回response數(shù)據(jù)

View Code

9.向用戶發(fā)送消息

用戶主動發(fā)送消息,通過以下的URL地址:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg
?pass_ticket=mRfzOKMZdUAfqrZVaT7VZeroYNX6SgTtO7WzDwDXmiZvwWC0iWlln2fBuGa8oeld

上面的pass_ticket參數(shù)不再解釋了,訪問該URL采用POST方式,payload如以下的格式:

View Code

  BaseRequest都是授權(quán)相關(guān)的值,與上面的步驟中的值對應(yīng),Msg是對消息的描述,包括了發(fā)送人與接收人,消息內(nèi)容,消息的類型(1為文本),ClientMsgId和LocalID由本地生成。rr可用當前的時間。在返回JSON結(jié)果中BaseResponse描述了發(fā)送情況,Ret為0表示發(fā)送成功。

 

 

注意:

該流程在py3環(huán)境下,使用了Tornado框架 和 requests 包 和 urllib.requests 包

urllib.requests 包 具體用法參考如下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# payload 轉(zhuǎn)換成bytes
data = (json.dumps(payload)).encode()
request = urllib.request.Request(url=user_init_url, data=data)
request.add_header(
    'ContentType', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
# 獲得數(shù)據(jù)
data = response.read()
obj = json.loads(data.decode('utf-8'))
# 保存數(shù)據(jù)
INIT_RESULT_DICT.update(obj)

  

完整參考代碼:

app.py
Handler
index.html
contact_list.html

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約