Facebook Timestamp auslesen

Vor ein paar Tagen veröffentlichte ein guter Freund ein Bild auf Facebook, bei dem mir so richtig das Wasser im Mund zusammen lief:

facebook-screen
Kurze Zeit später dann ein Foto mit dem leeren Teller, worauf dann folgender Dialog zustande kam:

facebook-curl
Schon fies, doch wie funktioniert das eigentlich? Wie konnte ich den Timestamp auslesen und warum ist mir das auch noch ein Blogpost wert?

Facebook Timestamp auslesen:

Facebook selbst möchte wohl nicht, dass der genau Postzeitpunkt sichtbar ist … aus welchen Grund auch immer. Bei Posts innerhalb der letzten Stunde werde noch die vergangenen Minuten nach der Veröffentlichung angezeigt, bereits nach einer Stunde wird auf volle Stunden gerunden, nach 24h auf volle Tage.
Vielleicht wird hier datenschutztechnisch gehandelt? Eher nicht, so genau nimmt es da wohl nicht, siehe meinen Beitrag vom Mai 2013.

Egal – wie kommt man nun an der Timestamp?

Ganz einfach, im HTML Quellcode findet sich data-utime=“xxxxxx“ – kommt direkt vor dem eingeblendeten Zeitfenster, das Facebook präsentiert. Diese Zahlenkombination ist jedoch codiert, sprich sie wird in der Unixzeit angegeben.

unixtime
Jagt man nun diese Unixtime in einen entsprechenden Converter (Linuxcommandline via date etc.), bekommt man den genauen Postzeitpunkt.
Im Quellcode selbst wird der Postzeitpunkt auch nochmal als Text versteckt ausgegeben, da sich die Position der Unixtime im Quellcode fest einschränken und auch wunderbar weiter verarbeiten lässt, könnte man diese via Script „anzapfen“.
Also gleich eine kleine Übung für mich: „Erstelle einen Einzeiler, der den genauen Postzeitpunkt eines Facebookbeitrags ermittelt.

curl 'https://www.facebook.com/...'
Lädt den Quellcode des Beitrages, wie kommt man nun an den Unixtimestamp?
curl 'https://www.facebook.com/...' | grep -o -E '(data-utime=\")(.*?)(\")'
Mit grep -o -E einen regex ansetzen, der Quellcode wird nun ab dem date-utime ausgegeben (-o only matching, -E regex), der „senkrechte Strich“ (pipe) übergibt die Ausgabe an den nächsten Befehl.
Nun müsste man sich noch den Unixtimestamp herausschneiden.
curl 'https://www.facebook.com/...' | grep -o -E '(data-utime=\")(.*?)(\")' | cut -d '"' -f 2
cut -d ‚“‚ splittet das Ergebnis am “ und -f 2 nimmt das 2. Ergebnis.
Den Unixtimstamp muss man nun noch in ein lesbares Format umwandeln, dies kann man über date –date=’@UNIXTIMESTAMP‘ umsetzen.
Da man Facebook auch eine kleine Chance in diesem ungleichen Kampf bieten muss, knallen wir uns am besten eine Shellcodeinjection in unser Script:
date --date='@'+$(curl 'https://www.facebook.com/..' | grep -o -E '(data-utime=\")(.*?)(\")' | cut -d '"' -f 2)
Alles was in $() geschrieben wird, wird quasi wie ein eigenständiger Shellbefehl ausgeführt und liefert nur das Rückgabeergebnis, was nun im vorangegangenen Shellbefehl weiter verarbeitet werden kann.

Warum ist mir das jetzt einen Blogpost wert?

Damit die „Hackerkollegen“, die sich primär auf Handyforensik beschränken, auch verstehen was ich hier mache *g.
Zudem ereignete sich 2 Tage, nachdem ich den Codeschnipsel via Facebook publiziert habe der Zufall, dass Facebook nun den curl Standarduseragent blockt.

facebook-curl-3

Ein entsprechender Bypass hierfür:
date --date='@'+$(curl -A 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0' 'https://www.facebook.com/..' | grep -o -E '(data-utime=\")(.*?)(\")' | cut -d '"' -f 2)
Also auf in die 2. Runde Facebook 😛

4 Gedanken zu „Facebook Timestamp auslesen

  1. hoohead Beitragsautor

    Weil Du dann keine so coolen Shellscripte schreiben kannst xD

    Hab das komplett übersehen mit dem mouseover – thx Karim.

    Antworten

Schreibe einen Kommentar

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

*