Thomas--F / BotTracker

BotTracker-Plugin for Piwik
GNU General Public License v3.0
33 stars 14 forks source link

BotTracker Tabellen leer #38

Open anwaltde opened 9 years ago

anwaltde commented 9 years ago

Hi,

Nachdem mit der neuen Version der BotTracker nun zu laufen scheint, bleiben jedoch die Tabellen leer.

Wir importieren alle 5 Minuten ein Logfile.

python /var/www/html/piwik/misc/log-analytics/import_logs.py --url=http://localhost/piwik/ --idsite=1 --recorders=4 --add-sites-new-hosts --enable-http-errors --enable-http-redirects --enable-static --enable-bots --enable-reverse-dns --log-format-name common_complete /var/log/varnish/varnish.log >/dev/null 2>&1

Liegt es evtl. am Custom Format?

www.anwalt.de 66.249.75.100 - - [02/Nov/2015:10:40:11 +0100] "GET http://www.anwalt.de/verzeichnis/rechtsanwaelte.php?stadt=Willich&thema=Instandhaltungspflicht&cityid=6720&distance=30&lat=51.264961&lon=6.551767&p=3&sr=664567 HTTP/1.1" 200 12303 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

www.anwalt.de 66.249.75.92 - - [02/Nov/2015:10:40:34 +0100] "GET http://www.anwalt.de/verzeichnis/rechtsanwaelte.php?stadt=Ilsede&thema=Kaufvertrag&cityid=7262&pid=7 HTTP/1.1" 200 6568 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Gruß

Sascha

Thomas--F commented 9 years ago

Ich fürchte, es liegt an Piwik bzw. dem Logfile-Import. Beim Import werden entweder die Hooks nicht korrekt abgearbeitet oder der UserAgend-String kommt anders als erwartet.

Das BotTracker-Plugin arbeitet bisher nur, wenn die Webseite über die PHP-API getracked wird. Ich werde aber den Import mal genauer testen. Vielleicht kommt der UserAgend ja doch in einer Variable mit.

e-dschungel commented 8 years ago

Ich habe das Problem auch mit dem Standard-Apache-Logformat. Gibt es schon neuere Erkenntnisse hierzu?

Thomas--F commented 8 years ago

Ich hab den LOG-Import mal getestet und herausgefunden, dass als "user agent" immer "Piwik/LogImport" ankommt. Eine Ermittlung von Bots anhand des user-agent-Strings ist damit unmöglich.

Wenn jemand einen Weg kennt, beim Log-Import an den user agent, die siteID und die URL zu kommen kann ich was machen. Bisher hole ich die Daten über $_REQUEST[...] bzw. $_SERVER[...]

anwaltde commented 8 years ago

@Thomas--F Könntest du mir sagen, wo ich die user-agents bzw. den Eintrag "Piwik/LogImport" finde? Würde das gerne nachstellen und testen

Hat sich erledigt: /var/www/html/piwik/tmp/logs/log.txt

e-dschungel commented 8 years ago

Der dem Importskript übergebene Useragent "Piwik/LogImport" ist hier hart kodiert: https://github.com/piwik/piwik-log-analytics/blob/f15f7271439380dbc7366aa117d3c8add358c264/import_logs.py#L1226

Einen anderen Weg an den Useragent zu kommen kenne ich leider nicht. Vielleicht sollten wir einen Bugreport/Featurerrequest bei Piwik einreichen?

tillsteinbach commented 8 years ago

Wenn beim Importer "--enable-bots" gesetzt ist haben die Einträge eine "Bot" oder "Not-Bot" variable in der der original User-Agent steht. Kann man das vielleicht nutzen?

Thomas--F commented 8 years ago

Hast du da eine Beschreibung oder ein Beispiel? Wenn der Agent im Plugin ankommt kann ich den auf jeden Fall auswerten.

tillsteinbach commented 8 years ago

