Vytvoření vlastního screenshot serveru pro Linux
9.10.2019
Ukážeme si jak vytvořit vlastní jednoduchý server pro opis obrazovky pro Linux v C++ (s použitím GTK) a PHP.
Aplikace v C++ a její sestavení
Nejprve si v C++ vytvoříme aplikaci které s využitím objektů GdkWindow a GdkPixbuf při spuštění uloží aktuální snímek celé obrazovky do souboru screenshot.jpeg.
Následující kód samozřejmě implementuje pouze základní funkčnost, tj. např. bez volby jména souboru a kvality komprese (zde je nastavena na 95) a také nevypisuje ani neloguje případné běhové chyby.
#include <stdlib.h>
#include <gtk/gtk.h>
int main(int argc, char** argv)
{
gtk_init(&argc, &argv);
GdkPixbuf* pixbuf;
GdkWindow* root_window;
GError* err = NULL;
gint x, y, width, height;
root_window = gdk_get_default_root_window();
if (!root_window)
return EXIT_FAILURE;
gdk_window_get_geometry(root_window, &x, &y, &width, &height);
pixbuf = gdk_pixbuf_get_from_window(root_window, x, y, width, height);
if (NULL == pixbuf)
return EXIT_FAILURE;
if (FALSE == gdk_pixbuf_save(pixbuf, "screenshot.jpeg",
"jpeg", &err, "quality", "95", NULL))
{
g_object_unref(pixbuf);
return EXIT_FAILURE;
}
g_object_unref(pixbuf);
return EXIT_SUCCESS;
}
Pro překlad a sestavení potřebujeme mít nainstalovaný překladač jazyka C++, tj. v Debianu (a na něm založených distribucích) balíček g++. Dále potřebujeme vývojářský balíček knihovny GTK, tj. v Debianu balíček libgtk-3-dev. Uvedený kód lze sestavit následujícím příkazem:
g++ -O2 -Wall rc-screenshot.cpp `pkg-config --cflags --libs gtk+-3.0` -orc-screenshot
PHP skript a jeho spuštění jako server
První část máme hotovou a nyní zbývá napsat PHP skript, který při svém spuštění (na serveru) nejprve zavolá náš program a následně načte právě uložený opis obrazovky a odešle jej klientovi. Celý skript v souboru index.php (opět zjednodušený bez ošetření a reakce na případné chyby) může vypadat takto:
<?php
exec("./rc-screenshot");
$cesta = 'screenshot.jpeg';
$data = file_get_contents($cesta);
header('Content-type: image/jpeg');
echo($data);
Pro spuštění serveru je potřeba samozřejmě mít nainstalovaný balík php. Server pak můžeme spustit jako tzv. "vestavěný server" (build-in server) tak že ve složce kde máme vlastní aplikaci rc-screenshot a PHP skript index.php zavoláme:
php -S xxx.xxx.xxx.xxx:8000
kde xxx.xxx.xxx.xxx je konkrétní IP adresa počítače na kterém je server.
Projekt najdete také na github, kde si jej můžete prohlédnout, stáhnout a libovolně upravit podle svých potřeb.