{"id":758,"date":"2022-07-10T12:14:22","date_gmt":"2022-07-10T12:14:22","guid":{"rendered":"http:\/\/fra.nzhoffmann.de\/?p=758"},"modified":"2022-09-17T10:40:08","modified_gmt":"2022-09-17T10:40:08","slug":"wer-besucht-meine-webseite","status":"publish","type":"post","link":"http:\/\/fra.nzhoffmann.de\/?p=758","title":{"rendered":"Wer besucht meine Webseite?"},"content":{"rendered":"\n<p>Als Betreiber will man ja wissen, ob eine Webseite auch genutzt wird. Es w\u00e4re doch sch\u00f6n, 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:<\/p>\n\n\n\n<p>Um so etwas zu realisieren, braucht man zun\u00e4chst einen Computer, der so eine Lampe ansteuern kann &#8211; zum Beispiel einen Raspberry Pi. Der muss nat\u00fcrlich aus dem Internet erreichbar sein. Dazu braucht er einen DynDNS-Service (zum Beispiel <a href=\"https:\/\/afraid.org\" data-type=\"URL\" data-id=\"https:\/\/afraid.org\">https:\/\/afraid.org<\/a>), und eine Portweiterleitung im heimischen Router. Au\u00dferdem muss ein Webserver (z.B. Apache) installiert sein &#8211; und irgendwas, um die Lampe einzuschalten.<\/p>\n\n\n\n<p>Der Webserver sucht nach Daten normalerweise im Ordner <code>\/var\/www\/html<\/code>, wo ich folgende Dateien erstellt habe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>franz@cloud:\/var\/www\/html $ ls -al\ninsgesamt 68\ndrwxrwxr-x 4 www-data www-data  4096 10. Jul 11:48 .\ndrwxrwxr-x 7 www-data www-data  4096 31. M\u00e4r 20:24 ..\n-rw-r--r-- 1 franz    franz      433 10. Jul 11:37 img.php\n-rw-r--r-- 1 franz    franz    32239 10. Jul 10:32 img.png\n-rwxr-xr-x 1 franz    franz      226 10. Jul 11:48 myPythonScript.py\n-rw-r--r-- 1 www-data www-data   223 10. Jul 12:18 visitors.txt<\/code><\/pre>\n\n\n\n<p>Die wichtigste Datei ist <code>img.php<\/code>. Die ist in PHP geschrieben, einer Scriptsprache, die der Webserver ausf\u00fchren kann. Sie macht zwei Dinge: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>sie liefert dem Browser ein Katzenbild (<code>img.png<\/code>) zur\u00fcck<\/li><li>sie ruft das Python-Script <code>myPythonScript.py<\/code> auf. <\/li><\/ul>\n\n\n\n<p>Im Moment \u00fcbergibt sie dem Python-Script auch noch die IP-Adresse des Browsers &#8211; wenn man nur eine Lampe einschalten will, ist das nat\u00fcrlich nicht erforderlich.<\/p>\n\n\n\n<p>So sieht das PHP-Script aus: <\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-code\"><code>&lt;?php\n\n# execute the python script that will do something\n$output=null;\n$retval=null;\n$arg = $_SERVER&#91;'REMOTE_ADDR'];\n$cmd = '.\/myPythonScript.py ' . escapeshellarg($arg);\nexec($cmd , $output, $retval);\n\n\n# return an image\n$name = 'img.png';\n$fp = fopen($name, 'rb');\nheader(\"Content-Type: image\/png\");\nheader(\"Content-Length: \" . filesize($name));\nfpassthru($fp);\nexit;\n\n# do not close &lt;php-tag, it might mess up the returned image<\/code><\/pre>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<p>Die eigentliche Arbeit wird von dem Python-Script <code>myPythonScript.py<\/code>  gemacht. Da ich keine Lampe habe, die ich einschalten k\u00f6nnte, habe ich mich stattdessen entschlossen, die Besucher in eine Datei mitzuloggen. Das Script sieht so aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python3\n\n# read parameters\nimport sys\nvisitor = \"&lt;unknown&gt;\"\nif len(sys.argv) == 2:\n\tvisitor = sys.argv&#91;1]\n\n# Append to file\nf = open(\"visitors.txt\", \"a\", encoding=\"utf-8\")\nf.write(visitor + \" was here\\n\")\nf.close()<\/code><\/pre>\n\n\n\n<p>Damit PHP das Python-Script ausf\u00fchren kann, m\u00fcssen mehrere Dinge beachtet werden:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Das Script muss als ausf\u00fchrbare Datei gekennzeichnet sein &#8211; erkennt man an dem x in der Verzeichnisliste, und macht man mit dem Shell-Befehl <code>chmod ugo+x myPythonScript.py<\/code><\/li><li>Das Script muss mit  dem sog. Shebang in der ersten Zeile anfangen, damit das System wei\u00df, dass es ein Python-Programm ist<\/li><li>Es muss nat\u00fcrlich Schreibrechte in die Datei <code>visitors.txt<\/code> haben. Der Webserver wird als Benutzer <code>www-data<\/code> ausgef\u00fchrt, und diesem Benutzer sollte im einfachsten Fall auch die Datei geh\u00f6ren. Normalerweise ist das der Fall, weil das Script die Datei selbst anlegt.<\/li><\/ul>\n\n\n\n<p>Es sollte sehr einfach sein, das Script so anzupassen, dass es stattdessen eine Lampe einschaltet. Schwieriger d\u00fcrfte es werden, die Lampe wieder auszuschalten &#8211; das Script sollte n\u00e4mlich so schnell wie m\u00f6glich beendet sein.  Es kann also nicht einfach eine Zeit lang warten, und die Lampe dann wieder ausschalten. Au\u00dferdem g\u00e4be das auch Probleme, wenn zwei Besucher kurz nacheinander auf die Webseite kommen.<\/p>\n\n\n\n<p>Nun muss man nur noch daf\u00fcr Sorgen, dass das PHP-Script auch aufgerufen wird. Dazu wird das Bild einfach in die  Webseite eingebunden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;img src=\"https:\/\/myRasperryPi.afraid.org\/img.php\" \/&gt;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/franz.dynamic-dns.info\/img.php\" alt=\"Hier sollte eine Katze zu sehen sein, und Deine IP-Adresse ist jetzt geloggt.\"\/><figcaption>Katze<\/figcaption><\/figure>\n\n\n\n<p>Deine IP-Adresse steht jetzt in meinem Logfile&#8230;<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als Betreiber will man ja wissen, ob eine Webseite auch genutzt wird. Es w\u00e4re doch sch\u00f6n, 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, braucht man zun\u00e4chst einen Computer, der so eine &hellip; <a href=\"http:\/\/fra.nzhoffmann.de\/?p=758\" class=\"more-link\"><span class=\"screen-reader-text\">Wer besucht meine Webseite?<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-758","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=\/wp\/v2\/posts\/758","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=758"}],"version-history":[{"count":4,"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=\/wp\/v2\/posts\/758\/revisions"}],"predecessor-version":[{"id":764,"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=\/wp\/v2\/posts\/758\/revisions\/764"}],"wp:attachment":[{"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=758"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/fra.nzhoffmann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}