miércoles, 12 de noviembre de 2014

Enviar tweets desde PHP

Hace pocos días me vi en la necesidad de buscar la forma de enviar tweets desde PHP. Empecé a buscar y encontré varias clases que implementaban lo que necesitaba, pero finalmente me decanté por una llamada Twitter for PHP.

Se trata de una pequeña librería de PHP con funciones muy interesantes para manejar una cuenta de Twitter y además lleva soporte para el protocolo OAuth. Si buscáis información en google encontraréis mucha información sobre este protocolo pero os dejo este enlace que lo explica bastante bien. La librería Twitter for PHP requiere como mínimo la versión PHP 5.0 y tener instalada la librería cURL.

Primeros pasos

Para utilizar esta librería lo primero que tendremos que hacer es descargarla desde su repositorio en GitHub. En el repositorio encontraremos ejemplos de lo que veremos en este mismo post.

A continuación deberemos dar de alta una cuenta de Twitter, si no la tenemos, e ir a http://dev.twitter.com/apps para registrar una aplicación. Una vez creada tienes que ir a la pestaña Key and Access Tokens y darle clic en la parte inferior de la ventana a Create my access token. Con esto ya tendremos los cuatro parámetros que necesitamos: consumer key, consumer secret, access token y access token secret.

Con todos estos datos ya estamos preparados para poder crear un objeto usando la librería:

$twitter = new Twitter($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

Enviar

El envío de un tweet lo realizaremos con el método post(). El mensaje debe ir codificado en UTF-8 y además le podremos añadir una imagen al tweet:

$twitter->send('Mi primer tweet');
$twitter->send('Mi primer tweet con imagen', $imageFile);

Ejemplo completo

Veamos ahora un ejemplo completo para enviar un tweet:

// Incluimos la librería descargada
require_once 'src/twitter.class.php';

// Definimos cuatro constantes con nuestros datos de Twitter
define(CONSUMER_KEY, 'myconsumerkey');
define(CONSUMER_ACCESS, 'myconsumeraccess');
define(ACCESS_TOKEN, 'myaccesstoken');
define(ACCESS_TOKEN_SECRET, 'myaccesstokensecret');

// Creamos el objeto
$twitter = new Twitter(CONSUMER_KEY, CONSUMER_ACCESS, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

// Enviamos manejando el posible error
try {
 $tweet = $twitter->send('Mi primer tweet');
} catch (TwitterException $e){
 echo $e->getMessage());
}


martes, 11 de noviembre de 2014

Obtener los links que vienen en el contenido de una URL usando DOMDocument de PHP

En un post anterior vimos la forma de obtener un array con los enlaces que nos venían en el contenido de una URL. Este contenido lo obteníamos mediante una función que utilizaba la librería cURL (Client URL) de PHP.

En esta ocasión vamos a simplificar el método ya que utilizaremos para ello la clase DOMDocument.

La función que nos va a descargar y leer las etiquetas de tipo enlace será esta:

function getUrls($url){
 $doc = new DOMDocument;
 $doc->preserveWhiteSpace = false;
 
 // cargamos la url
 @$doc->loadHTMLFile($url);
 
 // buscamos todos los tags del tipo < a >
 $links = $doc->getElementsByTagName("a");
 
 // recorremos cada uno de los tags encontrados
 foreach ($links as $link){
  // obtenemos la parte href de la etiqueta
  $href = $link->getAttribute("href");
  
  if (strlen($href)>=4 && substr($href,0,4)=="http"){
   // url entera
   $urls[] = $href;
  } else if (strlen($href)>0 && substr($href, 0, 1)=="/"){
   // url empieza por / le añadimos el dominio por delante
   $urls[] = $url.$href;
  }else{
   // arhivo
   $urls[] = $url.'/'.$href;
  }
 }

 // eliminamos duplicados
 $urls = array_unique($urls);
 
 // ordenamos alfabéticamente
 sort($urls);
 
 return $urls;
}


La llamada se realizará de esta forma tan sencilla, en la que además mostraremos el resultado del array devuelto por la anterior función:

// especificamos la url
$url = "http://softontherocks.blogspot.com.es";

// obtenemos las url
$urls = getUrls($url);

// mostramos el resultado
echo nl2br(implode($urls, "\n"));


Descargar el contenido de una URL usando DOMDocument de PHP

Un un post anterior hemos visto un ejemplo de cómo descargar el contenido de una web mediante la librería cURL. En este caso, lo haremos más simple si cabe con una función que únicamente utiliza el DOMDocument para ello.

La función os la dejo a continuación:

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}

