Скриншоты Zabbix на рабочем столе

У нас в офисе стоит 40" телевизор с подключенным неттопом под управлением Windows 8.1, которые используются для проведения презентаций, докладов и пр. Большую часть времени телевизор простаивает и на него выводится Рабочий стол или Экран блокировки. Было решено использовать экран для вывода информации от Zabbix через обои. Поиск в Google навывел только на вывод графиков через API или сохранение их по URL. Нам же были интересны Dashboard, Overview и Complex screen.

Предполагается, что приложение будет делать снимки сайта по расписанию или через планировщик Windows будет выполняться приложение, осуществляющие снятие скриншотов Zabbix по заданным URL. Приложение должно уметь авторизовываться через POST-запрос, а также обрабатывать AJAX.

Решение было найдено в виде PhantomJS - "обезглавленной" кросс-платформенной реализации WebKit с JavaScript API.

Общий подход:

var page= require('webpage').create(), server = 'http://site/index.php',
	data = 'name=name&password=password';
page.open(server, 'post', data, function(){
	page.clipRect = { top: offset_top, left: offset_left, width: width, height: height };
	page.render('image_file');
});
page.open() - открываем страницу, передаем POST-запрос для авторизации и выполням функцию;
page.clipRect() - обрезаем видимую область до необходимой, указав смещение от верхнего левого угла, ширину и высоту области на выходе. Если не использовать данный метод, то в выходном файле будет снимок всей страницы;
page.render() - сохраняем изображение в файл.

Реализация:

1. Создаем в Zabbix нового пользователя wallpaper: это необходимо в первую очередь для того чтобы зафиксировать представления экранов/страниц Zabbix, настройки и темы оформления.

2. Скачиваем и распаковываем PhantomJS.

3. Создаем файл zabbix.js:

var zabbix = 'http://zabbix/';
var zabbix_user = 'wallpaper';
var zabbix_password = 'password';
var pageWidth = 1920;
var pageHeight = 1080;
//авторизация
var auth = require('webpage').create(), server = zabbix + '/index.php',
	data = 'request=&name=' + zabbix_user + '&password=' + zabbix_password + '&enter=Sign+in';
auth.open(server, 'post', data);
var dashboard = require('webpage').create(), server = zabbix + '/dashboard.php?fullscreen=1';
dashboard.open(server, function() {
	window.setTimeout(function() {
		dashboard.clipRect = { top: 275, left: 251, width: 750, height: pageHeight-308 };
		dashboard.render('dashboard.png');
    }, 5000);
});
var overview = require('webpage').create(), server = zabbix + '/overview.php?fullscreen=1&view_style=0';
overview.open(server, function() {
	window.setTimeout(function() {
    	overview.clipRect = { top: 72, left: 0, width: pageWidth+650, height: pageHeight+580 };	
    	overview.render('overview.png');
  	}, 5000);
});
var complex = require('webpage').create(), server = zabbix + '/screens.php?fullscreen=1';
complex.open(server, function() {
	window.setTimeout(function() {
  		complex.clipRect = { top: 150, left: 0, width: pageWidth-665, height: pageHeight-123 };	
  		complex.render('complex.png');
  	}, 10000);
});
window.setTimeout(function() {
	phantom.exit();
}, 15000);
Передавать данные для авторизации нужно только один раз. При обращении к целевым страницам авторизация осуществляется через сессию и cookie.
Подводные камни:
1. Если не установить таймаут перед выгрузкой картники, не успевают выполниться AJAX-запросы, которые выводят информацию на страницу; устанавливаем таймаут 5 секунд, используя метод window.setTimeout().
2. phantom.exit() - завершает выполнение сценария; если не установить достаточный таймаут, изображения не успеют выгрузиться, устанавливаем таймаут 15 секунд.
3. При необходимости ширину полотна можно ограничить через метод page.viewportSize = { width: pageWidth, height: pageHeight }, что будет эквивалентно изменению ширины окна браузера.

4. Создаем start.bat и добавляем его в планировщик не забывая указать рабочую папку:

phantomjs --cookies-file=cookies.txt zabbix.js
--cookies-file=cookies.txt - параметр, указывающий на необходимость сохранять/использовать cookie в файле, имя которого передано в качестве значения параметра.

5. Добавляем папку со снимками в настройки Рабочего стола и включаем слайд-шоу.

Скачать (исходный код + PhantomJS v.2.0.0 20 Мб) Скачать (исходный код)

5 апреля 2015
Версия 0.91
Денис Пак, генеральный директор