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看着就像是二维码登录):

看下请求这个链接需要哪些参数吧:

测试一下,可以发现大部分参数是固定的,我们只需要知道以下参数就行啦:

action
login_sig
ptqrtoken

action

很显然,action的构造方式应该是这样的:

‘0-0-‘+时间戳

login_sig

好像好几个url返回的都cookie都含有login_sig参数,选一个简单点的 https://xui.ptlogin2.qq.com/cgi-bin/xlogin?(因为它的参数都是固定的)

ptqrtoken

全局搜索一下,可以发现ptqrtoken这个参数在某个js文件里写了计算方式:

可见 ptqrtoken=hash33(qrsig),在全局搜索一下,发现hash33的定义如下:

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参数类似,容易发现请求如下链接,在返回的cookies里可以得到qrsig这个参数的值:

它的参数也比较简单,除了t其他参数都是不变的,感觉t像个随机数,就当是个随机数呗(反正位数也都是16位)。

至此,3个最重要的参数构造方式都得到了。

代码

import requests
import time
import random
import os
import sys
import re
import warnings
warnings.filterwarnings(‘ignore‘)

xlogin_url = ‘https://xui.ptlogin2.qq.com/cgi-bin/xlogin?‘
qrshow_url = ‘https://ssl.ptlogin2.qq.com/ptqrshow?‘
qrlogin_url = ‘https://ssl.ptlogin2.qq.com/ptqrlogin?‘
headers = {
    ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36‘
}

session = requests.Session()
cur_path = os.getcwd()

def hash33(qrsig):
    e = 0
    for c in qrsig:
        e += (e << 5) + ord(c)
    return 2147483647 & e

# 保存图片
def saveImage(img, img_path):
    if os.path.isfile(img_path):
        os.remove(img_path)
    with open(img_path, ‘wb‘) as f:
        f.write(img)
        f.close()

# 展示图片
def showImage(img_path):
    if sys.platform.find(‘darwin‘) >= 0:
        subprocess.call([‘open‘, img_path])
    elif sys.platform.find(‘linux‘) >= 0:
        subprocess.call([‘xdg-open‘, img_path])
    else:
        os.startfile(img_path)
    return True

# 获取pt_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‘
}
all_cookies = {}
res = session.get(xlogin_url, headers=headers, verify=False, params=params)
all_cookies.update(requests.utils.dict_from_cookiejar(res.cookies))
pt_login_sig = all_cookies[‘pt_login_sig‘]
print(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 = session.get(qrshow_url, headers=headers, verify=False, params=params)
all_cookies.update(requests.utils.dict_from_cookiejar(res.cookies))
ptqrtoken = hash33(all_cookies[‘qrsig‘])
print(ptqrtoken)
# 保存验证码图片
saveImage(res.content, os.path.join(cur_path, ‘qrcode.jpg‘))
showImage(os.path.join(cur_path, ‘qrcode.jpg‘))
session.cookies.update(all_cookies)

# 检测二维码状态
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‘: ‘20010217‘,
        ‘js_type‘: ‘1‘,
        ‘login_sig‘: pt_login_sig,
        ‘pt_uistyle‘: ‘40‘,
        ‘aid‘: ‘549000912‘,
        ‘daid‘: ‘5‘
    }
    res = session.get(qrlogin_url, headers=headers, verify=False, params=params)
    print(res.text)
    if ‘二维码未失效‘ in res.text:
        break
    elif ‘二维码已经失效‘ in res.text:
        raise RuntimeError(‘Fail to login, qrcode has expired...‘)
    time.sleep(2)

参考链接:

1. https://zhuanlan.zhihu.com/p/95888605

2. https://github.com/CharlesPikachu/DecryptLogin/blob/master/DecryptLogin/platforms/QQZone.py

原文地址:https://www.cnblogs.com/lfri/p/12207472.html

时间: 2024-10-09 13:20:54

QQ空间模拟登陆的相关文章

QQ空间登陆协议分析-2014年8月

