virtual framebuffer X server zur Erstellung von Webseiten-Screenshots verwenden
Ich zeige hier eine Möglichkeit, wie mit der Verwendung eines virtual framebuffer X Servers Screenshots von Webseiten erstellt werden können, ohne auf Drittanbieter wie zum Beispiel url2png.com angewiesen zu sein.
Wie der Titel schon verrät ist hierbei aber die Installation von X Server Libraries notwendig. Das ist allerdings unter Umständen auf einigen Systemen nicht möglich bzw. nicht erwünscht.
Das Script wurde mit bash v4.2.45 auf gentoo Linux ausgeführt.
Bei diesem Betriebssystem ist es nötig, das xorg-server Paket mit dem USE-Flag „xvfb“ zu kompilieren. Außerdem werden in dem folgenden Shell-Script auch Programme aus diesen Paketen verwendet: x11-misc/xdotool, x11-apps/xwd und media-libs/netpbm.
xdotool ist optional – dieses Tool wird verwendet, um den Browser (Firefox) in den Fullscreenmode zu versetzen, indem eine Tastatureingabe (F11) simuliert wird.
Für andere Linux-Derivate sollten Pakete installiert werden, die folgende Binaries zur Verfügung stellen: `Xvfb‘, `xdotool‘, `xwdtopnm‘, `pnmscale‘ und `pnmtojpeg‘.
Das Script erwartet vier Parameter: <URL> <TARGET_DIR> <TARGET_PICTURE> <TARGET_THUMBNAIL>
So könnte der Aufruf beispielsweise dann aussehen: `sh gen_webshot.sh http://gentoo.org/ /tmp gentoo.org.jpg gentoo.org.th.jpg‘
#!env -i bash ############################################################### # config TARGET_USER="apache" PIC_WIDTH=1280 PIC_HEIGHT=1024 TH_WIDTH=300 TH_HEIGHT=200 REMOVE_BROWSER_CONFIG=0 ############################################################### # read arguments, no error check URL=$1; TARGET_PATH=$2; TARGET_FULLSIZE=$3; TARGET_THUMBNAIL=$4; ############################################################### # tmp dir (with timestamp), reset of browser config TS=`date +%s` TMPDIR="/tmp/$TS" mkdir $TMPDIR if [ $REMOVE_BROWSER_CONFIG -eq 1 ]; then rm -rf "$HOME/.mozilla/firefox" fi ############################################################### # start virtual framebuffer X server and browser # x11-base/xorg-server USE=xvfb # start virtual framebuffer X server, memory mapped files in $TMPDIR Xvfb :1 -screen 0 $PIC_WIDTH\x$PIC_HEIGHT\x24 -fbdir $TMPDIR & PID_OF_SCREEN=$! sleep 2 # start browser and load url DISPLAY=:1.0 firefox -width $PIC_WIDTH -height $PIC_HEIGHT "$URL" & PID_OF_BROWSER=$! sleep 6 # x11-misc/xdotool # simulate keyboard input, F11 for fullscreen XDOTOOL=`which xdotool` if [ -x "$XDOTOOL" ]; then DISPLAY=:1.0 xdotool key F11 sleep 2 fi # check if browser has started, otherwise abort ps -p $PID_OF_BROWSER if [ $? -ne 0 ]; then echo "browser (pid $PID_OF_BROWSER) not loaded, aborting" exit 1 fi ############################################################### # convert screen to image # x11-apps/xwd # copy memory mapped file containing screen s framebuffer memory cp $TMPDIR/Xvfb_screen0 $TMPDIR/image.xwd # convert X11 window dump file to a PNM image xwdtopnm $TMPDIR/image.xwd > $TMPDIR/image.pnm # media-libs/netpbm # convert PNM images to JPGs, scale thumbnail pnmscale -xysize $TH_WIDTH $TH_HEIGHT $TMPDIR/image.pnm > $TMPDIR/imagesmall.pnm pnmtojpeg $TMPDIR/image.pnm > "$TMPDIR/$TARGET_FULLSIZE" pnmtojpeg $TMPDIR/imagesmall.pnm > "$TMPDIR/$TARGET_THUMBNAIL" FILESIZE=`stat --printf="%s" "$TMPDIR/$TARGET_FULLSIZE"` if [ "${FILESIZE:-0}" -lt 1 ]; then echo "something got wrong while creating file $TMPDIR/$TARGET_FULLSIZE, aborting" exit 1 fi FILESIZE=`stat --printf="%s" "$TMPDIR/$TARGET_THUMBNAIL"` if [ "${FILESIZE:-0}" -lt 1 ]; then echo "something got wrong while creating file $TMPDIR/$TARGET_THUMBNAIL, aborting" exit 1 fi ############################################################### # target files rm -f "$TARGET_PATH/$TARGET_FULLSIZE" "$TARGET_PATH/$TARGET_THUMBNAIL" cp "$TMPDIR/$TARGET_FULLSIZE" "$TMPDIR/$TARGET_THUMBNAIL" "$TARGET_PATH" if [ $EUID -eq 0 ]; then chown $TARGET_USER "$TARGET_PATH/$TARGET_FULLSIZE" "$TARGET_PATH/$TARGET_THUMBNAIL" fi ############################################################### # stop browser and X server, remove temporary files kill -15 $PID_OF_BROWSER wait $PID_OF_BROWSER kill -15 $PID_OF_SCREEN wait $PID_OF_SCREEN rm -rf $TMPDIR
Der User, der das Script ausführt, muss natürlich die Berechtigung besitzen, auf `Xvfb‘ zuzugreifen. Schreibend gilt das Gleiche für das Zielverzeichnis.
Hier der Screenshot aus dem obigen Aufruf:
Kleiner Nachteil ist, wie man am Screenshot erkennen kann, dass rechts eine Scrollbar ist. Um diese loszuwerden müsste Firefox direkt angefasst werden (userChrome.css z.B.).