YouTube签名破译与 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 我有指向该文件的链接。

我还发现了这个帮助我开始的 https://mytoolkit.codeplex.com/discussions/479171。但是从Sign_Decipher开始,我在js文件中找不到这样的调用函数。

找到的其他一些链接,但没有帮助我让它运行或太旧:

  • 获取优酷视频的签名
  • Youtube破译签名未按预期工作
  • 如何解密签名并将其添加到目标 c 中的 YouTube 提取网址?
  • 使用 PHP 或 JS 解码 Youtube 密码签名的最佳方法
  • 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 也以某种方式不起作用:

  • http://ytapi.gitnol.com/
  • http://api.gitnol.com/

您提供的链接网站已经包含解决此问题所必须知道的所有信息。大多数工作都可以通过一些简单的正则表达式来完成。以下是解码此类加扰签名所需的步骤:

    下载要
  1. 下载的视频页面使用的html5player.js该播放器
  2. 确定用于解码编码签名的函数的名称。
  3. 使用此名称,从脚本中提取函数定义。
  4. 在 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-([wd-]+)\/html5player.js

可以在第一个捕获组中找到该版本。

提取解码函数

在提取函数之前,我们必须知道它的名称。不幸的是,解码功能的名称可能会因版本而异,但使用此函数的代码部分通常不会更改。

解码功能名称:.sig||([a-zA-Z0-9$]+)(

函数名称将位于第一个捕获组中。

现在我们知道了名称,我们可以再次使用正则表达式提取函数。只需将 #NAME# 替换为函数名称即可。

解码函数定义:function #NAME#([^)]+){.*?};


除了实际的解码函数之外,我们还需要提取解码函数正在使用的一些实用程序函数。这些函数包含在对象中。在从 html5player 中提取对象定义之前.js我们必须确定对象的名称。

请记住,这次使用提取的函数定义作为正则表达式的输入。

帮助程序对象名称:;([A-Za-z0-9]+).

对象名称将位于第一个捕获组中。

使用对象

名称和一些正则表达式,我们可以从播放器脚本中提取对象定义,就像我们之前使用函数定义一样。将 #NAME# 替换为上一步中的对象名称。

帮助程序对象定义:var #NAME#={.*?};

现在,我们有了恢复加扰签名所需的一切。

解码签名

最后一步是使用提取的函数对签名进行解码。为了在.NET中完成此操作,我们必须解析并执行JavaScript代码。幸运的是,有现成的解决方案可以为我们做到这一点。其中之一是JS解释器Jint。另一种选择是使用 Windows 中可用的脚本引擎之一。Simon Mourier在以下答案中提供了这些引擎的便捷包装器:https://stackoverflow.com/a/4748886/1278838


这是一个小示例程序,它结合了上述所有步骤,并使用 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>[wd-]+)\/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 Signaturen{0}.n{1}", encodedSignature.Split('.').First(), encodedSignature.Split('.').Last());
        Console.WriteLine();
        Console.WriteLine("Decoded Signaturen{0}.n{1}", decodedSignature.Split('.').First(), decodedSignature.Split('.').Last());
        Console.ReadLine();
    }
}
<</div> div class="one_answers">

对不起,人们,但旧的"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("")
}

水利。N0 我认为看起来像这样,但 JavaScript 然后超出了我的工资等级,让我了解正在发生的事情。

N0=function(a,b){Tb(nga,b)&&tm(H_(a),a.O,b,a.Pq,a)}

相关内容

  • 没有找到相关文章

最新更新