Trackbacks senden und empfangen

Da ich keine fertige Blog-Software (wie z.B. WordPress oder Serendipity) nutze, musste ich mich selbst um die Erstellung der Trackback-Funktionalität auf meiner Seite kümmern. Allerdings hatte ich keine Ahnung von der Materie und habe erst einmal per Google nach dem Thema Trackback gesucht.
Es wurden auch zahlreiche Suchergebnisse aufgelistet, aber davon konnte man die meisten echt vergessen. Einige erklärten kurz, was Trackbacks überhaupt sind, andere schwelgten in Zukunftsvisionen, was mit Trackback möglich wäre. Aber keiner erklärte mir, wie genau Trackbacks (in PHP) zu realisieren waren.
Vielleicht lag es einfach auch daran, dass ich nach der sechsten Google-Page keinen Bock mehr hatte, weiter nach Artikeln zu suchen.

Im Endeffekt hatte ich hauptsächlich nur die offizielle Trackback-Spezifikation. Naja, besser als Nichts.


Ausgangspunkt / Annahme

Wir nehmen nachfolgend an, dass du einen Artikel auf deinem Blog geschrieben hast, der sich auf ein Thema bzw. einen Artikel bezieht, den du auf einem anderen Blog gefunden hast. Du möchtest diesen anderen Blog bzw. dessen Leser nun davon in Kenntnis setzen, dass du auch etwas zu diesem Thema geschrieben hast. Du erreichst dies z.B. mittels Trackbacks. Somit bist du der Sender und der andere Blog der Empfänger.


Einige Begriffe vorab

Auch bei den Begrifflichkeiten herrschte ein ziemliches Durcheinander auf den gefundenen Websiten (zu diesem Thema). Aus diesem Grund will ich zuerst einmal ein paar Begriffe klären. Diese "Definitionen" erheben keinen Anspruch darauf, korrekt bezeichnet zu sein (man könnte Trackback-Client auch Sender nennen usw.), sondern dienen nur dem besseren Verständnis dieses Artikels. Also fangen wir an.

Der Server-Artikel ist ein Artikel, den du in einem anderen Blog gefunden hast und auf den sich dein eigener Artikel (Client-Artikel) bezieht.

Der Client-Artikel bezeichnet deinen Artikel und dieser bezieht sich auf den Server-Artikel. Du möchtest mittels Trackback-Eintrag diese Beziehung hervorheben.

Der Trackback-Client bezeichnet hier deinen Blog bzw. deine Seite (Skript), die den Trackback an den Trackback-Server postet (verschickt).

Der Trackback-Server ist eine Seite (Skript) des Blogs, der den Server-Artikel enthält. Sein Skript empfängt deinen Trackback und verarbeitet ihn (z.B. in Datenbank speichern und dann in den Kommentaren des Server-Artikels anzeigen).

Die Trackback-URL ist der Link zum Server-Artikel auf dem Trackback-Server (eventuell mit einigen Parametern im Querystring). Die Trackback-URL ist bei mir z.B. ein "toter" Link mit der Bezeichnung "Trackback-URL zu diesem Beitrag".

Der PermaLink ist die URL deines Artikels - also der Link zum Client-Artikel. Dieser Link soll mittels deines Trackback-Eintrags im Server-Artikel einen Verweis auf deinen Artikel (Client-Artikel) ermöglichen.


Einen Trackback senden

Bevor wir uns um das Empfangen von Trackbacks kümmern, sehen wir uns erst einmal das Versenden eines Trackbacks an. Daran sehen wir, welche Parameter übergeben werden (die der Trackback-Server dann auswerten muss bzw. kann).

Die Spezifikation gibt folgende vier Parameter vor, die an den Trackback-Server gepostet werden sollten:
title     = der Titel des Client-Artikels (optional)
excerpt = ein Auszug aus dem Client-Artikel (optional)
url = der PermaLink (notwendig)
blog_name = Der Name des Blogs, der den PermaLink enthält (optional)


Ich habe es aber auch schon erlebt, dass die POST-Variable "blog_name" auch "blogname" genannt wird. Ich prüfe daher beim Empfang eines Trackbacks auf beide Varianten.
Diese Parameter müssen noch encodiert werden - dies erledigt urlencode() für uns.
$title     = "title=" . urlencode("Trackbacks senden und empfangen");
$url = "url=" . urlencode("http://trackback-client/client_artikel/artikel.php");
$excerpt = "excerpt=" . urlencode("Da ich keine fertige Blog-Software...");
$blog_name = "blog_name=" . urlencode("mein-blog");

$data = $title . "&" . $url . "&" . $excerpt . "&" . $blog_name;


Nun benötigen wir noch die Trackback-URL und den entsprechenden Trackback-Server (Host):
$tb_url    = "http://www.matthias-sonnenkalb.net/trackback.php?tb_id=24";
$host = "tcp://" . parse_url( $tb_url, PHP_URL_HOST );


Jetzt öffnen wir eine Socket-Verbindung zum Trackback-Server ($host) und versenden unsere eingetragenen Werte an diesen:
$fp = fsockopen( $host, 80 );
if( $fp == FALSE ){ exit(); }

