Wer besucht meine Webseite?

Als Betreiber will man ja wissen, ob eine Webseite auch genutzt wird. Es wäre doch schön, eine Lampe im Regal stehen zu haben, die bei jedem Besucher aufleuchtet. Dazu habe ich heute mal experimentiert. Fertig ist es nicht, aber zumindest ein Ansatz:

Um so etwas zu realisieren, bruacht man zunächst einen Computer, der so eine Lampe ansteuern kann – zum Beispiel einen Raspberry Pi. Der muss natürlich aus dem Internet erreichbar sein. Dazu braucht er einen DynDNS-Service (zum Beispiel https://afraid.org), und eine Portweiterleitung im heimischen Router. Außerdem muss ein Webserver (z.B. Apache) installiert sein – und irgendwas, um die Lampe einzuschalten.

Der Webserver sucht nach Daten normalerweise im Ordner /var/www/html, wo ich folgende Dateien erstellt habe:

franz@cloud:/var/www/html $ ls -al
insgesamt 68
drwxrwxr-x 4 www-data www-data  4096 10. Jul 11:48 .
drwxrwxr-x 7 www-data www-data  4096 31. Mär 20:24 ..
-rw-r--r-- 1 franz    franz      433 10. Jul 11:37 img.php
-rw-r--r-- 1 franz    franz    32239 10. Jul 10:32 img.png
-rwxr-xr-x 1 franz    franz      226 10. Jul 11:48 myPythonScript.py
-rw-r--r-- 1 www-data www-data   223 10. Jul 12:18 visitors.txt

Die Wichtigste Datei ist img.php. Die ist in PHP geschrieben, einer Scriptsprache, die der Webserver ausführen kann. Sie macht zwei Dinge:

  • sie liefert dem Browser ein Katzenbild (img.png) zurück
  • sie ruft das Python-Script myPythonScript.py auf.

Im Moment übergibt sie dem Python-Script auch noch die IP-Adresse des Browsers – wenn man nur eine Lampe einschalten will, ist das natürlich nicht erforderlich.

So sieht das PHP-Script aus:

<?php

# execute the python script that will do something
$output=null;
$retval=null;
$arg = $_SERVER['REMOTE_ADDR'];
$cmd = './myPythonScript.py ' . escapeshellarg($arg);
exec($cmd , $output, $retval);


# return an image
$name = 'img.png';
$fp = fopen($name, 'rb');
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));
fpassthru($fp);
exit;

# do not close <php-tag, it might mess up the returned image

Die eigentliche Arbeit wird von dem Python-Script myPythonScript.py gemacht. Da ich keine Lampe habe, die ich einschalten könnte, habe ich mich stattdessen entschlossen, die Besucher in eine Datai mitzuloggen. Das Script sieht so aus:

#!/usr/bin/python3

# read parameters
import sys
visitor = "<unknown>"
if len(sys.argv) == 2:
	visitor = sys.argv[1]

# Append to file
f = open("visitors.txt", "a", encoding="utf-8")
f.write(visitor + " was here\n")
f.close()

Damit PHP das Python-Script ausführen kann, müssen mehrere Dinge beachtet werden:

  • Das Script muss als ausführbare Datei gekennzeichnet sein – erkennt man an dem x in der Verzeichnisliste, und macht man mit dem Shell-Befehl chmod ugo+x myPythonScript.py
  • Das Script muss mit dem sog. Shebang in der ersten Zeile anfangen, damit das System weiß, dass es ein Python-Programm ist
  • Es muss natürlich Schreibrechte in die Datei visitors.txt haben. Der Webserver wird als Benutzer www-data ausgeführt, und diesem Benutzer sollte im einfachsten Fall auch die Datei gehören. Normalerweise ist das der Fall, weil das Script die Datei selbst anlegt.

Es sollte sehr einfach sein, das Script so anzupassen, dass es stattdessen eine Lampe einschaltet. Schwieriger dürfte es werden, die Lampe wieder auszuschalten – das Script sollte nämlich so schnell wie möglich beendet sein. Es kann also nicht einfach eine Zeit lang warten, und die Lampe dann wieder ausschalten. Außerdem gäbe das auch Probleme, wenn zwei Besucher kurz nacheinander auf die Webseite kommen.

Nun muss man nur noch dafür Sorgen, dass das PHP-Script auch aufgerufen wird. Dazu wird das Bild einfach in die Webseite eingebunden:

<img src="https://myRasperryPi.afraid.org/img.php" />
Hier sollte eine Katze zu sehen sein, und Deine IP-Adresse ist jetzt geloggt.
Katze

Deine IP-Adresse steht jetzt in meinem Logfile…

Ein Gedanke zu „Wer besucht meine Webseite?“

  1. Man muss noch PHP installieren:
    sudo apt install libapache2-mod-php

    Und evtl. noch Leserechte für die img.png-Datei vergeben:
    chmod ugo+r img.png

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.