好像又不能用了?放弃了。
2017.05.28
- 更新了验证码获取方式
- 支持扫码登录
2015.12.20
更新版本,欢迎测试:github
2015.11.17
好像不能直接用了,如果有问题,可以自行分析腾讯的JS。
上次写了一篇关于Python模拟登录QQ空间的文章,后来发现QQ的加密机制变了。于是就有了这篇。
加密过程解析:
当然上图的流程不是我凭空捏造的,而是有依据的——c_login_2.js。
方法:
JS中的方法对应于Python中的实现:
md5 => hashlib.md5
uin2hex => to_bytes
hexchar2bin => bytes.fromhex
strToBytes => binascii.hexlify
btoa => base64.b64encode
依赖第三方库:
具体实现:
捐赠共勉:
支付宝
订阅号:
来波关注














网友评论
就这个查询Q币页面,抓包确认只需要uin和skey参数就可以请求了,我添加后也是查询失败
C:\qqlib-master>python qqlo.py
Verify code: otfd
Traceback (most recent call last):
File "qqlo.py", line 2, in <module>
qq=qqlib.QQ('aertee@qq.com','123456')
File "C:\Python34\lib\site-packages\qqlib\__init__.py", line 53, in __init__
self.check()
File "C:\Python34\lib\site-packages\qqlib\__init__.py", line 76, in check
self.login()
File "C:\Python34\lib\site-packages\qqlib\__init__.py", line 120, in login
'p' : self.getEncryption(),
File "C:\Python34\lib\site-packages\qqlib\__init__.py", line 90, in getEncry
ion
e = int(self.qq).to_bytes(8, 'big')
ValueError: invalid literal for int() with base 10: 'aertee@qq.com'
是通过访问获得的 url 在获得cookie 访问页面吗
File "<stdin>", line 1, in <module>
File "qqlib\__init__.py", line 52, in __init__
self.check()
File "qqlib\__init__.py", line 75, in check
self.login()
File "qqlib\__init__.py", line 119, in login
'p' : self.getEncryption(),
File "qqlib\__init__.py", line 89, in getEncryption
e = int(self.qq).to_bytes(8, 'big')
AttributeError: 'int' object has no attribute 'to_bytes'
qq.login()
File "E:\新建文件夹\151113webqq\qqlib\qqlib\__init__.py", line 78, in login
'pt_verifysession_v1': self.session.cookies['ptvfsession'],
File "E:\Programs\Python\Python350\Lib\site-packages\requests\cookies.py", line 283, in __getitem__
return self._find_no_duplicates(name)
File "E:\Programs\Python\Python350\Lib\site-packages\requests\cookies.py", line 341, in _find_no_duplicates
raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
builtins.KeyError: "name='ptvfsession', domain=None, path=None"
Verify code: tpgk
Traceback (most recent call last):
File "D:\code\Python\qq3.py", line 3, in <module>
qq.login()
File "D:\Program Files\Python\lib\site-packages\qqlib\__init__.py", line 78, in login
'pt_verifysession_v1': self.session.cookies['ptvfsession'],
File "D:\Program Files\Python\lib\site-packages\requests\cookies.py", line 283, in __getitem__
return self._find_no_duplicates(name)
File "D:\Program Files\Python\lib\site-packages\requests\cookies.py", line 341, in _find_no_duplicates
raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
KeyError: "name='ptvfsession', domain=None, path=None"
import qqlib
qq=qqlib.QQ(12345678,'password')
qq.login()
qq.sayHi()
Traceback (most recent call last):
File "test.py", line 5, in <module>
qq.login()
File "/data/web/qqlib/qqlib/__init__.py", line 82, in login
raise LogInError(r[4])
qqlib.LogInError
def blog(self):
par = {
'hostUin' : self.num,
'uin' : self.num,
'blogType' : 0,
'cateName' : '',
'cateHex' : '',
'statYear' : 2015,
'reqInfo' : 7,
'pos' : 0,
'num' : 15,
'sortType' : 0,
'source' : 0,
'rand' : '0.732127174269408',
'ref' : 'qzone',
'g_tk' : self.gtk(),
'verbose' : 1
}
print(get('http://user.qzone.qq.com/p/b1/cgi-bin/blognew/get_abs?%s' % urllib.parse.urlencode(par)))
在2.7.8上跑qqlib的login会有错误,bytes.fromhex()我改成了python 2.7的str(bytearray.fromhex()),还是会有这样的错误:
File "qqlib/__init__.py", line 127, in pwdencode
tea.encrypt(str(bytearray.fromhex(pwd1)), str(bytearray.fromhex(s2)))
File "qqlib/tea.py", line 96, in encrypt
o = xor(v[i:i + 8], tr)
File "qqlib/tea.py", line 29, in xor
a1, a2 = struct.unpack('!LL', a[0:8])
struct.error: unpack requires a string argument of length 8