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
|