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);
Allesblog#bit.ly#MD5#sha1#Twitter

Unser Link ist ziemlich lang. Da wir pro Tweet nur 140 Zeichen zur Verfügung haben, wollen wir den wichtigen Platz natürlich nicht mit dem langen Link verschwenden. Über HTTP-Redirects gibts es die Möglichkeit einen sogenannten URL-Shortener zu benutzen. Beispiele sind tinyurl und bit.ly. Diese kürzen unseren langen Link auf eine kurze aber gültige Adresse zusammen, die auf unsere “richtige” Adresse weiterleitet. Zum Beispiel leitet http://bit.ly/aIMluC auf diesen Artikel um. Das ganze hat natürlich Vor- und Nachteile. Zum einen ist der Dienst kostenlos, zum Anderen sammelt bit.ly natürlich Daten darüber, was im Internet wann und wie oft angeklickt wird. Natürlich kann man sich auch einen eigenen Dienst für Kurz-URLs einrichten. In meinem Beispiel wird j.mp verwendet, weil das jedem zur Verfügung steht und kürzer geht es kaum noch.

  1. Wir legen uns also zuerst einen kostenlosen j.mp/bit.ly Account an. Benutzername und Passwort solltet ihr euch merken (können). Über den Account kann man hinterher sehen, wann welcher unserer Links und wie häufig angeklickt wurde. Für die weitere Programmierung ist der Benutzername und der API_KEY wichtig, den man in seinem Profil abrufen kann.
  2. Dann laden wir die bitly-Klasse von Ruslanas Balčiūnas runter und kopieren sie in den selben Ordner wie magpierrs und unser twitterbot.php Skript. Auch hier müssen wir kein Rad neu erfinden.
<?php
require_once('bitly/lib/bitly.class.php');
define( "LOGIN", "bitlyaccount" );
define( "API_KEY", "R_f3c2a6c1a2e1da645529a59137e3hfa9x" );

$bitly = new Bitly( LOGIN, API_KEY );
?>

Dieser Code initialisiert unser $bitly Objekt und wir können es anschließend benutzen um es mit langen URLs zu füttern. Da Bit.ly und j.mp den gleichen Code und die gleiche Plattform benutzen, können wir das Ergebnis nach j.mp umbiegen um 2 weitere Zeichen einzusparen.

<?php

$hash = $bitly->getHash( $link );
$jmp = "http://j.mp/".$hash;

?>

Fertig. Wir haben jetzt alles, was wir in erster Linie brauchen um unsere Nachricht zu bauen. Wir haben die Überschrift, eine Zusammenfassung aus der wir zitieren könnten und einen kurzen Link, damit unser Follower direkt die Möglichkeit hat, zum Artikel zu gelangen.

Allesblog#bit.ly#PHP#RSS#Twitter#yourls

Michael: Eigene Kurz-URLs

Wenn das “böse böse” Internet mal den favorisierten URL-Kürzer abschaltet oder er aus einem anderen Grund nicht mehr erreichbar ist, dann funktioniert quasi der komplette Rückkanal über z.B. Twitter oder bequemes Facebook nicht mehr, weil dann einfach mal Fantastilliarden an Links ins Nirwana zeigen. Es gibt nur ein einzig wahres alternatives Szenario: selber machen.

Aber da geht schon los. Der oberste Zweck eines Kurz-URL-Dienstes ist es ja eine möglichst kurze URL zu erzeugen. Alles was länger als 3 Buchstaben + Top-Level-Domain ist, kann man ja nicht ernsthaft als kurz bezeichnen. Das nächste Problem ist, dass die “besten” Domains die z.B. auf .DE enden einfach mal schon vergeben sind. Aber so leicht wollte ich nicht schon am Anfang aufgeben.

Wer mich kennt, der weiß, dass es in solchen Sachen einfach mal schnell gehen muss, langsam können andere auch. Da bleibt jetzt nicht wahnsinnig viel Zeit für kreatives.
Trotzdem hing ich stundenlang vor dem DeNIC Whois Dialog und erhielt hundertemal die Nachricht, dass die eingegebene “3-Buchstaben-Kombination”.de bereits vergeben sei. Eine versuchte Google Suche war eher demotivierend aber ich wollte mich ja nicht unterkriegen lassen.

Und dann, mit dem ersten Ergebnis, dass nicht völlig balla balla war, dem Provider des Vertrauens eine Mail geschickt, schon war Teil 1 abgehakt. (Unglaublich welche Anstrengung man unternehmen muss, wenn man sich nicht mit y5l.de zufrieden geben möchte…)

Teil 2 war schon ziemlich weit ausgereift. Apache eben auf die neue Domain hingewiesen, MySQL eine neue Datenbank entlockt und den Rest sollte Yourls richten. Die Konfiguration ist ein Kinderspiel… Aaaaber, jetzt muss ich ja noch der ganzen Armada an Tools und Scripts mitteilen, dass sie doch bitte nicht mehr bei bit.ly anklopfen soll…

Sofern ich das Script selbst geschrieben habe, ist das kein Problem und viele Programme bieten auch Custom Funktionen für die URL-Kürzung an aber was mache ich mit denen, die das nicht tun? Ich bin mir sicher, dafür fällt mir auch noch eine Lösung ein. Mehr also demnächst.

Allesblog#3n2.de#bit.ly#j.mp#yourls