PHP: открыть сайт в виде картинки
это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2018/06/08.html
Товарищ спросил меня, как ему на PHP получить некий сайт в виде картинки? Я задумался — и правда, как? Только через phantomjs. Как мы помним, phantomjs — эмулятор браузера, который для сайтов делает вид, что это настоящий пользователь браузером зашел, но на самом деле его действия управляются не пользователем, а JS-скриптом. В нашем случае совсем простым:
getscreen.js
var W=1280,H=1600,URL='https://ya.ru',SHOTNAME='000del.png';
var system=require('system');
for(var i=1;i<system.args.length;i++) { var a=system.args[i];
if(-1!=a.indexOf('=')) { var l=a.split('='),b=a.substring(l[0].length+1); a=l[0];
if(a=='url') { URL=b; continue; }
if(a=='shotname') { SHOTNAME=b; continue; }
if(a=='width') { W=1*b; continue; }
if(a=='height') { H=1*b; continue; }
}
}
var page=require('webpage').create();
page.settings.userAgent="Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0";
page.viewportSize={width:W,height:H};
page.onLoadFinished=function(status){ page.render(SHOTNAME); phantom.exit(0); };
page.open(URL);
Запускаем из консоли:
Получаем shot.jpg:

Если кому-то захочется сделать публичный сервис (мне не хочется), то следует установить phantomjs у себя на хостинге, сложить в папку shot/ файлы getscreen.js и index.php, и вот пример, как работать с phantomjs из PHP:
<?php
if(isset($_GET['url'])) $URL=$_GET['url']; else die("url error");
if(!strstr($URL,'://')) $URL="http://".$URL; $URL=preg_replace("/[\"]+/s",'',$URL);
$W=(isset($_GET['width']) && 1*$_GET['width']!=0 ? 1*$_GET['width'] : 800);
$H=(isset($_GET['height']) && 1*$_GET['height']!=0 ? 1*$_GET['height'] : 600);
$TYPE=(isset($_GET['type']) && in_array($_GET['type'],array('jpg','png')) ? $_GET['type'] : 'jpg');
$file="./shot-".rand(0,999999).time().".".$TYPE;
exec('phantomjs --debug=false --disk-cache=false --ssl-protocol=any ./getscreen.js url="'.$URL.'" width='.$W.' height='.$H.' shotname="'.$file.'"',$o);
$fp=fopen($file,'rb');
header("Content-Type: image/".($TYPE=='jpg'?'jpeg':$TYPE));
header("Content-Length: ".filesize($file));
fpassthru($fp);
delete($file);
$t=time()-300; $g=array_merge(glob("./*.jpg"),glob("./*.png")); foreach($g as $l) { if(filemtime($l)<$t) delete($l); }
?>
И открывать браузером или wget: http://мойсайт/shot/index.php?url=lleo.me&width=800&height=600&type=jpg
Спасибо за внимание, может кому-то было полезно.
это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2018/06/08.html