pip install pyexecjs
import execjs
import execjs
print(execjs.eval('"abc aaa bbb".split(" ")'))
['abc', 'aaa', 'bbb']
# 调用变量名
text = execjs.compile(open(r'text.js').read())
print(text.eval('d'))
# text.js 文件
var t 666;
function add(a, b) {
return a+b
}
# python文件
import execjs
text = execjs.compile(open(r'text.js').read())
# 调用函数
print(text.call('add', 1, 2))
# 获取变量名
print(text.eval('t'))
获取 js 引擎的名字
>>> execjs.get().name
'JScript'
# 默认的js引擎,但是对某一些js代码不支持,所以要换成 nodejs 引擎
在虚拟机中安装
sudo apt-yum install nodejs
Windows安装
http://nodejs.cn/download/
当我们清空所有内容之后,每次点击翻译,该页面就会携带一些参数发送一个 POST 请求
切忌,要从请求的入口进入到 js 代码里面
首先从入口进入以后,在代码处打上断点,在点击翻译按钮发送一次请求
但是我们发现该请求不是我们需要的,因为翻译的时候就算输入一个字母,后台自己也会偷偷的发送请求,所以我们点击蓝色的按钮让他在运行
此时我们发现调用堆栈发生改变,并且 ajax 请求发送的参数发生改变,并且找到了该js发送请求的过程,接下来就可以扣代码了
最关键的一步,找出生成 sign 参数的函数,并把 js 代码扣下来
首先,我们在点击观看视屏的时候,抓到的包是一个 get 请求,地址是视屏
其次,一个请求要么是js发起的,要么就是浏览器请求的(该情况属于后者)
所以我们去审查元素,并在网页源代码里面找这个播放视屏盒子的属性
我们发现播放视屏里的元素都是 js 生成的,所以通过 Fiddle 去抓包,把这些 js 生成的盒子的属性用全局搜索去查看,并且找到了我们需要的 js 文件
在 sources 里面,我们通过在 Fiddler 里面找打的 js 文件,顺利进入内部
在此处断点,一步一步在调用堆栈
里面查找我们需要的js代码
但是我们往上看发现,传进来的 t
参数已经把视屏地址解压了,所以继续看调用堆栈
终于有了小发现(url 的解码方式,就差 url 的来源了),a.vcastr_file 这个参数就是来源,还得继续往上面找
发现其实我们需要的参数是 this 这个参数
最终在堆栈中,我们找出了this生成的方式,也找到了url的的来源
剩下的就是扣代码 js 代码进行改造了
python
代码
sourse_page = requests.get('https://www.meipai.com/media/1140316782').text
encrypt_mp4_url = re.findall(r'data-video="(.*?)"', sourse)[0]
print(mp4_url) # 加密的地址
js = execjs.compile(open(r'美拍分析.js').read())
decrypt_mp4_url = js.call('decodeMp4.decode', mp4_url)
print(a) # 解密后的地址
js
代码
var h = "substring",
i = "split",
j = "replace",
k = "substr",
g = 'base64'
decodeMp4 = {
getHex: function(a) {
return {
str: a[h](4),
hex: a[h](0, 4)[i]("").reverse().join("")
}
},
getDec: function(a) {
var b = parseInt(a, 16).toString();
return {
pre: b[h](0, 2)[i](""),
tail: b[h](2)[i]("")
}
},
substr: function(a, b) {
var c = a[h](0, b[0])
, d = a[k](b[0], b[1]);
return c + a[h](b[0])[j](d, "")
},
getPos: function(a, b) {
return b[0] = a.length - b[0] - b[1],
b
},
decode: function(a) {
var b = decodeMp4.getHex(a)
, c = decodeMp4.getDec(b.hex)
, d = decodeMp4[k](b.str, c.pre);
return atob(decodeMp4[k](d, decodeMp4.getPos(d, c.tail)))
}
};
var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
atob = function(a) {
if (a = a.replace(/=+$/, ""),
a.length % 4 == 1)
throw f;
for (var b, c, d = 0, g = 0, h = ""; c = a.charAt(g++); ~c && (b = d % 4 ? 64 * b + c : c,
d++ % 4) ? h += String.fromCharCode(255 & b >> (-2 * d & 6)) : 0)
c = e.indexOf(c);
return h
}