$out = "POST ". $tb_url ." HTTP/1.1\r\n";
$out .= "Host: ".$host."\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n";
$out .= "Content-length: ".strlen($data)."\r\n";
$out .= "Connection: close\r\n\r\n";
$out .= $data;

fwrite( $fp, $out );


So, wir sind fast durch. Zum Schluß wollen wir ja noch wissen, ob der Versand erfolgreich war oder nicht. Daher lesen wir noch die Daten aus, die der Trackback-Server an den Trackback-Client zurück sendet und schliessen die Verbindung wieder:
while( !feof( $fp ))
{
$response = fgets( $fp, 128 );
//$response = str_replace( "\n", "<br>", $response );
echo $response;
}

@fclose($fp);


Damit hätten wir das Versenden eines Trackbacks abgehakt. Kommen wir nun zum Empfangen von Trackbacks.


Einen Trackback empfangen

Ich prüfe in meinem Skript zuerst, ob der Parameter "tb_id" im Querystring übergeben wurde. Falls nicht, bricht das Skript mit einer Fehlermeldung ab. Diese Fehlermeldung kann der Trackback-Client auslesen (z.B. mittels der oben gezeigten while-Schleife). Wurde der Parameter übergeben, so prüfe ich nur noch, ob sein Wert ein Integer-Wert - also ganzzahlig - ist (gleichzeitig merke ich mir diesen Wert in der Variablen $tb_id):
// Wurde der notwendige Parameter tb_id übergeben?
if( !$_GET['tb_id'])
{
trackback_response( 1, 'Error :: No ID was given' );
}
// Ist dessen Wert ganzzahlig?
elseif( !intval( $tb_id = $_GET['tb_id'] ))
{
trackback_response( 1, 'Error :: No valid ID was given.' );
}
// Sind für diesen Artikel überhaupt noch Kommentare erlaubt?
elseif( Article :: getLockStatus( $tb_id ))
{
trackback_response( 1, 'INFORMATION :: no comments allowed.' );
}
// Gibt es bei mir denn einen Artikel mit dieser ID?
elseif( !Article :: getArticleById( $tb_id ))
{
trackback_response( 1, 'Error :: Could not found given ID.' );
}


Ist der Trackback erfolgreich durch diese Prüfung gekommen, so holen wir uns nun die POST-Parameter:
$url  	 	= $_POST['url'];
$title = stripslashes( $_POST['title'] );
$excerpt = stripslashes( $_POST['excerpt'] );
$blog_name = stripslashes( $_POST['blog_name'] );

// falls Parameter 'blog_name' nicht vorhanden, dann ...
if( empty( $blog_name ))
{
// ... versuche es mit dem Parameter 'blogname'
$blog_name = stripslashes( $_POST['blogname'] );
}


Jetzt wird geprüft, ob die URL $url bzw. der Blogname $blog_name leer sind. Mein Skript erwartet diese Werte, schließlich soll ja ein Link im - bei mir - erzeugten Kommentar auf den Client-Artikel (PermaLink) verweisen. Der Name ist notwendig, weil bei mir jeder Kommentar den Namen des Verfassers haben muss (allerdings kann der beliebig gewählt sein).
if( empty( $url ) || empty( $blog_name ))
{
trackback_response( 1, 'Error :: No url and/or no blog_name given.');
}


Falls es schon einen Trackback-Eintrag mit der ID und der URL gibt, dann diesen nicht nochmal eintragen, sondern zurück zum Aufrufer:
if( Comment :: isTrackBackComment( $tb_id, $url ))
{
trackback_response( 1, 'ERROR :: trackback already exists.');
}


Wurde ein Titel übergeben, so wird nun geprüft, ob dieser eine gewisse Länge (in diesem Fall 50 Zeichen) überscheitet. Wenn ja, dann wird er gekürzt und die Zeichenkette "[...]" angefügt. Danach machen wir mit dem Auszug aus dem Client-Artikel das Gleiche - allerdings darf dieser (bei mir) maximal 255 Zeichen lang sein:
$tb_content = '';
if( !empty( $title ))
{
if( strlen( urldecode( $title )) > 50 )
{
$tb_content .= '[...]';
}
$title = substr( urldecode( $title ), 0, 50 ) . $tb_content;
// als Titel kennzeichnen
$tb_content = urlencode("<h2>" . $title . "</h2>");
}

if( !empty( $excerpt ))
{
$tb_content .= '[...] ' . substr( urldecode( $excerpt ), 0, 255 ) . ' [...]';
$tb_content .= urlencode( $tb_content );
}


Zum Schluß wird der Trackback in die Datenbank eingetragen und dies dem Trackback-Client mitgeteilt:
if( !Comment :: insert( $tb_ip, $url, $tb_content, $blog_name, 1 ))
{
trackback_response( 1, 'ERROR :: Could not insert Trackback.');
}

// Trackback wurde erfolgreich eingetragen
// Trackback-Client erhält den Fehlercode 0 zurück
trackback_response(0);


