怎么登陸qq空間 扣扣空間登錄的方法


怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
前言
我們添加一個模擬登錄QQ空間的例子~,讓我們愉快地開始吧~
開發工具
Python版本:3.6.4
相關模塊:
requests模塊;
pycryptodome模塊;
以及一些Python自帶的模塊 。
環境搭建
安裝Python并添加到環境變量,pip安裝需要的相關模塊即可 。
原理簡介
這里,我們簡單介紹下模擬登錄QQ空間的原理 。一般地,QQ空間可以通過手機QQ掃碼登錄和賬號密碼登錄 。但是賬號密碼登錄有時候需要驗證碼,為了保證登錄的成功率,我們選擇掃碼登錄的方式 。
首先,進入登錄界面:
‘https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https://qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=手機QQ空間&pt_qr_link=https://z.qzone.com/download.html&self_regurl=https://qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=https://z.qzone.com/download.html&pt_no_auth=0’
復制代碼
簡單抓包可以發現二維碼登錄的接口很可能是這個(ptqrlogin看著就像是二維碼登錄):

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
看下請求這個鏈接需要哪些參數吧:

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
測試一下,可以發現大部分參數是固定的,即:
u1:https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone
ptredirect: 0
h: 1
t: 1
g: 1
from_ui: 1
ptlang: 2052
js_ver: 19112817
js_type: 1
pt_uistyle: 40
aid: 549000912
daid: 5
ptdrvs: AnyQUpMB2syC5zV6V4JDelrCvoAMh-HP6Xy5jvKJzHBIplMBK37jV1o3JjBWmY7j*U1eD8quewY_
has_onekey: 1
復制代碼
所以我們只需要知道以下參數就行啦:
action
login_sig
ptqrtoken
復制代碼
很顯然,action的構造方式應該是這樣的:
‘0-0-‘+時間戳
復制代碼
至于login_sig參數,容易發現可以通過請求以下鏈接:

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
然后在返回的cookies里得到login_sig參數:

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
而請求:
https://xui.ptlogin2.qq.com/cgi-bin/xlogin?
復制代碼
需要攜帶的參數為:

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
通過測試可以發現上面這些參數都是固定的 。最后就剩下ptqrtoken這個參數啦,全局搜索一下,可以發現ptqrtoken這個參數在某個js文件里寫了計算方式:

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
其中,hash33的js代碼為:
function hash33(t) {
for (var e = 0, i = 0, n = t.length; i < n; ++i)
e += (e << 5) + t.charCodeAt(i);
return 2147483647 & e
}
復制代碼
轉為python代碼就是:
def decryptQrsig(qrsig):
e = 0
for c in qrsig:
e += (e << 5) + ord(c)
return 2147483647 & e
復制代碼
那么,現在的問題就是qrsig這個參數如何獲得呢?和login_sig參數類似,容易發現請求以下這個鏈接:

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
在返回的cookies里可以得到qrsig這個參數的值:

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
而請求:
https://ssl.ptlogin2.qq.com/ptqrshow
復制代碼
需要攜帶的參數如下圖所示:

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖

