Ping via XML-RPC

Desde hace varios dias andaba buscando como es que funciona lo de los pings via RPC-XML, vaya fue algo dificil encontrarlo pero ya se como esta esa onda.

Hace ya tiempo atras escuche de servicios como weblogs.com donde listan los ultimos blogs actualizados, solo que el metodo de actualizacion es mucho mas automatico ya que es posible hacerlo via XML-RPC. El ping via XML-RPC consite en una llamada a un procedimiento en un serividor remoto, a través del protocolo HTTP. Decide buscar mas hacerca del tema y encontre en el sitio web de la implementacion, la especificacion de como se realiza el proceso del ping en weblogs.com:

Lo que se debe hacer es una llamada a un procedimiento como este:

weblogUpdates.ping (weblogname, weblogurl, changesurl=weblogurl, categoryname=”none”) returns struct

donde:

  • weblogname, es el nombre del blog
  • weblogurl, es la url del blog.
  • changesurl, es la url donde buscar nuevos cambios
  • categoryname, es el nombre de la categoria del blog

los primeros 2 parametros son requeridos y todos son de tipo cadena. Esta funcion debe devolver 2 parametros, uno indicando si tuvo exito o no y el otro un mensaje descriptivo del error en inglés.

Este es un ejemplo de la comunicación entre el cliente (quien solicita el ping) y el servidor (quien buscará cambios en el blog):

POST /RPC2 HTTP/1.0
User-Agent: Radio UserLand/7.1b7 (WinNT)
Host: rpc.weblogs.com
Content-Type: text/xml
Content-length: 250

<?xml version=”1.0″?>
<methodCall>

  <methodName>weblogUpdates.ping</methodName>
  <params>
  <param>
  <value>Scripting News</value>
  </param>
  <param>
  <value>http://www.scripting.com/</value&gt;
  </param>
  </params>
  </methodCall>

HTTP/1.1 200 OK
Connection: close
Content-Length: 333
Content-Type: text/xml
Date: Sun, 30 Sep 2001 20:02:30 GMT
Server: UserLand Frontier/7.0.1-WinNT

<?xml version=”1.0″?>
<methodResponse>

  <params>
  <param>
  <value>
  <struct>
  <member>
  <name>flerror</name>
  <value>
  <boolean>0</boolean>
  </value>
  </member>
  <member>
  <name>message</name>
  <value>Thanks for the ping.</value>
  </member>
  </struct>
  </value>
  </param>
  </params>
  </methodResponse>

Bueno y como se implementa un servidor XML-RPC en PHP? Me puese a buscar una librería escrita en php, para no tener que lidiar con un extensión para PHP que seria una solución mucho mas robusta, seria un poco más complicada de instalar en los servidores de hosting. Me tope con una implementacion del protocolo y en php: phpxmlrpc. Luego de una exporacion rápida, la libreria parecia muy completa y con unos 5 años de desarrollo… pero tambien bastante complicada para hacer algún servidor ping en un corto tiempo.

Para comprender mejor como se da esta comunicación en tiempo real, me di a la tarea de buscar en WordPress como se realiza esta función. Se que WordPress tiene la opcion de que cada vez que se realiza un nuevo post, este automáticamente envia el ping a las direcciones que se le han especificado. Despues de urgar mucho en el codigo y buscar en vano en codex.wordpress.com, encontre la función en functions.php:

