{imgicourl}{zamok}
<< предыдущая заметкаследующая заметка >>
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);

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

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

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

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий
Windows Firefox
 Санкт-Петербург
0
0
72641545
Не везде можно ставить на хостинг что захочешь.
Это должен быть очень свой хостинг.
Обычно даже консоли нет.
Linux Ubuntu Firefox
 Москва
1
0
Leonid Kaganov
А зачем вам это на хостинге?

Нет, я еще понимаю, вы бы поставили мой движок, и вам бы понадобился phantomjs чтобы делать автоматические копии своих заметок в Фейсбук... Но так-то зачем?

А если вам поручат писать на этом принципе сложную систему, где понадобятся снимки сайтов или превьюшки url... то вам на работе, я полагаю, выделят для этой задачи нормальный хостинг.

Если объясните, зачем вам это надо, я вам дам ссылку в личке.
Linux Safari Chrome
 Санкт-Петербург
0
0
Tupik
Я не пользуюсь фейсбуком и удалил там все акки давно. Но имею базу неких личных ссылок на разные сайты, которую хотелось обработать, в том числе иметь маленький скриншот к каждой ссылке, просто для красоты. Это не объяснение нужности, а лишь мотив. Давно подумывал. Чужой сервис не нужен, может возникнуть большая нагрузка в момент создания тысяч скриншотов. Сам как-нибудь, позже.
Windows Firefox
 Мурманск
0
0
anonymouse69
Ллео, Вы комментарии там закрыли, отвечу Вам здесь, вспомните Известия, 2011 год. Вы им заметку написали "как Москва расширялась", они, правда, её по-своему обозвали.
Вы видео до конца хоть досмотрели?
Windows Firefox
 Эстония
0
0
Christian Archer
Если есть консоль, то у фантома можно просто экзешник закинуть
Linux Safari Chrome
 Петрозаводск
6
1
Уведомления (#7275080)
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Шел 2018-й год, у каждого третьего школьника было по дюжине инстансов на DO, а криворукие лемминги продолжали, как и 20 лет назад, трахаться с убогим ftp и кривыми дорогущими "хостингами"... Я вижу в этом некую вселенскую справедливость.
Linux Safari Chrome
 Санкт-Петербург
1
0
Tupik
У каждого третьего школьника есть банковская карта? Как интересно... Вряд ли из 30 школьников один хотя бы просто слышал о DigitalOcean
Mac Safari
 Израиль
5
0
braintunic
2018-й год, у каждого третьего школьника есть вложения на дюжине криптовалютных бирж и дюжина аккаунтов PayPal, а криворукие лемминги продолжают, как и 20 лет назад, трахаться с убогими аналоговыми банковскими картами ;)
Linux Safari Chrome
 Санкт-Петербург
1
0
Tupik
А вселенская справедливость где?..
Linux Firefox
 Washington
