{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
 Санкт-Петербург
0
0
Tupik
А вселенская справедливость где?..
Linux Firefox
 Washington
0
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://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 Firefox
 Москва
1
0
другой Фыва Jr Олдж
Вот почему мне пофигу OpenSource так это потому, что я никогда не читаю эти "открытые исходники". И почему я больше уважаю проприетарный софт -- в нём нет "открытых исходников" в которые любой мудак может поместить всё что угодно, а я это не замечу по причине того, что "я никогда не читаю эти "открытые исходники". И этот опенсорсный софт сразу после запуска или чуть позже сотрёт к ебеням всё что у меня находится в директории /home.

PS: про то, что сам Linux опенсорсный я в курсе, но Linux'у я доверяю, особенно дистрибутивам от RedHat, а вот какой-нибудь опенсорсной тулзе вне дистрибутива, а просто загруженной с какого-нибудь гитхаба (гореть ему в аду, будем надеяться что майкрософт после покупки пустит его по пизде как делал со всем тем, что он покупал -- такая вот у майкрософта борьба с конкуренцией и монополизация) -- такому говну я никогда не верил и не верю.
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: эта новая система блокировок каментов весьма неудобна, поскольку при пальцеыом управлении включается самопроизвольно от лёгкого движения руки. Получаются обрывки комментариев и недоумение. Свайпнешь, чтобы прокрутить экран а вместо этого что-то исчезает.

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

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