Michael: Wir basteln uns einen Twitterbot V
Da wir nicht irgendwas bzw. nicht immer das gleiche in die weite Welt hinaus brüllen wollen, müssen wir uns merken, was wir schon von uns gegeben haben bzw. welche Nachrichten der Bot bereits verkündet hat. Bevor wir also eine neue Nachricht absetzen, vergleichen wir die neue Nachricht mit den bereits gesendeten und verwerfen sie, für den Fall, dass wir darüber schon gezwitschert haben.
Wir müssen aber nicht immer die komplette Nachricht vergleichen. Dazu müssten wir ja auch immer wissen, ob die beiden zu vergleichenden Nachrichten auf die gleiche Art und Weise entstanden sind. Viel einfacher ist es zum Beispiel eine Prüfsumme der Nachrichten zu bauen und diese dann zu vergleichen. Da ein Teil unserer Nachricht aber von Bit.ly erzeugt wird und wir nicht vorhersehen können, ob wir für den gleichen Link immer die gleiche kurze URL von Bit.ly erhalten, sollten wir die Prüfsumme nur über den Teil bilden, der unter 100%-iger Kontrolle steht. Die Überschrift würde sich anbieten. Aber auch die variiert, zum Beispiel wenn ein Rechtschreibfehler korrigiert wird oder sie gar komplett umformuliert wird aber zum gleichen Artikel gehört. Der Teil, der aber immer gleich bleiben sollte, ist der Link zu unserem Artikel (bevor er eingekürzt wurde).
Das bedeutet, jedes mal wenn wir eine Prüfsumme über den gleichen Link bilden, erhalten wir das gleiche Ergebnis. Und wenn wir eine neue Nachricht rausgeblasen haben, dann fügen wir unserer Liste der verkündeten Link-Hashwerte den aktuellen hinzu. Mein Lieblings-Hash-Algorithmus ist SHA1, es kann aber ebenso MD5 oder Ähnliches benutzt werden. Die Hashs speichern wir der Einfachheit halber in einer Datei. Alternativ könnte das auch eine MySQL Datenbank sein.
define('TWEETED_IDS_FILE_NAME',"tweeted_links_hash.txt"); define('FILE_DELIMETER',"\n");
Die Datei trägt den bezeichnenden Namen tweeted_links_hash.txt, denn sie enthält die Hashs, der Links, die bereits auf Twitter verkündet wurden als Text, getrennt durch das NEWLINE Zeichen (Es steht also in jeder Zeile ein Hash-Wert). Das Trennzeichen sollte natürlich nicht ein Zeichen sein, dass in unserer Prüfsumme ebenfalls vorkommen kann!
if ($content = @file_get_contents(TWEETED_IDS_FILE_NAME)) { $content = explode(FILE_DELIMETER, $content); } else { $content = array(); }
Wenn es diese Datei bereits gibt, dann wird versucht den Inhalt unter Beachtung unseres Trennzeichens auszulesen und eine Matrix aufzufächern, wobei jedes Feld der entstandenen Matrix einen Wert enthält. Gibt es die Datei nicht oder ist sie leer, dann enthält unsere Matrix nicht leere Felder sondern keine Felder!
$sha1 = sha1($link); if ( in_array( $sha1, $content )) { // Diese Nachricht wurde schon vermeldet } else { // Wir können die Nachricht weiterreichen }
Am Ende müssen wir nur unseren neuen Wert an das Ende der Datei anhängen, damit wir ihn für das nächste mal kennen.
file_put_contents(TWEETED_IDS_FILE_NAME, $sha1.FILE_DELIMETER, FILE_APPEND);