node服务解析西瓜视频真实地址

/ 1评 / 0

具体流程:

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="
  }
}
如有错误,欢迎留言纠正!
  1. name说道:

    感谢

name进行回复 取消回复

您的电子邮箱地址不会被公开。