airdge / VideoParse

24 stars 7 forks source link

请教一下爱奇艺的ibt计算方法 #7

Open redstoneleo opened 5 years ago

redstoneleo commented 5 years ago

ibt这个值应该是爱奇艺vip视频所需,计算ibt的js文件应该是这一个https://static.iqiyi.com/js/player_v1/pcweb.wonder.js

在js里面,ibt的值是 u.cmd5x(i + t.__filename),想问一下i + t.__filename分别是什么?能否指教一下摸索过程?谢谢!

airdge commented 5 years ago
                        var S = this;
                        S.ad = e, S.vip = t, S.index = e ? 0 : n, S.tvId = a, S.vid = o, S.vidl = c, S.albumID = _, S.channelID = v, S.originID = m, S.du = y, S.size = b, S.showStartTime = x, S.showEndTime = w, S.startTime = T, S.endTime = q, S.__gas = n, S.__url = S.ad ? i : h + "//data.video.iqiyi.com/videos" + i + "&cross-domain=1&qyid=" + (r.getFluid() || r.getJsuid()) + "&qypid=" + S.tvId + "_" + f.getSrc(), S.__params = d.query2Json(S.__url), S.__filename = d.filename(S.__url), 

S.getUrl = function() {
                            var e, t = this;
                            if (t.ad) e = t.__url;
                            else if (t.vip) {
                                var i = arguments[0] || "",
                                    n = u.cmd5x(i + t.__filename);
                                i || g.warn(t.vid + ", segment index: " + t.index + ", boss key is empty!"), e = t.__url + "&t=" + i + "&vid=" + t.vid + "&ibt=" + n + "&cid=afbe8fd3d73448c9&ib=4&ptime=" + p.getPreviewTime(t.tvId) + "&qypid=" + t.tvId + "_" + f.getSrc() + "&QY00001=" + s.get("QY00001")
                            } else e = t.__url + "&qypid=" + t.tvId + "_" + f.getSrc();
                            return e
                        }

这里面的t指向this,this指向上层S, t.filename就是 `S.filename = d.filename(S.__url)`

这里的i是传参,如果不存在就为空 i = arguments[0] || "",

argument用法

function test() {
    console.log( arguments );
}

test(1,2,3,4,5);

至于d.filename应该是

            var n = function(e) {
                    var t = "",
                        i = "",
                        n = "",
                        a = "",
                        r = /(\w+):\/\/([^\/:]+):?(\d*)((?:\/|$)[^?#]*)/,
                        o = e.match(r);
                    return o && (t = o[1], i = o[2], n = o[3], a = o[4]), {
                        protocol: t,
                        host: i,
                        port: n,
                        path: a
                    }
                },
                a = function(e) {
                    for (var t, i, n, a = e.substr(e.lastIndexOf("?") + 1), r = a.split("&"), o = r.length, s = {}, d = 0; d < o; d++) r[d] && (n = r[d].split("="), t = n.shift(), i = n.join("="), void 0 === s[t] && (s[t] = i));
                    return s
                },
                r = function(e, t) {
                    1 === arguments.length && (t = e, e = window.location.href);
                    var i = String(t).replace(new RegExp("([.*+?^=!:${}()|[\\]/\\\\])", "g"), "\\$1"),
                        n = new RegExp("(^|&|\\?|#)" + i + "=([^&#]*)(&|$|#)", ""),
                        a = e.match(n);
                    return a ? a[2] : ""
                },
                o = function(e) {
                    var t = n(e);
                    return (t ? t.path || "" : "").replace(/^.*[\\\/]/, "").split(".")[0]
                };
            i.exports = {
                parse: n,
                query: r,
                query2Json: a,
                filename: o
            }

没有vip账户 正确与否请自行断点调试

redstoneleo commented 5 years ago

Thanks♪(・ω・)ノ 请问你是怎么得出this指向上层S的? 我是想把相关的js函数拿出来,然后通过pyexecjs把相关的数据喂进去,最终得到视频下载链接

airdge commented 5 years ago
var S = {
    vid: 123,
    type: 'qwe'
};
S.test = function() {
    console.log(this)
}
S.test();

{ vid: 123, type: 'qwe', test: [Function] }

hxm456 commented 5 years ago

请问最新爱奇艺h5的算法怎么去除验证呢