Laboratorio: postear en WordPress mediante GTalk o Jabber (mejorado)

Hace tiempo hice un script para PHP que permitía postear en WordPress usando Jabber (por ejemplo GTalk). Ahora he mejorado un poco el script para que admita poner categorías (si no las hay, las crea) y subir imágenes mediante una URL (ajustándolo a un ancho máximo).

Existen distintas palabras claves para separar los distintos elementos del post dentro del texto que se envía: titulo, contenido, tags, categorias e image. Las distintas secciones se separan con ‘##’ para diferenciarlas unas de otras y se separarán por dos puntos ‘:’ formando pares clave:valor. Un ejemplo para escribir en el IM sería el siguiente:

titulo:Titulo del post##contenido:Lorem Ipsum... con todo el HTML que querramos##tags:etiqueta1, etiqueta2, etiqueta3##categorías:Categoria1,Categoria2#image:http://servidor.com/ruta/imagen.png

El código principal es el siguiente:

$e

";'), explode("\n", $contenido))); } if (isset($image)) { $img_content = file_get_contents($image); $im = imagecreatefromstring($img_content); $w = imagesx($im); $h = imagesy($im); $imgtype = exif_imagetype($image); if ($w > $max_width) { $image_p = imagecreatetruecolor($max_width, intval($h*$max_width/$w)); imagecopyresampled($image_p, $im, 0, 0, 0, 0, $max_width, intval($h*$max_width/$w), $w, $h); ob_start(); imagepng($image_p); $img_content = ob_get_contents(); ob_end_clean(); $imgtype = IMAGETYPE_PNG; $w = $max_width; $h = intval($h*$max_width/$w); } $imgname = "img".time().image_type_to_extension($imgtype); $f = new xmlrpcmsg('metaWeblog.newMediaObject', array(php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña), php_xmlrpc_encode(array('name'=>$imgname, 'bits'=>new xmlrpcval($img_content, 'base64')))) ); $c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto); $c->setDebug(0); $r=&$c->send($f); if(!$r->faultCode()) { $v=$r->value(); $datos = simplexml_load_string($v->serialize()); $url = $datos->xpath('//member/name[. ="url"]/following-sibling::*/string'); $contenido = ''.$contenido; } else { return "Error a la hora de subir la imagen: $image [".$r->faultString()."]"; } } //$contenido .= mb_convert_encoding($contenido, 'UTF-8'); $f = new xmlrpcmsg('wp.getUsersBlogs', array(php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña)) ); $c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto); $c->setDebug(0); $r=&$c->send($f); if(!$r->faultCode()) { $v=$r->value(); $datos = simplexml_load_string($v->serialize()); $blogid = $datos->xpath('//member/name[. ="blogid"]/following-sibling::*/string'); $blogid = is_array($blogid) ? (string) $blogid[0] : (string) $blogid; $f = new xmlrpcmsg('metaWeblog.newPost', array(php_xmlrpc_encode($blogid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña), php_xmlrpc_encode(array('title'=>$titulo, 'description'=>$contenido, 'mt_keywords'=>$tags)), php_xmlrpc_encode(1)) ); $c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto); $c->request_charset_encoding = 'UTF-8'; $c->setDebug(0); $r=&$c->send($f); if($r->faultCode()) { return "Ha habido un error al intentar crear un nuevo post [".$r->faultString()."]"; } else { $datos = simplexml_load_string($r->serialize()); $postid = $datos->xpath('//value/string'); $postid = is_array($postid) ? (string) $postid[0] : (string) $postid; $f = new xmlrpcmsg('metaWeblog.getPost', array(php_xmlrpc_encode($postid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña)) ); $c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto); $c->setDebug(0); $r=&$c->send($f); if($r->faultCode()) { return "Ha habido un error al intentar recuperar información sobre el post insertado [".$r->faultString()."]"; } else { $datos = simplexml_load_string($r->serialize()); $permalink = $datos->xpath('//member/name[. ="permaLink"]/following-sibling::*/string'); $permalink = is_array($permalink) ? (string) $permalink[0] : (string) $permalink; $title = $datos->xpath('//member/name[. ="title"]/following-sibling::*/string'); $title = is_array($title) ? (string) $title[0] : (string) $title; if (isset($categorias)) { $f = new xmlrpcmsg('mt.getCategoryList', array(php_xmlrpc_encode($postid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña)) ); $c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto); $c->setDebug(0); $r=&$c->send($f); if(!$r->faultCode()) { $datos = simplexml_load_string($r->serialize()); $catsblog = $datos->xpath('//struct'); foreach(explode(',', $categorias) as $cat) {$cats[$cat] = null;} foreach($catsblog as $cat) { foreach($cats as $_cat=>$val) { if (strtolower((string) $cat->member[1]->value->string) == strtolower($_cat)) { $cats[$_cat] = (string) $cat->member[0]->value->string; } } } foreach($cats as $cat=>$val) { if (!$val) { $f = new xmlrpcmsg('wp.newCategory', array(php_xmlrpc_encode($postid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña), php_xmlrpc_encode(array('name'=>$cat, 'slug'=>str_replace(' ', '_', strtolower($cat)), 'parent_id'=>1, 'description'=>''))) ); $c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto); $c->setDebug(0); $r=&$c->send($f); if(!$r->faultCode()) { $datos = simplexml_load_string($r->serialize()); $catid = (string) $datos->xpath('//int'); $cats[$cat] = $catid; } else { return "Ha habido un error a la hora de crear la categoría $cat"; } } } foreach($cats as $val) { $catlist[] = array('categoryId'=>$val); } $f = new xmlrpcmsg('mt.setPostCategories', array(php_xmlrpc_encode($postid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña), php_xmlrpc_encode($catlist)) ); $c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto); $c->setDebug(0); $r=&$c->send($f); if($r->faultCode()) { return "Hubo un error a la hora de modificar las categorías del post"; } } else { return "Ha habido un error al intentar recuperar las categorias del blog"; } } return "Se ha publicado '$title': $permalink"; } } } else { return "Ha habido un error al intentar recuperar información sobre el blog [".$r->faultString()."]"; } } //Use XMPPHP_Log::LEVEL_VERBOSE to get more logging for error reports //If this doesn't work, are you running 64-bit PHP with < 5.2.6? $conn = new XMPPHP_XMPPOld($jabber_host, $jabber_puerto, $jabber_usuario, $jabber_contraseña, 'xmpphp', $jabber_host, false, XMPPHP_Log::LEVEL_ERROR); $conn->autoSubscribe(); $conn->useEncryption(false); try { $conn->connect(); while(!$conn->isDisconnected()) { $payloads = $conn->processUntil(array('message', 'presence', 'end_stream', 'session_start')); foreach($payloads as $event) { $pl = $event[1]; switch($event[0]) { case 'message': if (trim($pl['body']) == '') break; $conn->message($pl['from'], $body=post($pl['body']), $type=$pl['type']); if($pl['body'] == 'quit') $conn->disconnect(); if($pl['body'] == 'break') $conn->send(""); break; case 'presence': // print "Presence: {$pl['from']} [{$pl['show']}] {$pl['status']}\n"; break; case 'session_start': //print "Empezamos\n"; $conn->getRoster(); $conn->presence($status="Asonesss jefeeeeeee!"); break; } } } } catch(XMPPHP_Exception $e) { echo 'ERROR:'; die($e->getMessage()); }