更多Python學習資料可以私信關鍵字【資料】領取
除了t其他參數都是不變的,感覺t像個隨機數(因為測試了下,發現t就算一直保持不變也沒關系),既然影響不大,就懶得繼續分析t到底是個啥了,就當是個隨機數唄(反正位數也都是16位) 。
OK,到此為止,我們大概已經了解了整個模擬登錄的流程了,那就開始邊寫代碼邊進一步明確該流程唄~首先自然是獲得login_sig參數:
params = {
‘proxy_url’: ‘https://qzs.qq.com/qzone/v6/portal/proxy.html’,
‘daid’: ‘5’,
‘hide_title_bar’: ‘1’,
‘low_login’: ‘0’,
‘qlogin_auto_login’: ‘1’,
‘no_verifyimg’: ‘1’,
‘link_target’: ‘blank’,
‘appid’: ‘549000912’,
‘style’: ’22’,
‘target’: ‘self’,
‘s_url’: ‘https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone’,
‘pt_qr_app’: ‘手機QQ空間’,
‘pt_qr_link’: ‘https://z.qzone.com/download.html’,
‘self_regurl’: ‘https://qzs.qq.com/qzone/v6/reg/index.html’,
‘pt_qr_help_link’: ‘https://z.qzone.com/download.html’,
‘pt_no_auth’: ‘0’
}
res = self.session.get(self.xlogin_url, headers=self.headers, verify=False, params=params)
all_cookies.update(requests.utils.dict_from_cookiejar(res.cookies))
pt_login_sig = all_cookies[‘pt_login_sig’]
復制代碼
然后獲得ptqrtoken參數:
params = {
‘appid’: ‘549000912’,
‘e’: ‘2’,
‘l’: ‘M’,
‘s’: ‘3’,
‘d’: ’72’,
‘v’: ‘4’,
‘t’: str(random.random()),
‘daid’: ‘5’,
‘pt_3rd_aid’: ‘0’
}
res = self.session.get(self.qrshow_url, headers=self.headers, verify=False, params=params)
all_cookies.update(requests.utils.dict_from_cookiejar(res.cookies))
ptqrtoken = self.__decryptQrsig(all_cookies[‘qrsig’])
復制代碼
同時,在請求上述鏈接的過程中,也就是:
https://ssl.ptlogin2.qq.com/ptqrshow
復制代碼
我們還可以獲得二維碼圖片(即res.content其實就是二維碼的圖片數據),并將其顯示出來:
saveImage(res.content, ‘qrcode.jpg’)
showImage(‘qrcode.jpg’)
復制代碼
接著我們通過不斷請求一開始發現的二維碼登錄鏈接,即:
https://ssl.ptlogin2.qq.com/ptqrlogin
復制代碼
來檢測二維碼當前的狀態:
while True:
params = {
‘u1’: ‘https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone’,
‘ptqrtoken’: ptqrtoken,
‘ptredirect’: ‘0’,
‘h’: ‘1’,
‘t’: ‘1’,
‘g’: ‘1’,
‘from_ui’: ‘1’,
【怎么登陸qq空間 扣扣空間登錄的方法】‘ptlang’: ‘2052’,
‘action’: ‘0-0-‘ + str(int(time.time())),
‘js_ver’: ‘19112817’,
‘js_type’: ‘1’,
‘login_sig’: pt_login_sig,
‘pt_uistyle’: ’40’,
‘aid’: ‘549000912’,
‘daid’: ‘5’,
‘ptdrvs’: ‘AnyQUpMB2syC5zV6V4JDelrCvoAMh-HP6Xy5jvKJzHBIplMBK37jV1o3JjBWmY7j*U1eD8quewY_’,
‘has_onekey’: ‘1’
}
res = self.session.get(self.qrlogin_url, headers=self.headers, verify=False, params=params)
if ‘登錄成功’ in res.text:
break
elif ‘二維碼已失效’ in res.text:
raise RuntimeError(‘Fail to login, qrcode has expired…’)
time.sleep(2)
復制代碼
若登錄成功,則用該請求返回的鏈接來更新session的cookies從而獲得最終的QQ空間登錄會話對象:
all_cookies.update(requests.utils.dict_from_cookiejar(res.cookies))
qq_number = re.findall(r’&uin=(.+?)&service’, res.text)[0]
print(‘[INFO]: Account -> %s, login successfully…’ % qq_number)
url_refresh = res.text[res.text.find(‘http’): res.text.find(‘pt_3rd_aid=0’)] + ‘pt_3rd_aid=0’
self.session.cookies.update(all_cookies)
res = self.session.get(url_refresh, allow_redirects=False, verify=False)
all_cookies.update(requests.utils.dict_from_cookiejar(res.cookies))
self.session.cookies.update(all_cookies)
END
感謝大家的支持和喜歡,小編會每天分享更多Python學習的干貨知識給大家,所以大家別忘了關注小編哦 。
更多Python爬蟲、數據分析、辦公自動化、全棧開發、人工智能學習資@林夕編程關鍵字【資料】領取

怎么登陸qq空間 扣扣空間登錄的方法

文章插圖