lleo (lleo) wrote,
lleo
lleo

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);

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

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']!=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
Tags: программирование
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments