Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用PHP或JS解码Youtube密码签名的最佳方法_Javascript_Php_Ios_Youtube - Fatal编程技术网

Javascript 使用PHP或JS解码Youtube密码签名的最佳方法

Javascript 使用PHP或JS解码Youtube密码签名的最佳方法,javascript,php,ios,youtube,Javascript,Php,Ios,Youtube,当通过返回的词典中的use\u cipher\u signature=true时,Youtube正在对一些视频使用密码签名 示例id:_JQH3G0cCtY 加密签名实际上是一种加扰签名,任何人都可以用几组工作签名来调试它。但Youtube一直在改变置乱算法。 我看到很少有Youtube视频下载程序能够在不受游戏变化影响的情况下顺利运行。我认为他们正在检查播放器,并从播放器文件中提取解码脚本,因此它让他们继续工作 我需要一些关于在这种情况下使用的实际技术的帮助。我知道“youtube dl”—

当通过返回的词典中的
use\u cipher\u signature=true
时,Youtube正在对一些视频使用密码签名

示例id:_JQH3G0cCtY

加密签名实际上是一种加扰签名,任何人都可以用几组工作签名来调试它。但Youtube一直在改变置乱算法。 我看到很少有Youtube视频下载程序能够在不受游戏变化影响的情况下顺利运行。我认为他们正在检查播放器,并从播放器文件中提取解码脚本,因此它让他们继续工作

我需要一些关于在这种情况下使用的实际技术的帮助。我知道“youtube dl”——一个下载视频的python程序。由于我不擅长python,我认为他们使用相同的方法

这里还有一个用户脚本JS文件: ,这是在做同样的事情


任何关于PHP或JS密码解码的合理方法的帮助都将不胜感激。

Youtube不断改变Url结构和密码。目前,解码密码签名的最佳方法解释如下:

Youtube中的加密签名只是“加扰”签名,您必须根据播放器文件(HTML5播放器或Flash播放器)中的算法重新排列它们

例如
http://www.youtube.com/watch?v=UxxajLWwzqY
目前正在使用以下HTML5播放器文件:

在该文件中,您可以通过搜索“sig”轻松搜索签名解密码。在此情况下,算法为:

function bz(a) {
    a = a.split("");
    a = cz(a, 61);
    a = cz(a, 5);
    a = a.reverse();
    a = a.slice(2);
    a = cz(a, 69);
    a = a.slice(2);
    a = a.reverse();
    return a.join("")
}

function cz(a, b) {
    var c = a[0];
    a[0] = a[b % a.length];
    a[b] = c;
    return a
};
上面是解密代码

但是请注意,当他们更改播放器文件时,它会不断更改,因此您必须点击正在使用的播放器文件

此外,要下载带有密码签名的视频,您必须注意发送相同的cookie,使用相同的用户代理标头,从相同的IP地址发送请求,并在提取后不久发送请求。所有这些都是或是在某个时候需要的

如果对密码解密算法感兴趣,请访问


另一个很酷的API:

yeold
s.ytimg.com/yts/jsbin/html5player-vfltdb6U3.js
现在是404,我认为新的URL看起来更像
hxxps://s.ytimg.com/yts/jsbin/player-en_US-vfl_cdzrt/base.js

如果你搜索JavaScript,你会发现一些类似这样的代码

function(a,b,c)
{
a=new Mr(a);
a.set("alr","yes");a.set("keepalive","yes");a.set("ratebypass","yes");a.set("mime",(0,window.encodeURIComponent)(b.mimeType.split(";")[0]));c&&a.set("signature",xr(c));return a},Jt=function(a,b){var c=Yr(b,"id"),c=c.replace(":",";");..............
}
xr=function(a)
{
a=a.split("");
wr.rF(a,54);
wr.fs(a,75);
wr.N0(a,1);
wr.rF(a,52);
wr.N0(a,3);
wr.fs(a,31);
wr.rF(a,16);
wr.fs(a,38);
return a.join("")
}
上述代码调用的
xr
函数如下所示

function(a,b,c)
{
a=new Mr(a);
a.set("alr","yes");a.set("keepalive","yes");a.set("ratebypass","yes");a.set("mime",(0,window.encodeURIComponent)(b.mimeType.split(";")[0]));c&&a.set("signature",xr(c));return a},Jt=function(a,b){var c=Yr(b,"id"),c=c.replace(":",";");..............
}
xr=function(a)
{
a=a.split("");
wr.rF(a,54);
wr.fs(a,75);
wr.N0(a,1);
wr.rF(a,52);
wr.N0(a,3);
wr.fs(a,31);
wr.rF(a,16);
wr.fs(a,38);
return a.join("")
}

在那之后,我开始对javascript有点迷茫,我可以自己帮点忙,但是在代码项目中谈论这一点会让你陷入麻烦。

我已经翻译成了Swift 3Akhilesh对iOS用户的回答:

func decryptSignature(signature:String)->String {
    return bz(signature)
}
func bz(_ a:String)->String {
    var arrayA = Array(a.characters)
    arrayA = cz(arrayA, 61)
    arrayA = cz(arrayA, 5)
    arrayA = arrayA.reversed()
    arrayA = Array(arrayA[2..<arrayA.count])
    arrayA = cz(arrayA, 69)
    arrayA = Array(arrayA[2..<arrayA.count])
    arrayA = arrayA.reversed()
    return String(arrayA)
}
func cz(_ a:Array<Character>, _ b:Int)->Array<Character> {
    var arrayA = a
    let c = a[0]
    arrayA[0] = a[b % a.count];
    arrayA[b] = c
    return arrayA
}
我认为最好的办法是实现以下目标:

func decryptChiper(_ commands:String, signature:String)->String {
    var a = Array(signature.characters)
    let cmdArray:[String]! = commands.components(separatedBy: " ")
    for cmd in cmdArray {
        var value:Int!
        if cmd.characters.count>1 {
            let secondChar = cmd.index(cmd.startIndex, offsetBy: 1)
            value = Int(cmd.substring(from:secondChar))
        }

        switch cmd[cmd.startIndex] {
        case "r": a = a.reversed()
        case "s":
            if let sliceFrom = value {
                a = Array(a[sliceFrom..<a.count])
            }
        case "w":
            if let swapValue = value {
                a = swap(a,swapValue)
            }
        default:break
        }
    }
    return String(a)
}

func swap(_ a:Array<Character>, _ b:Int)->Array<Character> {
    var arrayA = a
    let c = a[0]
    arrayA[0] = a[b % a.count];
    arrayA[b] = c
    return arrayA
}
输出

33D3494498D70C3E80D9B084E48350F6519A9E9A71094.25F300BB180DDDDD18EE0EBEDD174EE5D874E

欢迎来到堆栈溢出。这似乎是一个问题,而不是一个答案(我认为,措辞不是很清楚)。如果你有一个问题,你应该把它作为一个新问题,而不是另一个问题的答案。如果这是一个答案,那么请尝试清理一下描述中的语言。@Akhilesh TYstream API是付费的!注释:YouTube已将“Sig”改为“S”。现在搜索解码算法非常困难。免费服务也不能处理文件。你知道我如何在中找到相关部分吗?函数bz中的参数是什么意思?