Bitácora de ElPasmo

No sólo hay blanco... o negro

Miércoles 18 Junio 08

Aprendiendo PHP: xFire RSS

Me esta interesando hacer un pequeño proyecto para crear un RSS a partir de un XML del programa xfire. Xfire es un programa de mensajería instantánea orientado a los videojuegos. De esta manera, puedes saber qué amigos están jugando, dónde están jugando y unirte a ellos, si dispones del juego.

La idea es conseguir llevar un registro de qué está haciendo uno, si está jugando o no, y poder manejar esta información en entornos web 2.0. En concreto quiero añadirlo a mi FriendFeed.

Como podéis ver, es un ejercicio muy simple pero que me permitirá refrescar conocimientos sobre la tecnología web actual. Lo primero que he hecho es ponerme en contacto con mi patrocinador (¡Cómo mola decirlo de vez en cuando aunque todo quede entre amiguetes!) y preguntarleen qué tecnología opera el servidor y que me recomienda para programarlo. La solución ha sido rápida, primero utilizaré WAMP, programa que agrupa Windows, Apache, MySQL, PHP en uno, para mis pruebas así que me lo he descargado y he empezado a estudiar.

Primero: lo básico lo he encontrado en el manual de Wikibooks con enlaces para descargar WAMP. La primera en la frente, me ha costado que el WAMP arrancara Apache porque tenía ya un servicio que utilizaba el puerto 80... esto de tener mil cosas instaladas y la pereza de no abrir más puertos en el router :P

Segundo, pegarme para intentar leer el fichero XML de origen. Al final opté por la solución de esta página con SimpleXML.

Tercero: como tengo que guardar una serie de cambios de estados, me estuve pegando un rato con la interfaz PHP-MySQL... pero al final opté por una solución más sencilla: usar un fichero XML con una estructura propia. Así que tuve que estudiar como podía escribir en ficheros. Al final he optado por una solución que me aconsejó Mirill (gracias tronco): la función file_put_contents.

Cuarto: ¡Argh! No soy capaz de comparar bien las cadenas de caracteres... 3 horas perdidas para acabar usando la función strcmp. ¡Cómo odio los lenguajes que no permiten comparación directa de cadenas con el operador '='!

Quinto: Averiguar cuantos datos tengo ya almacenados en el fichero XML. Una sencilla búsqueda en google me llevó a esta página.

Sexto: Mirar el formato RSS 2.0. Las fechas eran un problema, pero tras encontrar esta página que me enseñó a capturar y formatear la fecha actual y esta otra que me enseñó el formato exacto RSS 2.0 y me ahorró un huevo de tiempo no tuve mayores complicaciones.

Bueno, el proyecto consta de dos archivos. El primero, xfire_update, permite ir almacenando los cambios de estados en un fichero XML (que reside en la misma ruta que el PHP con el nombre coincidente al del usuario). Captura el nombre del usuario a través de un parámetro 'usuario' pasado en la URL. Debe configurarse el servidor para que ejecute este PHP cada X segundos.

El segundo fichero, xfire_rss, construye un RSS a partir del fichero XML y es invocado ya por los servicios webs que se suscriban.

Podéis descargar el código fuente de este enlace. Licencia exacta al código de esta página que podéis encontrar al pie de la bitácora.

Actualización 2:17: Como odio estas cosas, haciendo las pruebas ya en servidor me doy cuenta que funciona perfectamente menos en el sitio que me interesa. FriendFeed no sé por qué no traga con mi RSS. Después de 2 horas, y de dar la coña de nuevo a Mirill, he encontrado y solucionado el problema (aparte de unos defectos menores que también he corregido). Para ello he usado la herramienta Feed Validator que me ha dado varias advertencias entre las cuales estaba "falta el elemento guid para cada entrada del RSS. Un elemento que, por cierto, es opcional. Así que después de consultar su formato RSS 2.0 he decidido hacer una pequeña trampa y crear unas direcciones ficticias para cada elemento del RSS que apunten a sí mismo. El problema viene que al no tener enlaces o guids diferentes cada una de las entradas las tomaba por la misma. En fin... ya ha quedado muy potito y podéis ver el resultado en la sección Actividad Reciente. Por supuesto, ya he actualizado el código.

Actualización 12:26: He añadido más información al código sobre la licencia. He incluído la posibilidad de obtener el RSS en inglés (usando el parámetro 'username' en vez de 'usuario'), he realizado últimos comentarios y retoques y he añadido que se compruebe si el fichero XML de base de datos existe (con la función file_exists). Ahora la aplicación no crea el fichero XML de base de datos, si no lo encuentra no hace nada. He incluído en el archivo de descarga un ejemplo de dicho fichero.

Actualización 13:45: Resulta que los GUIDs del RSS no solo deben ser diferentes entre sí sino que tiene que corresponderse siempre el mismo con la misma entrada. Si no algunos agregadores RSS estrictos (como es el caso de FriendFeed que es el único que me da estos problemas) se vuelven locos a la hora de trabajar sobre dichos RSS. Ya está actualizado, lo he solucionado usando la función strtotime para crear guids únicos.

Escrito por ElPasmo a las 00:19
Comentarios (0) | TrackBack (0) | Más sobre Bitácora, Educación, Enlaces interesantes, Internet

Contacta | Sindicar: Atom, RSD, XML

Creative Commons License

Powered by Movable Type