php中的html2canvas自定义代理

时间:2013-01-22 02:58:23

标签: php proxy html2canvas

这是我在这里的第一个问题,所以很好....

我正在尝试使用html2canvas最终获取远程站点的屏幕截图(用户提交的网址)。

问题是跨域安全功能。我无法从画布中读取,因为它被非现场资产锁定。

解决方案是使用库中内置的代理功能。

有一些github项目有python和node.js版本,但我需要在php中进行。

关于如何实现该功能以及如何使其工作有很多主题,但没有一个真正解释如何制作自己的代理。

我的问题是双重的,PHP中是否存在任何现有解决方案?如果没有,我有几个问题要自己做: 1.)代理的输出格式是什么? json对象?渲染图像? base64编码的数据字符串? 2.)这些文件是否需要在服务器上保留,或者它们是否可以呈现然后消失(覆盖)?

这正是我的想法:

$img_url = urldecode($_GET['url']);
$img_data = base64_encode(file_get_contents($img_url));
//shouldn't need it since it's not cross domain now, but a CORS header could be inserted
header('content-type: application/json; charset=utf-8');
json_encode("{$_GET['callback']}($img_data)");

2 个答案:

答案 0 :(得分:0)

我找到了问题的答案。 代理功能接受带有代理映像的url的jsonp元素。

时,它们确实需要保存在服务器上

这是原始的,我稍后会更新它,但这里是html2canvas的一个有用的PHP代理脚本

session_start();
//parse the url sent by the proxy function
//TODO: scrub the input
$img_url = urldecode($_GET['url']);

//test file type
//TODO: test for other cases that don't have a '.'
$pos = strrpos($img_url, '.', -1);
$ext = substr($img_url, $pos);

//set a dir for this request
function randomNumber()
{
    return substr(sha1(rand()), 0, 15);
}

if (!isset($_COOKIE["img_path"]))
{
    do{
        $random = randomNumber();
    }while (is_dir('images/' . $random));

    setcookie("img_path", $random, time()+3600);

} else {
    $random = $_COOKIE["img_path"];
}

is_dir('images/' . $random) ? '' : mkdir('images/' . $random, 0755);

//TODO:catch cases where a filename isn't the last element
$basename = basename($img_url);

$file = 'images/' . $random . '/' .  $basename;

//save the image
copy($img_url, $file);

//TODO: don't hardcode the url
$test_location = "http://osc.test/html2canvas2/" . $file;

header('Content-Type: application/javascript');

echo  "{$_GET['callback']}(" . json_encode($test_location) . ")";

答案 1 :(得分:0)

如果其他人正在寻找一个简单的PHP代理,这里有一个链接到一个很好的“Cowboy”Ben Alman:

Simple PHP proxy