Obtener los links que vienen en el contenido de una URL usando cURL de PHP

En el anterior post hemos explicado cómo podemos obtener el contenido de una URL usando la librería cURL de PHP.

En esta ocasión, a partir de lo que nos devuelva dicha función, y mediante el objeto DOMDocument, recorreremos el contenido y buscaremos todos los enlaces que existan.

Lo primero que necesitaremos será la función con la que obtener el contenido de la URL:

function getUrlContent($url){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
 curl_setopt($ch, CURLOPT_TIMEOUT, 5);
 $data = curl_exec($ch);
 $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 curl_close($ch);
 return ($httpcode>=200 && $httpcode<300) ? $data : false;
}


A continuación desarrollamos la función que recorre el contenido y guarda en un array las direcciones de todos los enlaces que se encuentre:
function getUrls($url){
 // obtenemos el contenido de la url
 $content = getUrlContent($url);

 if ($content==false){
  return false;
 }

 // creamos el array de resultados
 $urls = array();

 // creamos una instanacia a DOMDocument
 $doc = new DOMDocument;
 $doc->preserveWhiteSpace = false;
 
 // cargamos la pagina web desdecargada desde la función getUrlContent()
 @$doc->loadHTML($content);

 // buscamos todos los tags del tipo < a >
 $links = $doc->getElementsByTagName("a");
 
 // recorremos cada uno de los tags encontrados
 foreach ($links as $link){
  // obtenemos la parte href de la etiqueta
  $href = $link->getAttribute("href");
  
  if (strlen($href)>=4 && substr($href,0,4)=="http"){
   // url entera
   $urls[] = $href;
  } else if (strlen($href)>0 && substr($href, 0, 1)=="/"){
   // url empieza por / le añadimos el dominio por delante
   $urls[] = $url.$href;
  }else{
   // arhivo
   $urls[] = $url.'/'.$href;
  }
 }

 // eliminamos duplicados
 $urls = array_unique($urls);
 
 // ordenamos alfabéticamente
 sort($urls);
 
 return $urls;
}
Una vez hecho esto ya solamente nos quedará la llamada a la función y el mostrar en pantalla el resultado:
// especificamos la url
$url = "http://softontherocks.blogspot.com.es";

// obtenemos las url
$urls = getUrls($url);

// mostramos los resultados
if ($urls==false){
 echo "La página no es correcta, o es una redirección.";
} else {
 echo nl2br(implode($urls, "\n"));
}

Descargar el contenido de una URL usando cURL de PHP

Descargar el contenido de una URL es algo que puede ser bastante común para un programador web. Con PHP y la librería cURL (Client URL) podemos conseguirlo con una función bastante simple.

La librería cURL suele venir activa en la configuración de la mayoría de hosting que hay en el mercado. Además, para activarla, si somos nosotros los que configuramos PHP, simplemente debemos descomentar la línea que viene en el php.ini que hace referencia a php_curl.

La función en cuestión es la siguiente:

function getUrlContent($url){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
 curl_setopt($ch, CURLOPT_TIMEOUT, 5);
 $data = curl_exec($ch);
 $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 curl_close($ch);
 return ($httpcode>=200 && $httpcode<300) ? $data : false;
}


Función para escribir en un fichero log con PHP

Es habitual que cuando realizamos cualquier aplicación queramos guardar un log en fichero de texto plano de ciertas funciones o partes de nuestro código, bien sea para solucionar posibles errores, detectarlos o cualquier otra funcionalidad que le queramos aplicar. En nuestro caso lo usamos para llevar un registro de las consultas SQL que lanzamos sobre la base de datos y ver posibles problemas.

Desde hace tiempo utilizo esta sencilla función que os dejo aquí:

function writeLog($data) {
 list($usec, $sec) = explode(' ', microtime());
 $datetime = strftime("%Y%m%d %H:%M:%S",time());
 $msg = "$datetime'". sprintf("%06s",intval($usec*1000000)).": $data";
 $save_path = 'foo.txt';
 $fp = @fopen($save_path, 'a'); // open or create the file for writing and append info
 fputs($fp, "$msg\n"); // write the data in the opened file
 fclose($fp); // close the file
}

Después, la llamada a esta función se haría de una forma muy simple:

writeLog('Este es el primer log');

Y el resultado que nos aparecería en el fichero foo.txt sería este:

20141111 07:26:14'914062: Este es el primer log