【问题标题】:Get jsFiddle result iframe source code with php用php获取jsFiddle结果iframe源码
【发布时间】:2016-05-26 04:04:10
【问题描述】:

我有一个 jsFiddle,在 https://fiddle.jshell.net/DelightedDoD/yu6nekv4/show/light/ 过着幸福的生活

如果我导航到view-source:https://fiddle.jshell.net/DelightedDoD/yu6nekv4/show/light/,我可以查看我的小提琴的完整渲染源代码。

我需要在 php 脚本中获取这个完整的渲染源代码。

这是我尝试过的:

file_get_contents():

$src = file_get_contents('https://fiddle.jshell.net/DelightedDoD/yu6nekv4/show/light/');
echo '<textarea>'.$src.'</textarea>';

卷曲:

$ch = curl_init('https://fiddle.jshell.net/DelightedDoD/yu6nekv4/show/light/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);
echo '<textarea>'.$content.'</textarea>';

在这两种情况下,我最终得到的是 将我的小提琴源代码呈现为 iFrame 的页面的源代码 不是 我的源代码真正的小提琴

要查看结果,请转至http://dodsoftware.com/shared-resources/php/jsfiddle-mobile-bs-frame.php

有什么方法,我可以使用 PHP 复制通过 view-source: 获得的结果,或者至少获取值然后将其发送到我的 php 脚本?

【问题讨论】:

标签: javascript php curl file-get-contents jsfiddle


【解决方案1】:

您只需将 curl 选项中的 referer 设置为您正在加载的同一页面:

$url = 'https://fiddle.jshell.net/DelightedDoD/yu6nekv4/show/light/';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER, $url);
$content = curl_exec($ch);
curl_close($ch);
echo '<textarea>'.$content.'</textarea>';

【讨论】:

  • 是的,就是这样。你介意简单解释一下为什么我们需要设置referer吗?我阅读了this,但还不是很清楚。我猜是这样服务器会在 url 中看到创建内容或将其定向到正确端点所需的信息?
  • @DelightedD0D - 我只能猜测并说 jshell.net 上可能有一些服务器端检查引用并相应地提供 iframe 内容,因为它具有相同的 src url作为页面本身。
【解决方案2】:

试试:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://fiddle.jshell.net/DelightedDoD/yu6nekv4/show/light/"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$headers = array();
$headers[] = 'Connection: keep-alive';
$headers[] = 'Referer: http://fiddle.jshell.net/DelightedDoD/yu6nekv4/show/light/';
$headers[] = 'DNT: 1';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';
$headers[] = 'Accept-Language: en-US,en;q=0.8';
$headers[] = 'Cache-Control: max-age=0';
// $headers[] = 'Accept-Encoding: gzip, deflate, sdch';
$headers[] = 'Host: fiddle.jshell.net';
$headers[] = 'Upgrade-Insecure-Requests: 1';

$headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.10 Safari/537.36';


curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$server_output = curl_exec ($ch);

curl_close ($ch);

echo '<textarea>'.$server_output .'</textarea>';

【讨论】:

  • 这似乎会创建编码或损坏的输出,请参阅phpfiddle.org/lite/code/8kvm-iveu 并按“运行”
  • 哦对了,那是因为gzip编码头的原因,去掉它就可以解决问题,但是解决方法和billynoah一样,都是考虑referer。
  • @vp_arth 你是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多