Podéis bajaros el código aquí.

Laboratorio: postear en WordPress mediante GTalk o Jabber

Hace tiempo hablaba de una librería para trabajar con Jabber desde PHP y me preguntaban si se podía usar para realizar un cliente y realizar acciones con él. Pues he usado esta librería para crearme un cliente de jabber que espere mensajes y los publique en WordPress, para lo cual también he necesitado la librería phpxmlrpc.

Yo el ejemplo lo he hecho con DreamHost y la posibilidad que ofrece de crear un servidor Jabber, claro que también se puede hacer mediante GTalk.

Lo primero es tener dos cuentas: una para el cliente y otra para ti. Cuando ya las tengamos, deberemos autorizar la una a la otra para que puedan enviarse mensajes. Esto es la parte más chapuza ya que hay que hacerlo con clientes tipo Gtalk o Pidgin.

Tan solo nos queda instalar el script en nuestro servidor o en nuestro ordenador (aunque casi mejor en un servidor) y configurarlo. Se copia en el servidor y se edita el fichero orejas.php y modificar los siguientes valores:

  • $blog_usuario: nombre del usuario del blog
  • $blog_contraseña: contraseña del usuario del blog
  • $blog_url: url del blog de WordPress
  • $blog_xmlrpc_path: path al script xmlrpc de WordPress
  • $blog_puerto: puerto del blog (lo más seguro es que no haya que modificarlo)
  • $post_tags: etiquetas por defecto del post que se va a crear
  • $post_separador: separador para diferenciar en el mensaje entre título, contenido y etiquetas
  • $post_titulo_defecto: título por defecto del post
  • $jabber_host: servidor de Jabber, para GTalk creo que es gtalk.google.com
  • $jabber_usuario: usuario de jabber
  • $jabber_contraseña: contraseña del usuario de jabber
  • $jabber_puerto: puerto del servidor de jabber (lo más seguro es que no haya que modificarlo)

Para postear en WP habrá que mandar un mensaje al cliente con el siguiente formato:

titulo##contenido##etiqueta1,etiqueta2,...,etiquetan

Contenido admite HTML y retornos de carro que serán convertidos en párrafos. Si no se quiere indicar título o etiquetas, pues se puede escribir el contenido solamente. El separador ## es modificable. Cuidado si vais a escribir retornos de carro, porque si pulsas sólo INTRO te enviará el mensaje.

Una vez enviado el mensaje, el script posteará en WP y devolverá la URL del nuevo post.

Supongo que se pueden hacer más cosas y mejor, pero para lo que yo lo necesito me basta y me sobra.

Descarga: orejas