【问题标题】:How to call external server page with PHP that includes JS?如何使用包含 JS 的 PHP 调用外部服务器页面?
【发布时间】:2011-09-27 08:57:56
【问题描述】:

有一个包含 JS 代码的网站。通常,当用户打开页面时,此 JS 代码会手动启动并提供大约 10 秒的链接。 我试图抓住这个链接。在 PHP 中,我使用 file_get_contents 函数调用此页面,但是正如您预测的那样,链接不存在。

有什么方法可以向这个页面发出 HTTP 请求并等到 javascript 代码启动。或者我可以使用 JQuery 来调用这个 JS 函数吗?

如果问题不清楚,我可以提供更多细节。提前致谢。

【问题讨论】:

  • 可以使用PHP中的sleep()函数等待10秒让JS执行。
  • 需要在file_get_contents之后调用sleep()吗?
  • 那没用,你会得到文本的内容,所以不会启动 JS 执行,因此sleep 是没用的。如果使用 JS 将链接添加到页面中,则必须实现其他方法,例如使用嵌入式浏览器。据我所知,这在 PHP 中是不可能的,但是 C#、Java、C++、Delphi 肯定有这样的浏览器。
  • 你提到JS代码是手动启动的。那么你是如何使用 file_get_content 函数的呢?

标签: php javascript jquery httprequest


【解决方案1】:

我建议查看页面上的 javascript 并反向工程链接是如何动态生成的。然后您可以使用正则表达式从 file_get_contents 返回的字符串中提取该信息。

如果您可以在相关页面(或类似页面)上提供额外信息,我可能会在逆向工程方面为您提供帮助。

更新: 经过一番反转,我发现 mp3 ripper 网站使用了 2 个 api:一个用于推送视频进行处理,一个用于戳当前状态。

第一个api:

http://www.youtube-mp3.org/api/pushItem/?item=http%3A//www.youtube.com/watch%3Fv%3DXXXXXXXX&xy=trve

第二个api:

http://www.youtube-mp3.org/api/itemInfo/?video_id=XXXXXXXX&adloc=

XXXXXXXX 是 youtube 视频 ID。第二个 api 返回 JSONP,其中填充是变量赋值 (info = {...};)。在 json 中有一个“h”成员,它返回一个长散列,可以用来最终构造 mp3 下载文件的链接。

但出于道德考虑,我是否可以建议研究另一种方法(如果您的托管环境允许)?您可以使用 FFmpeg 自行转换视频。这里有一个包装类:YouTube-to-MP3 conversion class

【讨论】:

  • 我正在谈论的网站是 this 如果我通过提供 youtube 视频 ID 调用此网页,它会生成结果,例如尝试 this 我的 php 中有视频 ID,并且我想在后台调用这个页面并返回 mp3 链接。
  • 您要获取指向实际 mp3 文件的链接,还是您点击“链接此 mp3”后网站提供的“直接链接”?
  • 哇!我对你的逆向工程感到惊讶。你对道德问题也是对的。我也会尝试实施你的建议。但可能这种转换需要很大的带宽。我也想知道你是怎么倒车的?我刚刚花了几个小时来了解机制。有什么方法可以提高我的逆向工程,还是只是经验?
  • =D。您所需要的只是一个浏览器来进行倒车。在这种情况下,我在检查器中使用 Chrome 的网络选项卡来跟踪后台 Ajax 调用。所以我想要精通它,你会想更好地了解 javascript 并知道如何使用浏览器的调试功能。经验方面,我从 2002 年开始设计网站。所以这也很有帮助。
  • @Dave 嘿,如果请求的视频没有缓存在他们的服务器上,第一个 api 通常会开始转换,但一两周后它就停止工作了。它不会开始转换。因此,如果视频在他们的服务器上被缓存,则第二个 api 仅返回 JSON 数据,否则返回 nil,因为您无法开始新的转换。第一个 api 的 URL 是否更改或什么,请检查,这是我的问题:stackoverflow.com/questions/8763141/…
【解决方案2】:

Javascript 在客户端执行,需要一个解释器来执行。执行 HTTP 请求调用的 PHP 服务器不会解释任何 javascript,它只会检索 HTML。

你可以使用HtmlUnit之类的软件发出请求并执行javascript,然后在执行完成后查看是否可以提取链接。这取决于您对执行 PHP 的服务器的访问权限。

或者您可以研究您所定位的网站使用的 JS 文件,确定它是如何请求该链接的,看看您是否可以直接自己获取它。请记住,您正在直接研究该网站的工作方式,因此这不会是一个特别优雅的解决方案,并且他们的 JS 中的单个更改可能会导致您的应用程序失败。这很公平,因为他们可能有这个过程来阻止人们以您描述的方式获取链接。

【讨论】:

    【解决方案3】:

    file_get_contents 仅获取所请求 URL 的 HTML 源代码,它不会为您执行 javascript 代码,也不会使用它的所有事件模拟 dom。

    简短的回答是,这不容易做到。您可以做的一件事是解析源代码并在其中查找链接,例如 Dave suggested

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      相关资源
      最近更新 更多