昨天练习爬虫时遇到了个问题,在论坛老哥的指点下找到了视频信息的生成方式
。百度了下发现pako是JS里用于解压与压缩的包。然后我就高高兴兴的用pyexecjs调用这句代码,如下:
[JavaScript] 纯文本查看 复制代码 const pako = require('pako')
function cs(pin) {
return pako.ungzip(pin, {to: 'string'});
}
[Python] 纯文本查看 复制代码 import requests
import execjs
from fake_useragent import UserAgent
url = 'https://v3.ddrk.me:9543/video?id=lKwK4yQuvITOqPfIV5uAXq%2F9fGucWarPlYhZA8P8a61vrP3SsDXhW8kAfLhTTVeCjSuZojJdGQ6oyQLvuB6WIaSx1Dp0iOGkYlfYmZBP7ujp2lU%2BPCMYU7KCuhVqIz3f&type=mix'
headers = {
'user-agent': UserAgent().random,
}
res = requests.get(url, headers=headers)
pin = res.json()['pin']
print(pin)
with open('cs.js', 'r', encoding='utf-8') as f:
x = f.read()
result = execjs.compile(x)
result = result.call('cs', pin)
运行后直接报错骑脸,搞了半天,终于在今天早上找到原因了,pako解压数据太(长)大时就会报错。知道原因就好办了,把数据分别解压拼接就行了。
[JavaScript] 纯文本查看 复制代码 const pako = require('pako')
function unzip(pin) {
// 将二进制字符串转换为数字字符数组
var charData = pin.split('').map(function (x) {
return x.charCodeAt(0);
});
// 将数字数组转换为字节数组
var binData = new Uint8Array(charData);
// // 解压
var data = pako.inflate(binData);
array = new Uint16Array(data)
var res = '';
var chunk = 8 * 1024;
var i;
for (i = 0; i < array.length / chunk; i++) {
res += String.fromCharCode.apply(null, array.slice(i * chunk, (i + 1) * chunk));
}
res += String.fromCharCode.apply(null, array.slice(i * chunk));
strData = res
return strData;
}
最后,再次感谢下昨天回帖的老哥们。
|