1
0
Михаил (#1684620)
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Банковские карты с самого начала были цифровыми. Там даже шрифт специальной формы и выпуклый, чтобы при передаче по аналоговому каналу (прокатывании через копирку) оставаться машиночитаемым.

А теперь-то уж во всех есть встроенный «чип» (этот прогресс даже до Асашая несколько лет назад дошёл).
Linux Ubuntu Firefox
 Владимир
0
0
Adamos
> криворукие лемминги продолжали, как и 20 лет назад, трахаться с убогим ftp и кривыми дорогущими "хостингами"...

Уй, мадам, натурально, вы не понимаете.
Шареды - это, конечно, убого и стремно. Но!
Вот я могу взять хотя бы VPS, настроить-разместить там сайт и почту и самостоятельно это поддерживать. Но у меня нет заместителя, который будет это делать, пока я летаю рикошетом по Италии, и вот уже во второй квартире опять нет вайфая. Да и админить сервер с айПада - это полный айБолит. Поэтому я осознанно терплю минусы шареда (оплачивая приличный, который не роняют ежедневно борзые соседи). И в тех редких случаях, когда с ним (а значит, и с CRM, и с корпоративными почтовыми ящиками) проблемы - их необязательно решать именно мне. Как это в рекламе - "priceless"?..
Правда, SSH-доступ к этому хостингу у меня, конечно, есть. Его сейчас и на дешевых-то несложно найти.
Linux Safari Chrome
 Redmond
0
0
Андрей Андрей (#7141781)
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
А фантом жив ещё?.. у нас все вокруг селенуимом пользуются.
Linux Safari Chrome
 Redmond
2
0
Андрей Андрей (#7141781)
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
https://github.com/ariya/phantomjs/issues/15344. Как и ожидалось, загнулся.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Простите, Андрей, а как их вообще можно сравнивать? Phantomjs - это готовый headless-браузер, управляемый программно. Selenium - система эмуляции команд юзера к существующему браузеру.

Как вам мыслится использовать selenium для утилитарных задач типа моих (постинг заметки в Фейсбук минуя его API - корявое, урезанное по функционалу и постоянно меняющееся)? Вы предложите мне для этой цели завести отдельную машину (или отдельную виртуальную машину), взгромоздить туда честный браузер и управлять им при помощи selenium? Зачем? Я же не тестировщик сайтов?

Или я чего-то не знаю, и selenium теперь умеет выполнять те же задачи, что и фантом, не требуя ничего лишнего?
Linux Firefox
 Литва
6
0
oreolek.ru@oreolek (oreolek.ru)
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Сейчас в Chrome и Firefox добавили headless-режим, фантом закрылся.

Один из современных пакетов - это Puppeteer, у него заодно есть готовый и уже настроенный PHP-пакет composer. (Но в репозиториях такой Дикий Запад, что через полгода спокойно может начаться новая мода.)
Windows Firefox
 Эстония
9
0
Christian Archer
Фантом, как сказали выше, уже загнулся, щас модно использовать гугель хром(иум) в безголовом режиме

chrome --headless --disable-gpu --screenshot --window-size=1280,1696 https://www.chromestatus.com/

или даже сделать пдф

chrome --headless --disable-gpu --print-to-pdf https://www.chromestatus.com/
Linux Ubuntu Firefox
 Одесса
0
0
Azimut
Спасибо за Ваши варианты.
Я обычно делал виртуальный X, туда файрфокс со ссылкой и что-то типа:
DISPLAY=my_ip:1 import -window root -crop 998x523+1+107 -verbose screen.jpg

это удобнее, когда нужен специфического броузера скрин и не весь экран. Но Леонида совет удобнее и консольнее.
Linux Firefox
 Эстония
0
0
Christian Archer
Headless режим не нуждается в иксах и сделан ровно для того же, для чего и фантом
Windows Safari Chrome
 Отрадное
2
0
https://facebook.com/1290759067606159
Леонид, не читали эту историю? https://meduza.io/feature/2018/06/03/anna-delvi-vela-roskosh[...]
Это же Лена Сквоттер в реальной жизни!
Windows Safari Chrome
 Нидерланды
2
0
Сергей
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Для нечастого получения скриншотов сайтов разумно воспользоваться Апи уже готовых сервисов. Для "личного" разового применения - в браузер расширение. И то и другое гуглится по словам "скриншот сайта"..., это чтобы не рекламировать лишнего.
Гугл тоже умеет делать скриншоты - гуглить по слову "google-secret-screenshot-api".
Windows Firefox
 Санкт-Петербург
0
0
72641545
А вот это интересно, надо попробовать.

for quickly generating a screenshot without needing to install anything, it's pretty good.
Linux Ubuntu Firefox
 Израиль
0
0
200-1.95M
Леонид, а что с биноник? Пожалуйста, можно ли использовать Ваш биноник как платформу комментирования вместо disqus, discourse? Сообщество https://disqus.com/home/channel/notthejerusalempost/ ищет замену disqus
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Нет. Биноник для частных лиц, а не для политических сообществ.
Linux Ubuntu Firefox
 Израиль
0
0
200-1.95M
Спасибо за ответ
Windows Safari Chrome
 Москва
0
0
https://plus.google.com/110370047265887421839
А если не секрет, зачем такое может понадобиться?

А вообще идея довольно порочна. Мало того, что даже у популярных браузеров рендер может отличаться, так еще и куча сайтов уже после загрузки с помощью JS дорисовывается. Что-то мне подсказывает, что оно только для совсем простых страниц будет давать более-менее адекватный результат.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Сам не в курсе.
Linux Ubuntu Safari Chrome
 New York
1
0
Кто здесь?
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
да элементарно: вот надо вам, к примеру, автоматически сформировать превью ссылки, чтобы не открывая ее можно было хотя бы представить, что там?

Конечно, сайт можно написать так, что это будет серый квадратик, "а потом скриптом дорисует" - ну и не пойдет туда никто, и слава всевышнему.
Linux Ubuntu Firefox
 Владимир
0
0
Adamos
> А если не секрет, зачем такое может понадобиться?

Например, чтобы вставить в пост во ВКонтакте табличку, нужно сделать картинку с этой табличкой. Сам в шоке, но они таки считают это нормальным...
Windows Safari Chrome
 Израиль
1
0
coolwolf0
Что-то непонятное делается в последней строке. Файл уже удален, но зачем-то дополнительно ищутся и подтираются графические файлы старее чем 300 тиков тому назад.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Ну вы себе хорошо предоставляете работу веба? Скрипт может завершится в любой момент, клиент может сбросить соединение, да и просто сбои бывают. Через три года в парке может накопиться 100500+ файлов.
Windows Safari Chrome
 Израиль
0
0
coolwolf0
Ну последние три года я только для веба и программирую. В PHP есть конструктор временных файлов, которые стираются после отработки запроса (через деструктор). И вообще, хозяйственные дела (типа уборки мусора), сам веб-сценарий не должны засорять. Впрочем, для такого демо-скрипта это приемлемая стратегия.
Linux Ubuntu Firefox
 Владимир
1
0
Adamos
Вызов деструктора в РНР не гарантирован по стандарту языка.
Впрочем, чистка каждым скриптом - это только если он реально вызывается раз в году. Иначе логичнее использовать cron.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Так если файлов нет, glob вернёт пустое значение, и никакой чистки нее будет. О каких затратах речь?
Windows Safari Chrome
 Таджикистан
0
0
1234567 (#7304119)
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Думаю что будет трабла с подгружаемыми шрифтами
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Не факт. Это ж полноценный браузер.
Windows Firefox
 Москва
0
0
kuz
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
а что с датчиком погоды? колбасит не по детски )
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Ой, не до него...
Windows Firefox
 Санкт-Петербург
0
0
72641545
Там просто датчик накрылся, но второй-то работает! Наведите мышку и смотрите Т станции.
Windows Safari Chrome
 Washington
0
0
Алексей Пискарев
Спасибо за обзор! Мне пригодится.
Linux Ubuntu Firefox
 Россия
0
0
папа карло (#7118174)
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
upd. комменты не читай, сразу отвечай, выше уже все сказали. тем не менее:
PhantomJS development is suspended until further notice [1]
Headless Chrome is shipping in Chrome 59. It's a way to run the Chrome browser in a headless environment. [2]
1. http://phantomjs.org/
2. https://developers.google.com/web/updates/2017/04/headless-c[...]
Linux Ubuntu Safari Chrome
 New York
0
0
Кто здесь?
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
это что же, надо Хром на сервере ставить?
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Это-то и пугает, чесно говоря. Особенно если представить, как он 30 секунд всякий раз запускается...
Linux Safari Chrome
 Новосибирск
0
0
taskmgr
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Его там один раз достаточно запустить, а потом просто новые сессии использовать. Довольно быстро работает. И реально лучше фантома на устаревшем движке, который больше нигде, кажись и не используется (в сафари мож, не знаю?). Фантом у меня на современных сайтах, нафаршированных реактом/ангуляром местами просто падал.
Linux Firefox
 Эстония
0
0
Christian Archer
Там процесс эквивалентный не полноценному бразуеру, а одной вкладке. Фантом запускает по сути такой же хром, только древний (Webkit + V8)
Linux Firefox
 Эстония
0
0
Christian Archer
да, и он за собой иксы притянет :(
но джава и эрланг тоже их тянут, к слову
Linux Firefox
 Санкт-Петербург
0
0
aim
phantomjs мёртвый проект. т.к. google наконец-то сделал так, чтобы chrome запускался в режиме headless. лучше на него не ориентироваться.


https://github.com/ariya/phantomjs/issues/15344
Mac Safari
 Израиль
3
0
braintunic
Как отличить истинного программиста?
Он никогда не читает код, написанный другими, а уж тем более чужие комменты ;)
Mac Safari Chrome
 Нижний Новгород
0
0
tartaglione
Когда-то прочитал я ассемблерный код ядра OS RT-11, потребовалось по работе...

Чужой код читать интересно и поучительно. Ну - если посмотреть тут выше - по крайней мере, бывает интересно. Также чужой код и чужие на любом языке комментарии много интересного говорят об авторе.

Но, действительно, почему-то мой код никто никогда не читал (
Linux Ubuntu Safari Chrome
 New York
0
0
Кто здесь?
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
интересная штука.
Но обычно пользовался другой, которая из HTML делает картинку, как оно там, wkhtmltopdf ...

Возможно этот на основе того, или наоборот.
Mac Safari Chrome
 Германия
0
0
unclegluk
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Оффтоп. Можно ссылку на музыку со дня рождения?
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Музыку, в смысле которая в ролике играет у Саши Кириченко? Если не изменяет память, сперва идёт "Прекрасное далеко" или что-то в этом стиле столь же прекрасное из советского детства. Затем куски из оперы Виктора Аргонова "Русалочка", ну где женский вокал с текстом. Ну а затем... великий Архиповский на балалайке исполняет собственную композицию "Золушка":

8gm_RKqeUNA


Это бесконечно прекрасно. Возможно, для того Бог и создал Россию, чтобы спустя много-много веков Архиповский так сыграл на балалайке?
Mac Safari
 Израиль
0
0
braintunic
> для того Бог и создал Россию, чтобы спустя много-много веков Архиповский так сыграл на балалайке

Вот-вот — из пушки по воробьям!
Лучше бы всемогущий Бог добавил к балалайке четвертую струну — чтобы несравненному Архиповскому стало чуть полегче ;)
Linux Safari Chrome
 Москва
1
0
Leonid Kaganov
Бог бас-гитарист?! Это многое объясняет.
Mac Safari
 Москва
0
0
bambr
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Нет Лео, Бог не бас гитарист, но возможно он вдохновил Россию на производство звукоснимателя для исконно русского инструмента, и передатчика, вдовесок хорошей звукоусиливающей аппаратуры типа Marshall или Trace Elliot. Архиповский действительно великий, играет с душой и светится изнутри.
CA81UVPCb9Q
Linux Safari Chrome
 Москва
0
0
Tupik
Offtop: эта новая система блокировок каментов весьма неудобна, поскольку при пальцеыом управлении включается самопроизвольно от лёгкого движения руки. Получаются обрывки комментариев и недоумение. Свайпнешь, чтобы прокрутить экран а вместо этого что-то исчезает.
Linux Ubuntu Safari Chrome
 Киров
0
0
Koha (#6647409)
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
man cutycapt

всего комментариев: 56

<< предыдущая заметка следующая заметка >>