def decryptQrsig(qrsig):e = 0for c in qrsig:e += (e << 5) + ord(c)return 2147483647 & e复制代码
那么,现在的问题是qrsig这个参数怎么取?和login_sig参数相似性,很容易找到 。请求以下链接:
更多Python学习资料可以是私人关键词【资料】领取
在返回的cookies可以在中获得qrsig该参数的值:
更多Python学习资料可以是私人关键词【资料】领取
而请求:
https://ssl.ptlogin2.qq.com/ptqrshow复制代码
所需的参数如下图所示:更多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复制代码
来检测QR码的当前状态: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','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:breakelif '二维码已过期' 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)
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 情侣空间网名 好听的情侣空间昵称
- qq空间为什么进不去 QQ空间怎么进不去了
- qq空间进不去了 QQ空间为什么进不去了
- linux查看正在登录的用户 linux查看系统关机原因
- 一个微信号能同时登录两个手机吗
- 爱奇艺会员可同时登录几个设备 爱奇艺会员可以同时登录几个设备
- 远程登录电脑命令ssh 远程登录电脑命令linux
- 抖音怎么退出登录账号
- 香吉士DJ舞曲怎么弄到空间里
- q空间登录 qq空间登录不上去一直在处理