YouTube 签名破译 VB.Net
YouTube signature decipher with an working example for VB.Net
我知道有很多项目,我可以使用它们。但是我真的很想在我的 VB.Net 项目中得到它 运行 而没有依赖项。
所以我尝试做的是创建一个 Youtube 下载器。它适用于普通视频。但是像 Vevo (https://www.youtube.com/watch?v=9bZkp7q19f0) 和其他一些特殊视频不起作用。
他们有另一个签名需要我破译。在这里,我需要能够提取的 HTMLPlayer JS 文件 (http://s.ytimg.com/yts/jsbin/html5player-de_DE-vflG4uS_k/html5player.js)。在那个文件上,我需要搜索一个特殊的函数,看看这个函数在做什么,然后在我的代码中做同样的事情。到目前为止非常简单,但在某些示例中我什至找不到 "sig=" 或 "signature=",当我找到它们时并没有真正帮助我。
所以我想知道如何从 html5.player.js 文件中提取所需的信息。因此,正如您在这里看到的 https://superuser.com/questions/773719/how-do-all-of-these-save-video-from-youtube-services-work 我有那个文件 link。
我还发现这个 https://mytoolkit.codeplex.com/discussions/479171 帮助我开始。但是从Sign_Decipher开始,我在js文件中没有找到这样的调用函数。
一些其他的 links 我找到了但没有帮助我得到它 运行 或太旧的地方:
- Getting the signature of a youtube video
- Youtube decipher signature not working as expected
- How can i decrypt signature and add to the YouTube Extracted URL in objective c?
- Best approach to decode Youtube cipher signature using PHP or JS
- https://github.com/svnpenn/bm/blob/gh-pages/yt.js
- https://github.com/rg3/youtube-dl/issues/1060
- https://github.com/jeckman/YouTube-Downloader/issues/9
一些 API 也无法正常工作:
您提供的链接网站已包含解决此问题所需的所有信息。大部分工作都可以用一些简单的正则表达式来完成。这些是解码此类加扰签名所需的步骤:
- 下载您要下载的视频页面使用的html5player.js。
- 确定用于解码编码签名的函数的名称。
- 使用这个名称,从脚本中提取函数定义。
- 运行 JS 解释器中提取的函数,并用它简单地解码签名。
获取html5player.js
第一步应该没问题,你已经完成了。大多数脚本 URL 将始终相同 (https://s.ytimg.com/yts/jsbin/html5player-VERSION/html5player.js
)。只有版本部分会不时更改(例如de_DE-vflR89yTY)。这意味着,您只需在视频页面中找到脚本版本并调整默认脚本 URL。结果 URL 将是这样的:https://s.ytimg.com/yts/jsbin/html5player-de_DE-vflR89yTY/html5player.js
播放器版本: html5player-([\w\d\-]+)\\/html5player\.js
版本可以在第一个捕获组中找到。
提取解码函数
在提取函数之前,我们必须知道它的名称。不幸的是,解码函数的名称会因版本而异,但使用此函数的代码部分通常不会改变。
解码函数名称: \.sig\|\|([a-zA-Z0-9$]+)\(
函数名称将在第一个捕获组中。
现在我们知道了名称,我们可以提取函数,再次使用正则表达式。只需将 #NAME# 替换为函数名称即可。
解码函数定义: function #NAME#\([^\)]+\){.*?};
除了实际的解码函数之外,我们还需要提取解码函数正在使用的一些实用函数。这些功能包含在一个对象中。在我们可以从 html5player.js 中提取对象定义之前,我们必须确定对象的名称。
这次只记得使用提取的函数定义作为正则表达式的输入。
辅助对象名称: ;([A-Za-z0-9]+)\.
对象名称将在第一个捕获组中。
使用对象名称和一些正则表达式,我们可以从播放器脚本中提取对象定义,就像我们之前对函数定义所做的那样。将 #NAME# 替换为上一步中的对象名称。
辅助对象定义: var #NAME#={.*?};
现在我们拥有了恢复加密签名所需的一切。
解码签名
最后一步是使用提取的函数对签名进行解码。要在 .NET 中完成此操作,我们必须解析并执行 JavaScript 代码。幸运的是,有现成的解决方案可以为我们做到这一点。其中之一是 JS 解释器 Jint. Another option is to use one of the Script Engines available in Windows. Simon Mourier provides an convenient wrapper around these engines in the following answer:
这是一个结合了上述所有步骤并使用 Simon 的包装器解码它在硬编码视频页面中找到的第一个签名并将编码和解码签名都打印到控制台的小示例程序。
代码是用 C# 编写的,但应该很容易将其转换为 VB .NET。
class Program
{
private const string PlayerScriptUrlTemplate = "https://s.ytimg.com/yts/jsbin/html5player-{0}/html5player.js";
private const string DecodeFunctionPatternTemplate = @"function #NAME#\([^\)]+\){.*?};";
private const string HelperObjectPatternTemplate = @"var #NAME#={.*?};";
private static readonly Regex SignatureRegex = new Regex(@"s=(?<Signature>[A-F0-9]+\.[A-F0-9]+)");
private static readonly Regex PlayerVersionRegex = new Regex(@"html5player-(?<PlayerVersion>[\w\d\-]+)\\/html5player\.js");
private static readonly Regex DecodeFunctionNameRegex = new Regex(@"\.sig\|\|(?<FunctionName>[a-zA-Z0-9$]+)\(");
private static readonly Regex HelperObjectNameRegex = new Regex(@";(?<ObjectName>[A-Za-z0-9]+)\.");
static void Main()
{
const string videoUrl = "https://www.youtube.com/watch?v=6pIyg35wiB4";
var client = new WebClient();
var videoPageData = client.DownloadString(videoUrl);
var encodedSignature = SignatureRegex.Match(videoPageData).Groups["Signature"].Value;
var playerVersion = PlayerVersionRegex.Match(videoPageData).Groups["PlayerVersion"].Value;
var playerScriptUrl = string.Format(PlayerScriptUrlTemplate, playerVersion);
var playerScript = client.DownloadString(playerScriptUrl);
var decodeFunctionName = DecodeFunctionNameRegex.Match(playerScript).Groups["FunctionName"].Value;
var decodeFunction = Regex.Match(playerScript, DecodeFunctionPatternTemplate.Replace("#NAME#", decodeFunctionName)).Value;
var helperObjectName = HelperObjectNameRegex.Match((decodeFunction)).Groups["ObjectName"].Value;
var helperObject = Regex.Match(playerScript, HelperObjectPatternTemplate.Replace("#NAME#", helperObjectName)).Value;
var engine = new ScriptEngine(ScriptEngine.JavaScriptLanguage);
var decoderScript = engine.Parse(helperObject + decodeFunction);
var decodedSignature = decoderScript.CallMethod(decodeFunctionName, encodedSignature).ToString();
// Jint variant
//var engine = new Engine();
//var decoderScript = engine.Execute(helperObject).Execute(decodeFunction);
//var decodedSignature = decoderScript.Invoke(decodeFunctionName, encodedSignature).ToString();
Console.WriteLine("Encoded Signature\n{0}.\n{1}", encodedSignature.Split('.').First(), encodedSignature.Split('.').Last());
Console.WriteLine();
Console.WriteLine("Decoded Signature\n{0}.\n{1}", decodedSignature.Split('.').First(), decodedSignature.Split('.').Last());
Console.ReadLine();
}
}
对不起大家,旧的 "html5player.js" 播放器不再工作,它是 404,您需要的 Url 现在看起来更像 https://s.ytimg.com/yts/jsbin/player-en_US-vfl_cdzrt/base.js
你六岁的初学者正在 javascript
中找到一个看起来像这样的函数
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("")
}
之后我有点迷路了,因为 wr 函数的代码看起来完全一样,我找不到像 Youtube 过去使用的交换、替换、拆分函数的代码。
wr=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("")
}
wr.N0 我认为看起来像这样,但 javascript 然后超过我的工资等级让我了解发生了什么。
N0=function(a,b){Tb(nga,b)&&tm(H_(a),a.O,b,a.Pq,a)}
我知道有很多项目,我可以使用它们。但是我真的很想在我的 VB.Net 项目中得到它 运行 而没有依赖项。
所以我尝试做的是创建一个 Youtube 下载器。它适用于普通视频。但是像 Vevo (https://www.youtube.com/watch?v=9bZkp7q19f0) 和其他一些特殊视频不起作用。
他们有另一个签名需要我破译。在这里,我需要能够提取的 HTMLPlayer JS 文件 (http://s.ytimg.com/yts/jsbin/html5player-de_DE-vflG4uS_k/html5player.js)。在那个文件上,我需要搜索一个特殊的函数,看看这个函数在做什么,然后在我的代码中做同样的事情。到目前为止非常简单,但在某些示例中我什至找不到 "sig=" 或 "signature=",当我找到它们时并没有真正帮助我。
所以我想知道如何从 html5.player.js 文件中提取所需的信息。因此,正如您在这里看到的 https://superuser.com/questions/773719/how-do-all-of-these-save-video-from-youtube-services-work 我有那个文件 link。
我还发现这个 https://mytoolkit.codeplex.com/discussions/479171 帮助我开始。但是从Sign_Decipher开始,我在js文件中没有找到这样的调用函数。
一些其他的 links 我找到了但没有帮助我得到它 运行 或太旧的地方:
- Getting the signature of a youtube video
- Youtube decipher signature not working as expected
- How can i decrypt signature and add to the YouTube Extracted URL in objective c?
- Best approach to decode Youtube cipher signature using PHP or JS
- https://github.com/svnpenn/bm/blob/gh-pages/yt.js
- https://github.com/rg3/youtube-dl/issues/1060
- https://github.com/jeckman/YouTube-Downloader/issues/9
一些 API 也无法正常工作:
您提供的链接网站已包含解决此问题所需的所有信息。大部分工作都可以用一些简单的正则表达式来完成。这些是解码此类加扰签名所需的步骤:
- 下载您要下载的视频页面使用的html5player.js。
- 确定用于解码编码签名的函数的名称。
- 使用这个名称,从脚本中提取函数定义。
- 运行 JS 解释器中提取的函数,并用它简单地解码签名。
获取html5player.js
第一步应该没问题,你已经完成了。大多数脚本 URL 将始终相同 (https://s.ytimg.com/yts/jsbin/html5player-VERSION/html5player.js
)。只有版本部分会不时更改(例如de_DE-vflR89yTY)。这意味着,您只需在视频页面中找到脚本版本并调整默认脚本 URL。结果 URL 将是这样的:https://s.ytimg.com/yts/jsbin/html5player-de_DE-vflR89yTY/html5player.js
播放器版本: html5player-([\w\d\-]+)\\/html5player\.js
版本可以在第一个捕获组中找到。
提取解码函数
在提取函数之前,我们必须知道它的名称。不幸的是,解码函数的名称会因版本而异,但使用此函数的代码部分通常不会改变。
解码函数名称: \.sig\|\|([a-zA-Z0-9$]+)\(
函数名称将在第一个捕获组中。
现在我们知道了名称,我们可以提取函数,再次使用正则表达式。只需将 #NAME# 替换为函数名称即可。
解码函数定义: function #NAME#\([^\)]+\){.*?};
除了实际的解码函数之外,我们还需要提取解码函数正在使用的一些实用函数。这些功能包含在一个对象中。在我们可以从 html5player.js 中提取对象定义之前,我们必须确定对象的名称。
这次只记得使用提取的函数定义作为正则表达式的输入。
辅助对象名称: ;([A-Za-z0-9]+)\.
对象名称将在第一个捕获组中。
使用对象名称和一些正则表达式,我们可以从播放器脚本中提取对象定义,就像我们之前对函数定义所做的那样。将 #NAME# 替换为上一步中的对象名称。
辅助对象定义: var #NAME#={.*?};
现在我们拥有了恢复加密签名所需的一切。
解码签名
最后一步是使用提取的函数对签名进行解码。要在 .NET 中完成此操作,我们必须解析并执行 JavaScript 代码。幸运的是,有现成的解决方案可以为我们做到这一点。其中之一是 JS 解释器 Jint. Another option is to use one of the Script Engines available in Windows. Simon Mourier provides an convenient wrapper around these engines in the following answer:
这是一个结合了上述所有步骤并使用 Simon 的包装器解码它在硬编码视频页面中找到的第一个签名并将编码和解码签名都打印到控制台的小示例程序。
代码是用 C# 编写的,但应该很容易将其转换为 VB .NET。
class Program
{
private const string PlayerScriptUrlTemplate = "https://s.ytimg.com/yts/jsbin/html5player-{0}/html5player.js";
private const string DecodeFunctionPatternTemplate = @"function #NAME#\([^\)]+\){.*?};";
private const string HelperObjectPatternTemplate = @"var #NAME#={.*?};";
private static readonly Regex SignatureRegex = new Regex(@"s=(?<Signature>[A-F0-9]+\.[A-F0-9]+)");
private static readonly Regex PlayerVersionRegex = new Regex(@"html5player-(?<PlayerVersion>[\w\d\-]+)\\/html5player\.js");
private static readonly Regex DecodeFunctionNameRegex = new Regex(@"\.sig\|\|(?<FunctionName>[a-zA-Z0-9$]+)\(");
private static readonly Regex HelperObjectNameRegex = new Regex(@";(?<ObjectName>[A-Za-z0-9]+)\.");
static void Main()
{
const string videoUrl = "https://www.youtube.com/watch?v=6pIyg35wiB4";
var client = new WebClient();
var videoPageData = client.DownloadString(videoUrl);
var encodedSignature = SignatureRegex.Match(videoPageData).Groups["Signature"].Value;
var playerVersion = PlayerVersionRegex.Match(videoPageData).Groups["PlayerVersion"].Value;
var playerScriptUrl = string.Format(PlayerScriptUrlTemplate, playerVersion);
var playerScript = client.DownloadString(playerScriptUrl);
var decodeFunctionName = DecodeFunctionNameRegex.Match(playerScript).Groups["FunctionName"].Value;
var decodeFunction = Regex.Match(playerScript, DecodeFunctionPatternTemplate.Replace("#NAME#", decodeFunctionName)).Value;
var helperObjectName = HelperObjectNameRegex.Match((decodeFunction)).Groups["ObjectName"].Value;
var helperObject = Regex.Match(playerScript, HelperObjectPatternTemplate.Replace("#NAME#", helperObjectName)).Value;
var engine = new ScriptEngine(ScriptEngine.JavaScriptLanguage);
var decoderScript = engine.Parse(helperObject + decodeFunction);
var decodedSignature = decoderScript.CallMethod(decodeFunctionName, encodedSignature).ToString();
// Jint variant
//var engine = new Engine();
//var decoderScript = engine.Execute(helperObject).Execute(decodeFunction);
//var decodedSignature = decoderScript.Invoke(decodeFunctionName, encodedSignature).ToString();
Console.WriteLine("Encoded Signature\n{0}.\n{1}", encodedSignature.Split('.').First(), encodedSignature.Split('.').Last());
Console.WriteLine();
Console.WriteLine("Decoded Signature\n{0}.\n{1}", decodedSignature.Split('.').First(), decodedSignature.Split('.').Last());
Console.ReadLine();
}
}
对不起大家,旧的 "html5player.js" 播放器不再工作,它是 404,您需要的 Url 现在看起来更像 https://s.ytimg.com/yts/jsbin/player-en_US-vfl_cdzrt/base.js
你六岁的初学者正在 javascript
中找到一个看起来像这样的函数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("")
}
之后我有点迷路了,因为 wr 函数的代码看起来完全一样,我找不到像 Youtube 过去使用的交换、替换、拆分函数的代码。
wr=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("")
}
wr.N0 我认为看起来像这样,但 javascript 然后超过我的工资等级让我了解发生了什么。
N0=function(a,b){Tb(nga,b)&&tm(H_(a),a.O,b,a.Pq,a)}