0
<< предыдущая заметкаследующая заметка >>
08 июня 2018
PHP: открыть сайт в виде картинки

Товарищ спросил меня, как ему на 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);

Запускаем из консоли:


<?php
phantomjs 
--debug=false --disk-cache=false --ssl-protocol=any getscreen.js url="http://ya.ru" width=320 height=200 shotname="shot.jpg"

Получаем 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']!=1*$_GET['width'] : 800);
$H=(isset($_GET['height']) && 1*$_GET['height']!=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)<$tdelete($l); }
?>
?>

И открывать браузером или wget: http://мойсайт/shot/index.php?url=lleo.me&width=800&height=600&type=jpg

Спасибо за внимание, может кому-то было полезно.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок

Комментарии к этой заметке скрываются - они будут видны только вам и мне.

Оставить комментарий