Bemerkungen

Einige Bedenken habe ich wegen der Bezeichnungen der POST-Parameter. Ist denn garantiert, dass diese immer so in den Sender-Skripten bezeichnet werden, wie in der Spezifikation vorgegeben? Wie das Beispiel mit dem Blog-Namen zeigte, kann man sich wohl nicht darauf verlassen (Simpletracks-Formular - hat bei mir überhaupt nicht funktioniert). Mittels Trackback Pinger konnte ich Trackbacks an meinen Blog senden. Diese wurden auch empfangen und korrekt angezeigt.

Ein weiterer wichtiger Punkt ist die Handhabung hinsichtlich SPAM. Sollte man Trackbacks besser immer moderieren oder reicht der Einsatz von Sicherheitstools (z.B. das Simple Trackback Validation Plugin)? Dazu aber mehr in einem späteren Artikel.
 
 Artikel als Bookmark:
Beitrag wurde bisher 1695 mal geöffnet
RA Zabel/Stolze
 
1
Matthias Sonnenkalb
!! Ergänzung !!

Ich hatte vergessen die Funktion trackback_response() anzugeben. Diese sieht wie folgt aus:
function trackback_response($error = 0, $msg = '')
{
header('Content-Type: text/xml; charset=' . CHARSET );

echo '<?xml version="1.0" encoding="utf-8"?'.">\n";
echo "<response>\n";
echo "<error>$error</error>\n";

if( $error != 0 )
{
echo "<message>$msg</message>\n";
}

echo "</response>";

exit();
}


Sorry.
 
2
Du kannst ja vor Spamwellen gefeit sein, mit deiner Eigenentwicklung. Das ist doch auch schön, oder? :-)
Ist erstaunlich umfangreich, was du "geschaffen" hast. Vor allem auch dieser Artikel ist ein sehr guter, wenn auch fachspezifischer Artikel, der allerdings wohl auch viel Mühe gekostet hat. Leider ist es bei mir auch auf dem Blog meistens so, dass kurze Artikel oft viele Kommentare bringen und meine Herzensblutangelegenheiten keinen interessieren. Mein absoluter Tipp für mehr Kommentare sind auch unvollständige Artikel, alles perfekt, da hat halt auch keiner was zu sagen, ansonsten kann man noch immer gut etwas anmerken :-)
Liebe Grüße aus Köln
Chris
 
3
Matthias Sonnenkalb
Hallo Chris,

vielen Dank für Deinen Tipp und dein Lob für meine Arbeit! Es steckt in der Tat reichlich "Schweiß" in der Sache hier. Habe aber noch mehr Ideen, leider fehlt mir aber die Zeit.

Zum Thema Spam bleibt mir zu sagen, dass ich froh bin, dass ich (noch) nicht so viel Ärger mit diesem Unsinn habe. Ab und an mal einen Trackback, aber die werden bei mir moderiert (man siehe den verwandten Artikel zu diesem hier).

So, dann wünsche ich Dir weiterhin viel Erfolg mit Deinem Blog und nicht mehr so viel Stress mit Spam!

Gruß,
Matthias
 
4
Daniel
Endlich mal was brauchbares zum Thema Trackback mit PHP! Da ich auch ungerne auf vorhandene Skripte zurückgreife, kommt mir der artikel wie gerufen! Danke für die ausführliche Erklärung und frohes Schaffen noch! Danke!
 
5
Matthias Sonnenkalb
Hallo Daniel,

schön, dass ich Dir mit meinem Artikel helfen konnte. Vielen Dank für Deine Info/Eintrag, so etwas zu hören bzw. zu lesen, erfreut das Blogger-Herz.
Ich wünsche Dir ebenfalls frohes Schaffen und viel Erfolg.

Gruß,
Matthias
 
6
Hallo Matthias,

das ganze sieht sehr spannend aus, leider verstehe ich als Laie fast nur Bahnhof. Würde gerne Trackbacks in PHPWCMS integrieren, vielleicht hast du ein paar Tipps? Gerne auch gegen Bezahlung.

Vg, Jens
 
7
Matthias Sonnenkalb
Hallo Jens,

leider habe ich noch keine Erfahrungen mit PHPWCMS sammeln können und kann dir daher zum jetzigen Zeitpunkt keine Tipps geben. Aber ... ich werde mir die Sache mal ansehen und falls ich eine brauchbare Erkenntnis gewinne, dann werde ich einen Beitrag darüber schreiben. Natürlich ohne Bezahlung ;-)

Gruß,
Matze
 
8
Ich danke dir für diesen Beitrag, das ist genau was ich gesucht habe. Werde ich demnächst bei Youth FM auch einbauen, so dass man sie anpingen kann bzw. unsere Redakteure Trackbacks an die Quelle senden können. :-)
  • 96 Artikel  (zeigen)
  • 66547 Klicks
  • 56 Kommentare
  • 9 Artikel (2010)  (zeigen)
  • 1855 Klicks (2010)
  • 0 Kommentare (2010)
Freunde / Linkparade (4)