examples-of-web-crawlers/9.一键生成QQ个人历史报告/decrypt.py

80 lines
2.2 KiB
Python
Raw Permalink Normal View History

2019-04-28 18:59:53 +08:00
# -*- coding:utf-8 -*-
2019-05-02 01:15:44 +08:00
# 引用第三方库
2019-05-04 17:22:04 +08:00
from execjs import compile
2019-05-02 01:15:44 +08:00
2019-04-28 18:59:53 +08:00
# 对qrsig进行基本的加密该加密函数由抓包获得需要具备一定抓包知识才能找到该加密函数
# 根据javascript版的加密函数将其改写成python版本
def hash33_token(t):
e, n = 0, len(t)
for i in range(0,n):
e += (e << 5) + ord(t[i])
return 2147483647 & e
2019-05-02 01:15:44 +08:00
2019-04-28 18:59:53 +08:00
# 对skey进行基本的加密该加密函数由抓包获得需要具备一定抓包知识才能找到该加密函数
# 根据javascript版的加密函数将其改写成python版本
def hash33_bkn(skey):
e = skey
t = 5381
for n in range(0,len(e)):
t += (t << 5) + ord(e[n])
return 2147483647 & t
2019-05-02 01:15:44 +08:00
# 加载js文件
2019-05-05 16:21:17 +08:00
def get_js(js_name):
2019-05-02 01:15:44 +08:00
with open(js_name, 'r', encoding='UTF-8') as f:
# 一般js文件不大不会超出计算机的内存所以直接一次性读取全部数据
js_data = f.read()
return js_data
# 获取sck的值该加密函数由抓包获得需要具备一定抓包知识才能找到该加密函数
# 由于该js代码较长所以不转化为python版本而是采取直接调用js文件中的函数
def get_sck(skey):
# 读取js脚本
2019-05-05 16:21:17 +08:00
md5 = get_js('decrypt/md5.js')
2019-05-02 01:15:44 +08:00
# 加载js脚本引擎
2019-05-04 17:22:04 +08:00
ctx = compile(md5)
2019-05-02 01:15:44 +08:00
# 调用js脚本中某个函数
# 第1个参数为函数名第2到第n个参数为该函数依次所需的参数
result = ctx.call('hex_md5', str(skey))
2019-05-05 16:21:17 +08:00
return str(result)
# 获取g_tk值这里的g_tk值算法由vip.qq.com获取暂不清楚是否能直接用于其他域名
def get_csrf_token(skey):
# 读取js脚本
js = get_js('decrypt/getCSRFToken.js')
# 加载js脚本引擎
ctx = compile(js)
# 调用js脚本中某个函数
# 第1个参数为函数名第2到第n个参数为该函数依次所需的参数
tmp_data = ctx.call('getCSRFToken', str(skey))
# 读取js脚本
js = get_js('decrypt/md5.js')
# 加载js脚本引擎
ctx = compile(js)
# 调用js脚本中某个函数
# 第1个参数为函数名第2到第n个参数为该函数依次所需的参数
result = ctx.call('hex_md5', str(tmp_data))
return result