解包JavaScript(p,a,c,k,e,d)函数

时间:2017-01-20 13:42:22

标签: javascript c# uwp

我有一个UWP应用,我使用HtmlAgilityPack来解析一些网页并在应用中显示信息。现在我遇到了一个页面,我需要执行一个函数来获取文档的下一个链接 我在一个空白的UWP JavaScript应用中运行了特定代码,并且能够看到该链接。但我不知道如何在C#中运行该功能。由于它是一种不同的语言,我是否需要创建自己的一组函数来从数据中获取信息,或者我是否必须链接任何JavaScript库(如果可能的话)来执行操作?

这是我从页面获取的function,为了能够进一步导航,我需要运行它并从中生成string

eval(function (p, a, c, k, e, d)
{
while (c--)
    if (k[c])
        p = p.replace(new RegExp('\\b' + c.toString(a) + '\\b', 'g'), k[c]);
return p
} ('3("3a").39({38:"6://5.1c.1b.1a:19/37/v.36",35:"6://5.1c.1b.1a:19/i/34/33/15.32",31:"",30:"2z",2y:"2x",2w:2v,2u:"8",2t:"2s",2r:[],2q:{2p:\'#2o\',2n:22,2m:"2l",2k:0}});b f;b k=0;b 7=0;3().2j(2(x){a(7>0)k+=x.18-7;7=x.18;a(0!=0&&k>=0){7=-1;3().2i();3().2h(2g);$(\'#2f\').j();$(\'h.g\').j()}});3().2e(2(x){7=-1});3().2d(2(x){17(x)});3().2c(2(){$(\'h.g\').j()});2 17(x){$(\'h.g\').2b();a(f)2a;f=1;$.29(\'6://12.9/16-28/27.16?26=25&24=15&23=21-20-1z-1y-1x\',2(14){$(\'#1w\').1v(14)})};3().1u(\'1t\',2(){b 13=3().1s();13.1r(\'1q\',2(){11.10(\'z-y\')[0].w[1].1p="6://12.9";11.10(\'z-y\')[0].w[1].1o="<u>1n - 1m 1l 1k & 1j</u>"});a($.c(\'4\')=="d"){t.s("6://r.q.p/o/8.n","m 9 1i",e,"l")}1h{t.s("6://r.q.p/o/d.n","m 9 1g",e,"l")}});2 e(){$.c(\'4\')==\'8\'?4=\'d\':4=\'8\';$.c(\'4\',4);1f.1e.1d()};', 36, 119, '||function|jwplayer|primaryCookie||http|p09821659|html5|to|if|var|cookie|flash|switchMode|vvplay|video_ad|div||show|tt9821659|button2|Switch|png|images|tv|flashx|static|addButton|this|center||childNodes||featured|jw|getElementsByClassName|document|streamin|container|data|sgqbf1k6kqfh|cgi|doPlay|position|8777|106|81|79|reload|location|window|Flash|else|HTML5|Storage|Sharing|Video|Free|Streamin|innerHTML|href|contextmenu|addEventListener|getContainer|ready|on|html|fviews|3a8183ea9a69ef9630b94e14f10dd735|1484917924|186|182|9821659||hash|file_code|view|op|index_dl|bin|get|return|hide|onComplete|onPlay|onSeek|play_limit_box|false|setFullscreen|stop|onTime|backgroundOpacity|Arial|fontFamily|fontSize|FFFFFF|color|captions|tracks|start|startparam|primary|326|height|580|width|2567|duration|skin|jpg|01964|01|image|mp4|tcipboyrkduzcg3h5gtcldvuyiloqwnoa5padad4cgy4d5wmp77locnp4ypa|file|setup|vplayer'.split('|')))

那么有可能在C#中实现它吗?如果是,那我该怎么做? 感谢。

[修改]
我在寻找方法时找到了this。它非常相似,但仍需要一些调整才能完成。我理解它的某些部分,但Regex部分是不合适的 有没有人知道它是否可以适应我的情况?

1 个答案:

答案 0 :(得分:1)

