Eine der Errungenschaften der letzten Jahre ist mit Sicherheit das Bloggen,
also das Führen von Online-Tagebüchern (Web-Logs > Blogs). Ein Grund für
den Siegeszug dieser Art von Internet-Inhalten ist sicherlich die zu diesem
Zweck entstandene Software, denn sie ermöglichte erstmals, dass auch
Menschen ohne Kenntnisse von HTML und Co., schnell und einfach Artikel im
Internet veröffentlichen konnten. Blog-Software funktioniert dabei ähnlich
wie eine normale Textverarbeitung: man schreibt einen Beitrag, gibt ihm eine
gewisse Form und fertig.
Einer der Blog-Pioniere, die amerikanische Firma Six Apart,
die mit Movable Type
eines der leistungsstärksten Programme am Start hat, ersann im Jahr 2002 ein
System der Verknüpfung einzelner Blog-Beiträge, um den Benutzern die
Möglichkeit zu geben, festzustellen, wer in anderen Artikeln Bezug auf den
eigenen nimmt: das Trackback-System.
Bei diesem System tauschen die beteiligten Web-Server, auf dem die
Blog-Software läuft, automatisch Nachrichten aus, um zwischen den Beiträgen
eine Beziehung herzustellen. Das Ganze funktioniert nach folgendem Szenario:
- Autor A schreibt einen Artikel auf Grundlage eines Beitrags von Autor B
- Autor A gibt vor dem Speichern eine sog. Trackback-URL an, die Autor B für seinen Artikel veröffentlicht hat
- Server A sendet per XMLHTTP-Request an die Trackback-URL auf Server B eine Nachricht (sog. Ping) mit folgenden Informationen:
- Name des Autors oder des Webs (optional)
- Titel des neuen Artikels (optional)
- Kurzbeschreibung des neuen Artikels (optional)
- URL des neuen Artikels (erforderlich)
- Server B empfängt die Nachricht und verarbeitet sie z.B. zu einem Artikelkommentar
Die einzig erforderliche Aktion liegt bei Autor A, denn er muss zu seinem
Artikel die Trackback-URL des Beitrags B angeben. Den Rest erledigen die
beteiligten Server, bzw. die dort installierte Blog-Software.
Inzwischen kann es sich keine Anwendung aus diesem Bereich mehr leisten
ohne Trackback-Unterstützung auszukommen. Durch diese Technik entstehen
richtige Informationsnetze und bei konsequentem Einsatz kann man einen
Information immer wieder bis zu ihrem Ursprung zurückverfolgen. Six Apart
hat zu Trackback eine technische
Spezifikation geschrieben, die man sich einmal anschauen sollte.
Internet-Benutzer, die Ihre Artikel auf die herkömmliche Art und Weise,
also per HTML-Coding, erstellen, müssen nicht auf Trackback verzichten, denn
inzwischen gibt es fast für jede server-seitige Sprache wie PHP et cetera
mehrere Implementationsanleitungen. In Sachen ASP muss man jedoch etwas
suchen, denn es ist gegenüber PHP eher ein Nischenprodukt. Ich bin jedoch
bei ASPit fündig geworden. Dennis Pallet beschreibt dort in
Kurzfassung den Umgang mit dem XMLHTTP-Objekt unter ASP und die Grundlagen
eines ASP-Trackback-Systems.
Auf Basis dieses Artikels, habe ich ein Trackback-System für zerbit.de
entwickelt, das ich hier vorstellen möchte.
Trackbacks senden
Basis eines sog. Trackback-Pings, also dem Senden eines Trackbacks, ist
ein Formular, das in diesem Beispiel lediglich drei Felder für die
Trackback-Informationen, ein weiteres für die Trackback-URL des zu
referenzierenden Beitrags und eine Schaltfläche enthält. Web-Master, die
Ihre Artikeldaten über die Oberfläche ihres Webs eingeben, können dieses
noch um entsprechende Felder und eine Speicherroutine ergänzen. Wir
beschränken uns hier einmal auf das Senden eines Trackbacks.
<form method="post" name="frmNewTrackback"
action="set_trackback.asp">
<table>
<tr>
<td width="80" height="25">Trackback-URL:</td>
<td>
<input type="text" name="txtTrackbackURL" size="80">
</td>
</tr>
<tr>
<td width="80" height="25">Beitrags-URL:</td>
<td>
<input type="text" name="txtArticleURL" size="80">
</td>
</tr>
<tr>
<td width="80" height="25">Beitragstitek:</td>
<td>
<input type="text" name="txtArticleTitle" size="80">
</td>
</tr>
<tr>
<td height="20" valign="top">Beschreibung (Excerpt):</td>
<td>
<textarea rows="6" name="txtArticleExcerpt" cols="80"></textarea>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Senden" name="cmdSendTrackback">
</td>
</tr>
</table>
</form>
Für den Namen des Autors bzw. des Webs brauchen wir kein Feld, denn diese
Information wird in der vom Formular aufgerufenen ASP-Seite set_trackback.asp fest verdrahtet. Der Inhalt dieser Seite,
die das Senden des Trackbacks übernimmt, nun der Reihe nach:
In den ersten Zeilen werden zunächst die Formularfelder mit den
Information ausgelesen.
<% @ LANGUAGE="VBScript" %>
strTrackbackURL = Request.Form("txtTrackbackURL")
strArtURL = Request.Form("txtArticleURL")
strArtTitle = Request.Form("txtArticleTitle")
strArtExcerpt = Request.Form("txtArticleExcerpt")
strBlogName = "Mein Blog"
Bevor wir uns mit dem Code zum Senden befassen, ein paar Worte zum
XMLHTTP-Objekt, über das die Kommunikation mit dem anderen Web-Server läuft.
Mit dem Objekt, das es in ähnlicher Form in fast jeder
Internet-Programmiersprache gibt, kann mal XML-Daten von anderen Web-Servern
abrufen. Die Kommunikation funktioniert genauso wie in einem Web-Browser,
der auch nicht anderes macht, als bei einem Web-Server nachzufragen, ob er
diese oder jene HTML-Datei haben könnte. Das Ergebnis eines solchen HTTP-Requests
ist im Falle des XMLHTTP-Objekts immer ein XML-Dokument.
Die Anfrage, die wir schicken möchten ist ein POST-Request, da wir dem
anderen Web-Server ja noch ein paar Informationen mitgeben möchten und diese
unter Umständen etwas größer werden können. Prinzipiell würde auch ein
GET-Request funktionieren, aber dort ist zu Menge der zulässigen Zeichen
limitiert, daher hat Six Apart in der Trackback-Spezifikation ein POST
vorgeschrieben. Bauen wir uns im Code also zunächst einen Request-String
zusammen:
strPostData = "title=" & Server.URLEncode(strArtTitle) & _
"&excerpt=" & Server.URLEncode(strArtExcerpt) & _
"&url=" & Server.URLEncode(strArtURL) & _
"&blog_name=" & Server.URLEncode(strBlogName)
Jeder Teil des Strings muss URL-codiert werden, was die Methode
Server.URLEncode erledigt. Da lediglich die Artikel-URL Pflicht ist, könnte man hier nun noch ein
paar IF-Statements einbauen, um nicht unnötigerweise leere Zeichenfolgen
mitzuschicken. Im Beispiel gehen wir mal davon aus, dass alle Informationen
vorliegen, was im Übrigen auch für den empfangenden Autor angenehmer ist und
von allen Trackbacker'n beherzigt werden sollte.
Zunächst wird das
XMLHTTP-Objekt initialisiert. Mit Open und den Parametern POST,
der Trackback-URL und der Angabe, ob der Zugriff asynchron erfolgen soll,
wird eine Verbindung zum Web-Server hergestellt. Als nächstes wird im
Request-Header für ContentType festgelegt, dass die Daten die
folgen URL-Codiert sind. Zuletzt wird über die send-Methode der
zuvor zusammengestellte Request-String an den Server geschickt.
Set objHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
objHTTP.Open "POST", strTrackbackURL, false
objHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.Send (strPostData)
Da wir die Daten synchron versandt haben,
können wir die Antwort vom Server nach Ablauf des Sendevorgangs auswerten.
In der
Trackback-Spezifikation
wurde festgelegt, dass der anfragende Server ein XML-Dokument zur
Bestätigung des Pings zurückgeschickt bekommt. Dieses könnte im Falle eines
Fehlers so aussehen:
<?xml version="1.0" encoding="utf-8"?>
<response>
<error>1</error>
<message>Es ist ein Fehler aufgetreten!</message>
</response>
Wenn alles in Ordnung ist so:
<?xml version="1.0" encoding="utf-8"?>
<response>
<error>0</error>
</response>
Diese Antwort können wir nun auswerten. Auf die beiden Folgeseiten im
Beispiel-Code gehe ich nicht weiter ein, denn sie dienen lediglich dazu dem
Benutzer den Zustand seines Trackback-Versands anzuzeigen, wobei die
error.asp noch den kompletten Inhalt des XML-Dokuments mitgeschickt
bekommt, um die Fehlermeldung des anderen Web-Servers darstellen zu können.
If InStr(1, objHTTP.responseText, "<error>0</error>") Then
Response.redirect("success.asp")
Else
Response.redirect("error.asp?msg=" & objHTTP.responseText)
End If
Was noch bleibt ist das Objekt wieder zu schließen. Ordnung muss sein.
Set objHTTP = Nothing
Trackbacks empfangen
Nach der etwas "umfangreicheren" Aktion des Sendes, wird es nun einfach.
Trackbacks empfangen heißt nichts anderes, als den POST-Request eines
anderen Web-Servers zu verarbeiten, wie man es auch beim Senden eines
Formulars vollzieht.
strURL = Trim(Request.Form("url"))
strBlogName = Trim(Request.Form("blog_name"))
strTitle = Trim(Request.Form("title"))
strExcerpt = Trim(Request.Form("excerpt"))
Um nicht für jeden Artikel eine Trackback-ASP-Seite schreiben zu müssen,
sollten alle Artikel in einer Datenbanktabelle erfasst sein und jeder
Datensatz einen eindeutigen Schlüssel ID besitzen. Damit hat man die
Möglichkeit der Trackback-URL mit Hilfe eines Parameters dynamisch zu
gestalten.
Beispiel für den Artikel mit der ID 12: http://www.meinweb.de/artikel/trackback.asp?id=12
Diese ID lesen wir nun per Response.QueryString aus:
strArtID = Request.QueryString("id")
... Speicherung der Daten in einer Datenbank
Diese Informationen muss man nun nur noch in eine Datenbank schreiben, um
sie später z.B. unter dem Artikel als Kommentar darzustellen.
Das Ganze findet in einer separaten ASP-Datei statt, da sie gleichzeitig die Antwort im XML-Format liefern
muss. Dazu setzen wir als nächstes den Content-Type auf XML:
Response.ContentType = "text/xml"
Sollten die Daten unvollständig sein, d.h. die Artikel-URL oder die in
der URL enthaltene ID fehlen, wird eine entsprechende Fehlermeldung
generiert:
If len(strURL) = 0 Then
strErrMsg = "No URL included in TrackBack"
End If
If len(strArtID) = 0 Then
strErrMsg = "Article-ID in URL is missing"
End If
Schlägt beim Speichern des Trackbacks in der Datenbanktabelle ein Fehler
auf, sollten ebenfalls ein entsprechende Fehlermeldungen generiert werden.
Am besten ebenfalls in englischer Sprache, um Nicht-Muttersprachler nicht zu
verwirren ;)
Mit diesen Informationen können wir nun die XML-Struktur schreiben.
If Len(strErrMsg) > 0 then
Response.Write "<?xml version=""1.0"" encoding=""utf-8""?>"
Response.Write "<response>"
Response.Write " <error>1</error>"
Response.Write " <message>" & strErrMsg & "</message>"
Response.Write "</response>"
Else
Response.Write "<?xml version=""1.0"" encoding=""utf-8""?>"
Response.Write "<response>"
Response.Write " <error>0</error>"
Response.Write "</response>"
End If
Das wars. Fertig ist der Trackback-Empfänger.
Weiterführende Informationen: