Tutorial de TrackBack

Estos días estoy aprendiendo un montón de cosas sobre estandarización, XHTML, posicionamiento y estilos por CSS, XML, y algunos conceptos muy interesantes en lo que a la aplicación de todos ellos se refiere (obokaman.com YA valida en XHTML 1.0, CSS2 y RSS 2. :DD) . Uno de los temas que más me ha llamado la atención últimamente es el sistema de Trackback, desarrollado hace algun tiempo por los chicos de Moveable Type para permitir a una página enlazar con un post de otra, y permitir a la otra saber que la han enlazado, a grandes rasgos. Gracias a un post de Kusor y al recordatorio de Lunatiko, descubrí un tutorial bastante claro de Matt Kingston sobre cómo implementar un sistema de trackback. El tutorial está pensado para PHP y MySql, aunque es suficientemente genérico como para portarlo a cualquier otro lenguaje. Aprecio mucho el trabajo desinteresado de toda esta gente que se dedica a proporcionarnos tutoriales, traducciones y manuales a los que estamos aprendiendo, así que he creido conveniente aportar mi granito de arena a la comunidad y traducir el tutorial con el que ayer mismo implementé el sistema de trackback en obokaman.com

Tutorial de Trackback 'casero'

NOTA: Moveable Type ha publicado documentación técnica sobre cómo implementar el TrackBack.

¿Qué es el TrackBack? Básicamente, es una manera de registrar quién ha enlazado a tus posts y notificar a los demás que los has enlazado. (creado por los chicos de Moveable Type).

Como no he encontrado documentación o tutoriales sobre cómo funciona el sistema de TrackBack, voy a intentar condensar lo que he observado acerca del comportamiento del TrackBack y cómo lo implementé a mi sistema PHP/MySQL.

Este no pretende ser un tutorial paso por paso usando algún lenguaje de programación específico. En cambio, espero poder tratar las necesidades más importates para configurar e implementar un sistema de TrackBack 'casero'. No pretendo entender completamente la filosofía o la mecánica detrás de los TrackBacks, así que si tienes una información más clara y correcta, por favor, ponte en contacto conmigo.

Paso1: Crear un sistema de envio de 'TrackBack Ping'
Paso 2: Crear un sistema capaz de recibir 'TrackBack Pings'
Paso 3: Mostrar tus TrackBacks
Paso 4: Permitir a tu página generar TrackBack Ping
Conclusion

Paso1: Crear un sistema de envio de 'TrackBack Ping'
Lo primero que debes hacer es crear el sistema para notificar a los otros weblogs que estás enlazando con ellos, es decir, enviar un 'TrackBack Ping'(TB a partir de ahora). Básicamente, para hacer esto simplemente necesitas hacer una llamada a su TB URL y proporcionarle una serie de variables.

Por ejemplo, la TB URL que utilizo para mi blog tiene este formato: /tb/?id=x donde x es el ID del post al que quieras enlazar.(N.T.:los id suelen salir en la url del post que estés visitando o en el 'enlace permanente'.)

A continuación verás las variables que debes/puedes enviar cuando llames a esa URL.

"url" = Esta es la URL del enlace permanente al tu post, desde el que estás enlazando al mío. Debe incluir el https://

"title" = Este es el título de tu post. La implementación del TrackBack en MT recorta automáticamente el título después de las 5 primeras palabras. A pesar de eso, parece que tanto title como blog_name aceptan un número ilimitado de caracteres cuando envías una única palabra muy larga (me aburrí después de llegar a los 400 caracteres)...(N.T.:no queda muy claro si las variables deben pasarse por URL o pueden enviarse por POST, ya que el máximo de caracteres por url creo que rondan los 256, no?)

"excerpt" = Esta variable puede contener un extracto de tu post. Parece permitir un máximo de 253 caracteres (aparece "..." automáticamente si es más larga).

"blog_name" = Este es el nombre de tu blog. De nuevo, me aburrí después de mandar una palabra de más de 400 caracteres en este campo...

Por tanto, la URL que deberías construir si quieres enviar un TB ping a mi post número 500, quedaría así:

/tb/?id=500&url=https://www.miblog.com/archives/00123.html &blog_name=Mi+blog&title=Aqui+iria+el+titulo

Asegúrate de codificar correctamente los caracteres para URL ("+" en vez de espacios, etc.) En PHP existe la función urlencode para eso. (NT: quedaría algo así:
$tburl="https://albert.garcia.gibert.es/tb/?id=500&url=https://www.miblog.com/archives/00123.html&blog_name="
.urlencode($nombre_blog)."&title=".urlencode($titulo_post);
?>
)

Para poder hacer el TB ping desde mi weblog, incluí un campo de texto en el formulario desde el que posteo los nuevos mensajes, donde pego la TB URL del post al que quiero enlazar. Hay una manera de descubrir automáticamente las TB URL a través de el Movable Type bookmarklet, del que hablaremos en el paso 4, pero escogí no implementarlo todavía en mi formulario de entrada de posts.

Después de que mi código PHP añada el post a mi weblog, construye la TB URL con las variables que antes hemos comentado, y hace la llamada a esa URL. En PHP se puede hacer a través de la función fopen (NT: usando la misma variable que definíamos antes, sería: )

Como veremos en la siguiente sección, la TB URL a la que estoy haciendo ping, devolverá una respuesta en XML, diciendo que si ha captado correctamente las variables que hemos enviado o no. De momento no he programado el script para que procese esa respuesta.

Y voilà! El blog al que estoy haciendo referencia recibe un TrackBack desde mi weblog, notificándole quién soy, qué estoy enlazando, y desde dónde.

Paso 2: Crear un sistema capaz de recibir 'TrackBack Pings'
Pero enviar TB pings es sólo la mitad de la historia. También debes ser capaz de recibirlos. Desde que decidí que mi weblog recibiría los pings en /tb/?id=x, creé un subdirectorio llamado "tb" y creé un script en PHP (index.php) que recibiría los pings.

Index.php primero comprueba que ha recibido correctamente las variables "id" y "url" (NT: las únicas IMPRESCINDIBLES). Si no es así, el ping da error, y la página debe devolver la siguiente respuesta:



1
You must include a URL and ID

Si es correcto y no parecen haber problemas, debe devolver la siguiente respuesta:



0

que significa que el TB ping se ha realizado correctamente.

Piensa que deberás modificar la cabecera del documento para especificar que estás mostrando contenido en XML. Por ejemplo, desde PHP se puede hacer con la función header.

Entonces, dónde queda guardada la información de este ping que recibimos? Como cada uno usa diferentes sistemas de almacenamiento de la información, tampoco entraremos en muchos detalles aquí. Yo uso MySQL para mi blog, así que creé una tabla "trackback".

+-----------+----------------------+------+-----+---------+----------------+
| Field     | Type                 | Null | Key | Default | Extra          |
+-----------+----------------------+------+-----+---------+----------------+
| id        | smallint(5) unsigned |      | PRI | NULL    | auto_increment |
| entry_id  | smallint(5) unsigned | YES  |     | NULL    |                |
| url       | tinytext             |      |     |         |                |
| title     | tinytext             | YES  |     | NULL    |                |
| excerpt   | tinytext             | YES  |     | NULL    |                |
| blog_name | tinytext             |      |     |         |                |
| added     | datetime             | YES  |     | NULL    |                |
+-----------+----------------------+------+-----+---------+----------------+

El campo "id" guarda un id único para ese ping, y es la clave primaria de la tabla.

El campo "entry_id" es el id del post de mi blog al que están enlazando mediante TB.

Actualmente estoy trabajando en un sistema para poder especificar directorios y ficheros en el campo entry_id, para poder enlazar a páginas concretas y no sólo a posts.

El campo "added" guarda la fecha en que se realizó el ping.

He puesto los campos "url", "title", "excerpt" y "blog_name" en topi tinytext (es decir, 256 caracteres como máximo). Esto debería ser suficiente para la mayoría de los pings. Siguiendo la implementazión de MT, deberías programar tu script para recortar el título a las 5 primeras palabras antes de añadirlo a la tabla.

Una forma alternativa de recoger la información podría ser añadir una linea a un fichero de texto (aunque creo que sería difícil revisarlo si recibes un montón de pings).

Paso 3: Mostrar tus TrackBacks
Ahora ya estás mandando y recibiendo TB pings. Pero cómo puedes mostrar los TBs que has recibido?

En la página inicial de mi blog y los archivos mensuales, decidí crear un link debado de cada post que dijera "TrackBacks" o "X TrackBacks" (si hay trackbacks registrados para ese post.).

En la página que muestra un sólo post, muestro un listado de los TBs que he recibido si hay alguno que coincida con su ID en la tabla "trackback".

De nuevo, cada uno guarda la información de su blog de manera diferente; en mi caso, se trata simplemente de hacer un query a la base de datos para ver cuántos registros en la tabla "trackback" coinciden en el campo entry_id con el id del post en cuestión.

Paso 4: Permitir a tu página generar TrackBack Ping
El último paso es comunicar la TB ping URL a tus lectores, para que puedan usarla para pinguear (NT: ;P) a tus posts.

La forma más sencilla de conseguilo es proporcionar la TB URL después de cada post. Yo lo he hecho así, depués de cada post he añadido el texto "URL para hacer trackback a este post". Si alguien quiere enlazarlo, puede copiar y pegar esa URL.

Movable Type, el Gestor de Contenidos que introdujo el concepto de los TrackBacks, tiene una característica especial en su pop-up "añadir post" para encontrar automáticamente las TB URL de una página determinada. Si quisiera activar esa detección automática para mi página, debería añadir el siguiente código en la página, después de cada post:

xmlns:dc="https://purl.org/dc/elements/1.1/">
dc:title="Title of my blog entry"
dc:identifier="Permalink URL to this blog entry"
dc:creator="The name of my weblog"
dc:date="Date of the entry" />

Conclusion
Este tutorial es una simplificación de lo que envuelve a la implementación de un sistema de TrackBack 'casero'. Básicamente, sólo he intentado compartir la escructura de los TB pings y las variables implicadas (tuve que investigar en el código de Movable Type para descubrirlas). Por favor, avísame si es necesario rectificar alguna cosa en este tutorial.

Conclusión del Traductor (;DD)
Bueno, después de todo esto... sabrías por ejemplo cómo construir la TB URL para este post con los datos de tu blog? Por que si no... maldita la gracia! Vamos a ver: el id de este post, como ves arriba, es el 54, así que partimos de que si, como he dicho antes, la TB URL principal de mi blog es /tb/id=X , la TB URL para este post en concreto sería:

/tb/?id=54&blog_name=tu+blog+aqui&url=https://www.tublog.com/tupost.php
&title=el+titulo+de+tu+post&excerpt=un+pequenyo+extracto+de+tu+post


Fíjate cómo especificamos el valor de las variables empezando después del ?, poniendo el nombre de la variable, después "=", el valor y un símbolo "&" entre variable y variable (si estás habituado a trabajar trabajar con formularios, a tratar con el paso de variables en js, o a trabajar en php, asp... cualquier lenguaje web, esto lo tienes controlao). Siempre tienes que tener en cuenta, recuérdalo, que debes codificar para url todo lo que metas ahí, los espacios, los caracteres especiales...

Y qué haces con esa dirección? Pues debes abrirla para que se ejecute, aunque no se trata de copiar y pegar en el navegador (funcionaría) si no de hacerlo de manera automática, más elegante. En el formulario que uses para postear, añades un nuevo campo donde pegarás eso cada vez que quieras hacer trackback a un post. Cuando el form procese los datos, también deberá 'abrir' esa URL, como decíamos antes. En PHP sería con . Así yo, en este caso, recibiría el ping.

Ahora para recibirlos tu: Como la explicación de arriba es muy clara y sencilla, te pongo un ejemplo de script en php que procesaría los pings.

//enviamos la cabecera para que el navegador sepa que es XML

header ('Content-Type:text/xml');

//si no se han pasado "url" e "id", envia error

if ((!$url)||(!$id)) {
$resultado='

1
You must include a URL and ID
';

//si el ping es correcto, devuelve mensaje ok e introduce los datos en la BD
}else{
include("../includes/conexion.php");

$sql="INSERT INTO blog_trackback (POST_ID,URL,TITULO,CONTENIDO,N_BLOG,FECHA) VALUES ('$id','$url','$title','$excerpt','$blog_name',NOW());";
mysql_query($sql,$link);
$resultado='

0
';
}

//muestra el XML en pantalla
echo $resultado;
?>

y creo que poco más te puedo contar si después de esto seguís teniendo alguna duda, podéis escribirme a obokaman@obokaman.com e intentaré contestaros ;D.

Texto original por: Matt Kingston - Documento original aquí
Traducción y comentarios en castellano por : obokaman

Espero que te haya sido de ayuda. Hasta la próxima rallada! ;D

Albert García Gibert

Cofounder and former CTO of Uvinum. Founder of Obolog and Splitweet. Father of Júlia & Abril. I'd like to travel more and improve my guitar skills.

El Prat de Llobregat, Barcelona https://twitter.com/obokaman