具体流程:
1.复制西瓜视频链接地址,获取videoId;
2.拿到videoId通过西瓜Crc32算法获取中间链接地址;
3.请求中间链接地址拿到视频的json数据;
4.base64解密json数据中的视频真实地址;
配置Api
//routes/index.js
var xg = require('../utils/xigua'); //方法封装
router.get('/getXigua', (req, res) => {
xg.buildXiguaVideoToUrl(req.query.url).then(response=>{
res.json({data: response})
})
});
核心代码
//utils/xigua.js
const axios = require('axios');
const cheerio = require('cheerio');
var headers = {
'user-agent': ' Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
}
var buildXiguaVideoToUrl = function (url) {
return new Promise((resolve, reject) => {
axios.get(url, {
headers
}).then(function (response) {
//拿到html文件字符串
let str = response.data.match(/<section class="xigua-detailvideo">([\s\S]*)<\/section>/);
//使用cheerio创建Dom
let $ = cheerio.load(str[0]);
//获取videoId
let videoId = $('.xigua-video').attr('id');
//通过Crc32算法解密地址
let url = xgCrc32(videoId);
getBaseUrl(url).then(result => {
//返回真实地址与视频id
resolve({
url: result,
id: videoId
})
}).catch(err => {
reject(err)
})
}).catch(function (error) {
reject(error)
})
})
}
var xgCrc32 = function (video_id) {
var n = function () {
for (var t = 0,
e = new Array(256), n = 0; 256 != n; ++n) t = n,
t = 1 & t ? -306674912 ^ t >>> 1 : t >>> 1,
t = 1 & t ? -306674912 ^ t >>> 1 : t >>> 1,
t = 1 & t ? -306674912 ^ t >>> 1 : t >>> 1,
t = 1 & t ? -306674912 ^ t >>> 1 : t >>> 1,
t = 1 & t ? -306674912 ^ t >>> 1 : t >>> 1,
t = 1 & t ? -306674912 ^ t >>> 1 : t >>> 1,
t = 1 & t ? -306674912 ^ t >>> 1 : t >>> 1,
t = 1 & t ? -306674912 ^ t >>> 1 : t >>> 1,
e[n] = t;
return "undefined" != typeof Int32Array ? new Int32Array(e) : e
}(),
o = function (t) {
for (var e, o, r = -1,
i = 0,
a = t.length; i < a;) e = t.charCodeAt(i++),
e < 128 ? r = r >>> 8 ^ n[255 & (r ^ e)] : e < 2048 ? (r = r >>> 8 ^ n[255 & (r ^ (192 | e >> 6 & 31))], r = r >>> 8 ^ n[255 & (r ^ (128 | 63 & e))]) : e >= 55296 && e < 57344 ? (e = (1023 & e) + 64, o = 1023 & t.charCodeAt(i++), r = r >>> 8 ^ n[255 & (r ^ (240 | e >> 8 & 7))], r = r >>> 8 ^ n[255 & (r ^ (128 | e >> 2 & 63))], r = r >>> 8 ^ n[255 & (r ^ (128 | o >> 6 & 15 | (3 & e) << 4))], r = r >>> 8 ^ n[255 & (r ^ (128 | 63 & o))]) : (r = r >>> 8 ^ n[255 & (r ^ (224 | e >> 12 & 15))], r = r >>> 8 ^ n[255 & (r ^ (128 | e >> 6 & 63))], r = r >>> 8 ^ n[255 & (r ^ (128 | 63 & e))]);
return r ^ -1
},
r = "/video/urls/v/1/toutiao/mp4/" + video_id + "?r=" + Math.random().toString(10).substring(2);
"/" != r[0] && (r = "/" + r);
var i = o(r) >>> 0;
return ("https://ib.365yg.com" + r + "&s=" + i)
}
var getBaseUrl = function (url) {
return new Promise((resolve, reject) => {
//请求中间链接地址
axios.get(url, {
headers
}).then(function (response) {
//返回json数据,视频地址链接为base64加密代码
if (response.status == 200) {
let base64 = response.data.data.video_list.video_1.backup_url_1;
resolve(base64ToStr(base64))
//base64解密
} else {
reject('请求失败')
}
}).catch(function (error) {
reject(error)
})
})
}
var base64ToStr = function (str) {
return Buffer.from(str, 'base64').toString();
}
module.exports = {
buildXiguaVideoToUrl
}
前端请求
$.get("/getXigua",{url:'https://m.ixigua.com/video/6925582817061503499?utm_source=selfcopylink'},function (res) {
console.log(res)
}, "json");
//res = {
data:{
id: "v02004cd0000c0e9m96l48l4141457kg",
url: "http://v3-default.ixigua.com/e4f15080a4ff5e9bba6c7fd90626cfb8/6020b47d/video/tos/cn/tos-cn-ve-4/03f8c63708c843c69cfe0e3da5721eb1/?a=2012&br=1240&bt=310&cd=0%7C0%7C0&ch=0&cr=0&cs=0&cv=1&dr=0&ds=1&er=&l=20210206114813010212192020280B6128&lr=&mime_type=video_mp4&pl=0&qs=0&rc=ajo3Nzc7bzw8MzMzZzczM0ApaDQ7aWZnPGVnNzZoOjs6aGdoMi4uaTEzamJgLS1gLS9zcy8uXi9hXjQ2NF5iNi02YTI6Yw%3D%3D&vl=&vr="
}
}
感谢