我发现了this(上面也提到过)关于如何做的好文章。有人在C#中使用Regex来解决他们自己的问题。我很高兴地说它对我有所帮助,所以我将把它放在这里以防将来有人需要它。

string inputHtml = @"the function you get from scraping the page";
string[] data = Regex.Match(inputHtml, "'([a-zA-Z0-9_|]{30,})'").Groups[1].Value.Split('|');

上面的代码片段将为您提供一系列不同的字符串,您可以查看它们以获取您需要获取的任何信息。
我也在2个网站上取得了一些进展,我将分享我使用过的代码,以便将来可以帮助其他人。

我正在使用我的应用中的以下代码段来获取“estream.to”“streamin.to”的视频链接。

if (videoLink.Host == "estream.to")
{
   IEnumerable<HtmlNode> links = doc.DocumentNode.Descendants("script").Where(l => l.Attributes.Contains("type") && (l.InnerText.Contains("mp4") || l.InnerText.Contains("m3u8")) && l.InnerText.Contains("(p,a,c,k,e,d)"));
    foreach (var link in links)
    {
       value = link.InnerText;
       if (value.Contains("mp4"))
       {
          value = link.InnerText;
          break;
       }
    }
    string[] data = Regex.Match(value, "'([a-zA-Z0-9_|]{30,})'").Groups[1].Value.Split('|');
    if (data.Count() > 20)
    {
       value = string.Format("https://{0}.{1}.{2}/hls/{3}/index-v1-a1.m3u8", data[10], data[4], data[3], data[17]);
    }


    }
    else if (videoLink.Host == "streamin.to")
    {
         IEnumerable<HtmlNode> links = doc.DocumentNode.Descendants("script").Where(l => l.Attributes.Contains("type") && (l.InnerText.Contains("mp4") || l.InnerText.Contains("m3u8")) && l.InnerText.Contains("(p,a,c,k,e,d)"));
    foreach (var link in links)
    {
       value = link.InnerText;
       if (value.Contains("mp4"))
       {
           value = link.InnerText;
           break;
       }
    }
    string[] data = Regex.Match(value, "'([a-zA-Z0-9_|]{30,})'").Groups[1].Value.Split('|');
    if (data.Count() > 20)
    {
        List<int> ip = new List<int>();
        for (int x = 41; x <= 50; x++)
        {
           //check ip
           int val = 0;
           int.TryParse(data[x], out val);
           if (val != 0)
           {
              ip.Add(val);
           }
        }
        if (ip.Count > 0)
        {
           int[] ipValue = ip.ToArray();
           string secondParam = "";
           for (int x = 0; x < data.Count(); x++)
           {
               // string length is more than 50
               if (data[x].Length > 50)
               {
                  secondParam = data[x];
               }
           }
  // Edit: I have come across a problem with this so I am updating the answer.
           if (ipValue.Count() == 4)
           {
              value = string.Format("http://5.{0}.{1}.{2}:{3}/{4}/v.mp4", ipValue[3], ipValue[2], ipValue[1], ipValue[0], secondParam);
           }
           else if (ipValue.Count() == 5)
           {
              value = string.Format("http://{0}.{1}.{2}.{3}:{4}/{5}/v.mp4", ipValue[4], ipValue[3], ipValue[2], ipValue[1], ipValue[0], secondParam);
           }
           else
           {
              // this is where the problem occurs 
           }
        }
    }

希望它可以帮助任何人:)。感谢让这一切成为可能的人。

<强>更新
我发现“streamin.to”在不同的地方使用不同的算法。到目前为止,我认为有3种类型的代码。

  1. IP从“5.x.x.x:x”开始,代码中有最后4个部分,但必须由您提供5个部分。
  2. IP启动方式不同,但代码中提供了IP的所有部分,因此这里没有什么可担心的。
  3. IP再次以不同的方式启动,但是从所有5中只有3部分IP可用。根据我的经验,我得到了“x.92.x.211:8777”,因为有2个地方未知它是错误的{{1并且在整个代码中没有关于如何使这些丢失的其他信息。
  4. 希望这可能是我正在使用的代码片段的一些问题。也许玩它可能会对它有所启发。