function weblog_ping($server = '', $path = '') {
	global $wp_version;
	include_once (ABSPATH . WPINC . '/class-IXR.php');

// using a timeout of 3 seconds should be enough to cover slow servers
	$client = new IXR_Client($server, ((!strlen(trim($path)) || ('/' == $path)) ? false : $path));
	$client->timeout = 3;
	$client->useragent .= ' -- WordPress/'.$wp_version;

// when set to true, this outputs debug messages by itself
	$client->debug = false;
	$home = trailingslashit( get_option('home') );
	if ( !$client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
		$client->query('weblogUpdates.ping', get_settings('blogname'), $home);
}

Ya viendo esta funcion vi que primero intenan llamando a una funcion extendida del ping que donde le especifican la URL del feed ademas del nombre y la url del blog. Si esta funcion no es posible ejecutarla, entonces se llama a la version normal de ping, que solo toma 2 parametros: el nombre del blog y la URL del mismo. Tambien descubrí que incluyen el archivo class-IXR.php, que para sorpresa mia es una libreria que implementa el protocolo XML-RPC pero lo interesante es que contiene 2 clases: una cliente y otra servidor, esta última es la que me interesa. La libreria se llama IXR – The Inutio XML-RPC Library y su sitio oficial es: http://scripts.incutio.com/xmlrpc/.

En un vistazo rápido a la pagina de la librería encontré lo que estaba buscando, con un pequeño ejemplo se puede ver todo:

<?php

include('IXR_Library.inc.php');

function sayHello($args) {
    return 'Hello!';
}
function addTwoNumbers($args) {
    $number1 = $args[0];
    $number2 = $args[1];
    return $number1 + $number2;
}
$server = new IXR_Server(array(
    'demo.sayHello' => 'sayHello',
    'demo.addTwoNumbers' => 'addTwoNumbers'
));

Super sencillo! Bueno este es solo un ejemplo que dan ellos no se si funciona pero tengo grandes esperanzas de que sea algo de copiar & pegar y ya tenga mi servidor de ping XML-RPC funcionando.

Si este último código funciona, en unos dias estare poniendo este servicio en blogschapines para que le den una probadita….

11 thoughts on “Ping via XML-RPC

  1. No sé si te lo dije, pero lo primero era ver cómo WordPress lo hacía. El tipo que ideó menéame uso ese sistema de ping-trackbacks de wordpress como base para el script. Saludos

  2. Si wordpress menciona los pingbacks, pero esos son para cuando pones algún link a otro blog que soporte pingback (sinonimo de wordpress). Asi tu wordpress le avisa al otro blog que tienes un link hacia el, el otro blog agregara un trackback hacia tu post.

    En el caso de meneame ellos te avisan que alguien puso una historia hacia un post de tu blog…

    En nuestro caso se trata de que wordpress le avise al directorio que hay un nuevo post y que se debe actuliazar el directorio. El sistema que quiero usar es parecido al de http://www.pingomatic.com/. Usaria el pingback para indicar que el blog chapine puso un link hacia el directorio… caso totalmente dirente.

  3. Hola, me interesa este tema ya que necesito trabajar con xmlrpc para php, realmente quiero saber donde puedo descargar esta libreria?
    De antemano muchas gracias

  4. Hola,

    He estado investigasndo y no consigo lo que quiero. Quiero tener varios blog, y que interactuen entre ellos de manera que si en el blog A se escribe una noticia y se marca la categoría “para Blog B” que mediante un ping se escriba un post en el blog B igual que en el blog A. ¿Se podría hacer esto? ¿Como lo puedo hacer?

    Muchas gracias y espero que podáis darme una respuesta

  5. Hola,

    Estoy programando un blog básico en PHP desde el inicio, es muy simple, te logueas y subes artículos, muy simple.

    Pero deseo al igual que otros blogs(software libre) que cada vez que postee un artículo, este mande un ping a los directorios.(a los servers que reciben los ping)

    Ahora lo que no sé, si está función para agregar mas de un servidor de recepción de pings lo puedo agregar simplemente a mi código o cómo debo hacer esto? y de donde saco la función para hacer el ping, es una función, modulo o libreria?

    Gracias.

  6. la verdad me confundí con tanto código, aun voy de a pocos en php, instale el litetype y encontre varios archivos para el XmlRpc, pero los veo muy largos y dificiles de aplicar en mis propios codigos.

    voy a tener que estudiar mas, gracias por el consejo !!

  7. Que tal, Tengo una inquietud. Estuve haciendo unas pruebas contra wordPress para poder enivar solicitudes de pingback y no he tenido éxito.

    El xml lo envio donde el tag me indica, pero desgraciadamente no logro dar con una “buena formacion” del xml. Me lo rebota de todas formas!. No entiendo como es que tengo que formar el xml como corresponde(hice uno igual al que muestras en el ejemplo), ya que en las especificaciones no menciona nada de como es la nomenclatura del xml para los pingbacks, solo q se sigan las especificaciones de http://www.xmlrpc.com/spec .
    Intente haciendo un formulario básico y enviandolo por por POST. Pero tampoco!
    Alguna ayuda por favor.

    Mucas gracias!…
    Ricardo

    pd : dudo q tampoco sean los headers.

    aca va el xml de respuesta

    faultCode

    -32700

    faultString

    parse error. not well formed

    gracias de nuevo

Comments are closed.