Ich bin da nicht tief im code, aber es sind jeweils "Benutzerdefinierte Variablen" mit dem User-Agent. Sofern das Plugin auf Benutzerdefinierte Variablen zugreifen kann, sollte das klappen.

Du musst irgendwie in deinem Callback an "$visit" kommen, da sollte es dann $visitor['customVariables'] geben. Irgendwie muss es ja Mechanismen geben um an den $visit zu kommen, denn sonst wird dem Hook ja nichts übergeben. So richtig tief bin ich aber nicht in den APIs, sorry

Allerdings müsste dann auch die benutzerdefinierte Variable schon vor dem Hook gesetzt sein. Schwierig, schwierig. Ansonsten muss der Log-Importer die variable ja auch im Request mitschicken. Dann steht sie vermutlich irgendwo als "_cvar": "_cvar — Visit scope custom variables. This is a JSON encoded string of the custom variable array (see below for an example value)."

e-dschungel commented 8 years ago

In dem aktuell benutzten Hook isExcludedVisit gibt es IMHO keine Möglichkeit an $visit zu kommen. Der Hook bekommt nur eine Referenz auf einen bool übergeben, der sagt, ob der Besuch geloggt wird oder nicht. Evtl. kann man den Hook makeNewVisitObject benutzen?

Thomas--F commented 8 years ago

Die Hauptaufgabe des Plugins soll es ja sein, die Bots aus dem normalen Besucherlog auszuschließen, daher der Hook "isExcludedVisit". Ich habe jetzt 2 Stunden nach einer Möglichkeit gesucht, aus dem Import-Script an die CustomVariable "Bot" bzw "Not-bot" zu kommen - bisher ohne Erfolg. Ich bekomme ja nicht mal die SiteID übergeben.

Der Hook "makeNewVisitObject" greift aber erst später und dann kann ich den Bot nicht mehr sauber ausschließen. Aktuell sehe ich keine sinnvolle Lösung für das Problem. Möglicherweise hilft ein FeatureRequest in Piwik um beim Aufruf im den Hook "isExcludedVisit" den UserAgent und die siteID direkt übergeben zu bekommen. Vorhanden sind die Daten und die Änderung ist leicht (habe ich gerade getestet). Zeile 93 in core/Tracker/VisitExcluded.php: Piwik::postEvent('Tracker.isExcludedVisit', array(&$excluded, $this->idSite, $this->userAgent)); Beide Werte kommen dann auch sauber im Plugin an.

Update: Besser direkt das Array "$this->request", da ist alles drin, was ich brauche: Piwik::postEvent('Tracker.isExcludedVisit', array(&$excluded, $this->request, $this->userAgent));

tillsteinbach commented 8 years ago

Ich würde das sehr begrüßen und den Feature Request unterstützen.

e-dschungel commented 8 years ago

Ich habe mal einen Issue bei Piwik aufgemacht: https://github.com/piwik/piwik/issues/10415

e-dschungel commented 8 years ago

Piwik 2.16.3 enthält den erweiterten Hook.

Thomas--F commented 8 years ago

Ich habe den Fix jetzt im master-branch eingestellt. Der lokale Test bei mir hat funktioniert. Hat jemand von euch Zeit, die Änderung zu testen bevor ich den Code freigebe?

e-dschungel commented 8 years ago

Auch in meinem Test funktioniert soweit alles. Scheinbar ist "letzter Zugriff" immer die aktuelle Zeit beim Logimport. Ist das ein Bug oder so gewollt?

Thomas--F commented 8 years ago

Aktuell ist das mit der "Zugriffszeit" erstmal so. Ich muss noch etwas suchen und testen, wie ich eine sinnvolle Zugriffszeit bekomme. Im Server-Log steht ja zumindest sekundengenau der Zugriff. Mal sehen, ob der immer im gleichen Format kommt und ob ich den einfach in einen Timestamp umwandeln kann. Das folgt dann aber im nächsten Release.