在做此工程之前当然也是参考了网上各位前辈的分析原理,最后实际上是分析很简单,但是代码的实现让我着实犯难,毕竟作MFC还没有实际开发过什么项目,敲代码的经验,水平都不是很好,不过最后还是花了一周的时间把这个QQ空间的登陆,留言,发表心情等,都做了出来,后来想着顺带着美化下界面的,于是发现了duilib这个东西,还上论坛发帖问了呢,结果还是不会在vc6上用它,最后的结果就是无果啦,想想还是不去钻这个牛角尖了,毕竟等了我换了这台E40后以后的IDE肯定是要换的,就不去想这些头疼的事了. 说多了,下面给

php模拟用户自动在qq空间发表文章的方法

我们这里是一个简单的利用php来模拟登录后再到QQ空间发送文章的一个简单的程序,有需要的朋友可以参考,或改进可以给我意见,代码如下: [php] view plaincopy <?php //模拟get post请求函数 http://www.lai18.com /* 函数说明: 功能:请求方式可以get,post,可以发送的cookie,保存的cookiefile文件 参数:$url-----请求url    $referer---来源url    $postdata----------用于p

盒饭哥C# 13行代码带你模拟登录QQ空间

最近想做一个QQ空间点赞的小工具,于是晚上下班回来就开始分析PC版的QQ空间,打开Chrome,切换到Network,然后输入账号密码,然后点击登录... 然后,我曹....一堆请求就开始了....搞了半天,还要去分析登录的加密方法....太麻烦了... 然而我们写代码的懂不起那些... 于是就果断掏出的大杀器Selenium+PhantomJS 说了这么多要不要直接上代码啊??? 好吧,直接上代码 PhantomJSDriverService services = PhantomJSDrive

Java实现模拟QQ空间图片上传

Java实现模拟QQ空间图片上传 首先看效果: 首先编写我们的上传jsp代码,如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://

java 模拟触屏版QQ空间上传图片

模拟触屏版QQ空间上传图片问题. 第一步:上传图片. http://up.qzone.com/cgi-bin/upload/cgi_upload_pic_v2 参数: picture:[图片的Base64编码] base64:1 hd_height:480[图片高度] hd_width:320[图片宽度] hd_quality:96[图片质量,好像只有70&96 ,数字大是高质量] output_type:json preupload:1 charset:utf-8 output_charset

Android中集成QQ登陆和QQ好友分享及QQ空间分享

extends : http://blog.csdn.net/arjinmc/article/details/38439957 相关官方文档及下载地址: 如果只用分享和登陆,用lite包就可以,体积小 http://wiki.open.qq.com/wiki/mobile/API%E8%B0%83%E7%94%A8%E8%AF%B4%E6%98%8E#1.13_.E5.88.86.E4.BA.AB.E6.B6.88.E6.81.AF.E5.88.B0QQ.EF.BC.88.E6.97.A0.E9

模拟登录QQ空间

# coding=utf-8from selenium import webdriver # 模拟登录QQ空间def Start_Login(): # 这个是chormedriver的地址 driver = webdriver.Chrome(executable_path='K:\\python-workspace\\QQSpider-master\\QQSpider1\\chromedriver.exe') driver.get('https://qzone.qq.com/') driver.

QQ空间说说批量删除软件免费下载

空间说说怎么全部删除?怎么批量删除空间说说?柔情教你快速简单一键删除qq空间说说. 曾经每天发在空间的说说,伴随我们走过了青春岁月,这些说说也包含了我们个人的大量信息. 而腾讯却没有提供说说批量删除的功能,难道我们只能一条一条去删除吗?现在柔情制作了一款很实用的说说批量删除软件,原理是自动后台模拟手动操作去删除说说,希望能帮到大家!希望大家多多支持柔情,柔情网盘:http://qqkj.ys168.com/ 柔情QQ空间说说批量删除软件是一款可自动批量删除QQ说说的软件,只需在软件上登陆QQ既可

QQ空间爬虫最新分享,一天 400 万条数据(附代码地址)

http://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&mid=2653552228&idx=1&sn=e476bf23556406cbce7de65508d79843&chksm=806dd0d9b71a59cf2b062a19309c849a62ba15790898e5e619205f0f5ec84a90025a8cea05e9&mpshare=1&scene=23&srcid=11252MeE6Qu1D