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中的参数是什么意思?