. .

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.).


Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>