Actualizar Twitter a traves de PHP y OAuth
Categories: Tutoriales - Tags: oauth, twitterHasta hace poco Twitter permitía la actualización de status a través de un método sencillo mandando usuario , contraseña y mensaje de una sola vez a través de una sencilla función. Hoy en día esto ya no es así y el único modo de interactuar con la API de Twitter es usando OAuth
El método antiguo:
function postToTwitter($mensaje){ $host = "http://twitter.com/statuses/update.xml?status=".urlencode($mensaje); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $host); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERPWD, "Usuario:password"); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_POST, 1); $result = curl_exec($ch); // Look at the returned header $resultArray = curl_getinfo($ch); curl_close($ch); if($resultArray['http_code'] == "200"){ $twitter_status='Tu mensaje se envio!'; } else { $twitter_status="Error "; } return $twitter_status; }
A partir de ahora tenemos que usar OAuth para que nuestros usuarios se autentifiquen de forma segura en Twitter o mejor dicho en nuestra aplicación de Twitter.
Pero que pasa cuando no necesitamos que usuarios interactuen con Twitter sino más bien lo único que queremos es actualizar nuestro propio Twitter por ejemplo con los nuevos artículos de nuestro blog. En este caso OAuth resultaría muy tedioso ya que no necesitamos autentificarnos cada vez que queremos publicar un nuevo twitter, si no más bien obtener un ACCESS_TOKEN que no expire y nos sirva para siempre.
Usar Twitter OAuth + PHP para actualizar tu status
Lo primero que necesitamos es crear una aplicación en Twitter Apps . Al crear la aplicación debemos asegurarnos de elegir Client y de dar permisos Read & Write (lectura y escritura). Los demás campos no son importantes ya que no usaremos esta aplicación con usuarios. Una vez creada la aplicación obtendremos el Consumer Key y Consumer Secret .El access token (oauth_token) lo podemos ver si hacemos click en My Access Token
Lo segundo es bajar la librería twitteroauth de Abraham y subir a tu servidor los archivos OAuth.php y twitteroauth.php
Por último en tu archivo PHP debes incluir las siguientes funciones:
require('twitteroauth.php'); //incluir la librería define('_CONSUMER_KEY','tuConsumerKey'); //La obtenes en el paso 1 define('_CONSUMER_SECRET','tuConsumerSecret'); //La obtenes en el paso 1 define('_OAUTH_TOKEN','tuOAuthToken'); //La obtenes en el paso 1 define('_OAUTH_TOKEN_SECRET','tuOAuthTokenSecret'); //La obtenes en el paso 1 $bit=tinyurl($link); //reducimos el link con la api de bit.ly $quedan=(140-strlen($bit))-4; // calculo los caracteres restantes que me quedan para publicar restando los puntos suspensivo $mensaje=substr($mensaje,0,$quedan).' ...'.$bit; // corto el mensaje en caso de que sea muy largo //declaramos la función que realiza la conexión a tu aplicación de twitter function getConnectionWithAccessToken() { $connection = new TwitterOAuth(_CONSUMER_KEY, _CONSUMER_SECRET,_OAUTH_TOKEN, _OAUTH_TOKEN_SECRET); return $connection; } //Realizamos la conexión $connection = getConnectionWithAccessToken(); //Publicamos el mensaje en twitter $twitter=$connection->post('statuses/update', array('status' =>utf8_encode($mensaje))); //Función para acortar URL con bit.ly . Primero debemos registrarnos en http://bit.ly para obtener clave api y usuario function tinyurl($url_larga){ $tiny = "http://api.bit.ly/v3/shorten?login=TuUsuario&apiKey=tuClaveApi&format=txt&longUrl=".$url_larga; $sesion = curl_init(); curl_setopt ( $sesion, CURLOPT_URL, $tiny ); curl_setopt ( $sesion, CURLOPT_RETURNTRANSFER, 1 ); $url_tiny = curl_exec ( $sesion ); curl_close( $sesion ); return($url_tiny); }
Resumiendo:
- Creamos aplicación en Twitter Apps
- Elegimos Client como Application type y le damos permisos de Read & Write
- Obtenemos Consumer Key , Consumer Secret , Access Token(OAuth access token) y Access Token Secret(Oauth token secret)
- Descargamos la librería twitteroauth.php y oauth.php desde aquí y los subimos al server
- Por último creamos el mensaje y la url corta para actualizar nuestro estado.
Espero que hayan entendido bien el tutorial porque la verdad lo hice corriendo y con la comida en el horno xD . Cualquier duda dejen sus comentarios. Saludos!!
UPDATE 1: Cometí algunos errores al escribir el código del tutorial. Estas lineas :
1 2 3 | function getConnectionWithAccessToken() { $connection = new TwitterOAuth('_CONSUMER_KEY', '_CONSUMER_SECRET',$oauth_token, $oauth_token_secret );return $connection; } |
Hay que cambiarlas por las siguientes:
1 2 3 4 | function getConnectionWithAccessToken() { $connection = new TwitterOAuth(_CONSUMER_KEY, _CONSUMER_SECRET,_OAUTH_TOKEN, _OAUTH_TOKEN_SECRET); return $connection; } |
Yo ya lo corregí en el tutorial, pido mil disculpas , pero como comente en su día este post lo hice bastante apurado.
UPDATE 2: Para los que obtienen el error de [error] => Incorrect signature al usar caracteres especiales como acentos (á,é ,etc) deben realizar el siguiente cambio.
Cambiando esta linea:
1 | $twitter=$connection->post('statuses/update', array('status' =>$mensaje)); |
Por:
1 | $twitter=$connection->post('statuses/update', array('status' =>utf8_encode($mensaje))); |
También cree una aplicación para mi cuenta de twitter antigua, así pueden probar que en realidad funciona y mandar un mensaje y url. La página en cuestión es http://masquewordpress.com/ejemplos/actualizar-twitter-php-oauth/
Pueden ver su mensaje en mi vieja cuenta de twitter.
O pueden seguirme en mi nueva cuenta





Justo lo que andaba buscando!!!!
Saludos.
En el ejemplo 2 dices que el _OAUTH_TOKEN y el _OAUTH_TOKEN_SECRET se "obtienen en el paso 1".
Al registrar mi aplicación en Twitter sólo obtuve:
Consumer key
Consumer secret
Request token URL
Access token URL
Authorize URL
¿Cuál es ese "paso 1" que mencionas para obtener _OAUTH_TOKEN y el _OAUTH_TOKEN_SECRET?
psistemas@yahoo.com
Al final lo pone claro Obtenemos Consumer Key , Consumer Secret , Access Token(OAuth access token) y Access Token Secret(Oauth token secret) El access token (oauth_token) lo podemos ver si hacemos click en My Access Token en la parte derecha
no veo 'My Access Token ' en la derecha haciendo click en la aplicacion que cree en twitter por mas que la busco no aparece y esto no me deja autenticar :S
Ahi te mando una foto http://img339.imageshack.us/img339/6306/oauth.jpg
Lo verás en esta direccion: http://dev.twitter.com/
no me funciono amigo asi tal cual como esta da error. sera que lo puedes revisar. estoy nuevo nuevo en esto del oauth y tenia una aplicacion en el twitter que se autentificaba de la forma anterior y no me funciona actualmente. saludos
A mi me funciona perfectamente. Porque no nos comentas que error te da o donde crees que falla así te ayudamos. Saludos
listo amigo el error era mio. me puse a analizar el codigo y lo resolvi. ahora ya tengo funcionando mi aplicacion y hasta ahora el unico error que encuentro es que cuando trato de hacer update al estado y el mensaje tiene acentos sale:
request] => /1/statuses/update.json
[error] => Incorrect signature
estoy investigando a respecto. si encuentro como resolverlo lo comento ok. gracias por el dato de verdad me ha sido de gran ayuda
De nada Freddy si encontrás solución a tu problema dejalo en los comentarios por si a alguien más le pasa.Saludos!
Me sale lo mismo amigo:
object(stdClass)#5 (2) { ["request"]=> string(23) "/1/statuses/update.json" ["error"]=> string(19) "Incorrect signature" }
Estoy tratando de solventarlo
Ya encontre la solución a los acentos. Lo modifique en el post central. Saludos
Parse error: syntax error, unexpected '&' in /home/…..t/index.php on line 21
El error pasó el otro día cuando actualize el artículo. El plugin que se encarga de mostrar el código convirtio > en > por lo que te estaba dando error .También me cambio los "&" por "&"
Ya lo corregí. Ahora debería funcionar. Disculpen las molestias
Hola, yo estoy utilizando tu código (gracias), quizás un poco modificado, y de un día a otro ha dejado de funcionar sin dar error alguno. ¿A alguien más le ha pasado?
Saludos.
Yo estoy probando el código tal cual y también me da el error stdClass Object ( [request] => /1/statuses/update.json [error] => Incorrect signature )
Lo siento, me equivoque al copiar el código de mi web al blog. Ya esta solucionado y debería funcionar correctamente
me pasa exactamente lo mismo, la conexión anda pero al hacer un post me dice: [request] => /1/statuses/update.json [error] => Incorrect signature
alguien sabe porqué?
Probaste el tema de los acentos?
si, pruebo con postear solo una letra y me sale ese error.
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);
$mensage="algo";
$post2=$connection->post('statuses/update', array('status' =>utf8_encode($mensaje)));
ya está, tenáa un error cuando declaraba el OAUTH_TOKEN_SECRET, había un espacio adelante que no habia visto.
Saludos y gracias!
Ayuda no veo la opción 'My Access Token", a que se debe???
Depende de como te metas a tu aplicación twitter muestra la barra lateral o no.
Intenta a traves de http://dev.twitter.com/apps y hace click en el nombre de tu app
[...] registramos una aplicación nueva en Twitter anywhere de la misma manera que se explico en mi post “Actualizar Twitter con PHP + OAuth”. Una vez obtengamos el API Key pasamos al paso número [...]
Buenas, Ya tengo funcionando la api, ahora lo que quiero es mandar un enlace y que aparezca como status el link por ejemplo <a>Link Tendras idea si se puede hacer?
Disculpame diego pero no me queda claro lo que queres hacer.
Saludos Damian, antes de algo, quiero agradecer y felicitar por publicar este tutorial, y tambien me gustarias saber si tienes algun script para recuperar los ultimos twitts
[...] themes tutorial jquery twitter WordPress xhtml Búsquedas popularesredondear div jquery, actualizar el nuevo twitter, crear fondos para web online, recaptcha_ajax, 123456 7, enviar formulario por ajax jquery, crear [...]
MISSING_ARG_URI es lo que envia
hola, yo tuve el mismo problema, el codigo funciona pero el error lo tienes en la conexion con bit.ly que es el acortador de urls.
Intenta cambiando donde dice:
$bit=tinyurl($link);
por: $bit = "test";
Como puedo saber si realizo la conexcion con exito, ya que utilizo el codigo, mando el mensaje y nada que me aparece en mi TL
haciendo un var_dump($twitter);
En donde hacemos ese var_dump($twitter);
La primera vez me funcionó muy bien, pero despues del segundo mensaje espezó a mostrar el siguiente error:
object(stdClass)#5 (2) { ["error"]=> string(20) "Invalid / used nonce" ["request"]=> string(23) "/1/statuses/update.json" }
Alguien me podría ayudar con esto?
que va… gracias… funciono a la perfección, también con el bit.ly gracias
Hola me gustaría hacer esto mismo que publicas en tu página, pero cada vez que llegue un DM, no consigo como hacer esto. Ya que no se como interactuar con la cta de twitter.
Estoy armando un tutorial justamente para esto que me pides, pasate en unos dias por la web. Saludos!!
Gracias, por estar dispuesto a compartir tu conocimiento.
Hola!, se podria hacer que se pudiera mandar el user/password de Twitter, al fichero php y que hiciera el Tweet, en la cuenta que le pasé? en vez de tener que ser en la de la aplicacion? me explico?
Gracias
Hola Lukas fijate que en la página de tutoriales hay uno que explica como crear una aplicación Twiiter con PHP. En esa aplicación un usuario se conecta a Twitter y si guardas las credenciales en una base de datos te serviría para no tener que hacer loguin siempre y actualizar twiiter como tu dices.
Es lo más parecido a lo que quieres hacer.
estoy buscando exactamente lo mismo, si lo consigo te aviso, si ya lo tienes por favor avisame, saludos lukas
saludos, gracias por el articulo, al probarlo en tu sistio con tu cuenta de twitter veo que funciona a la perfeccion, pero yo he implementado todo al pie de la letra segun tu articulo pero no me funciona, hay algo en tu ejemplo implementado que no este aqui publicado?
buenas! muchas gracias por el artículo me ha servido mucho, por cierto la variable $link hay que pasarla con “http://” si no te tira error de invalid_url, lo digo porque he estado un buen rato hasta que he caído en eso jajja, para que no le pase a nadie más xD
Y la función tinyurl te la puedes ahorrar usando file_get_contents pero en mi servidor daba error a causa de esto: http://www.encuentroalternativo.com/url-file-acce…
Un saludo!
Amigo hay que actualizar la forma en que se publica, ya que twitter quito el soporte XML de la API… ahora solo tenemos soporte JSon según estuve leyendo… yo aun ando en la búsqueda de el script…
Un poco en la la linea de este tutorial pero con un ejemplo de parsing sencillo de mensajes directos, espero que os pueda ser de utilidad: http://distritonube.com/articulo/deja-que-tu-twit…
Hay problemas cuando se le ponen las comillas, automáticamente se agregan los " ¿alguna forma de arreglar esto?
me sale error "Fatal error: Call to a member function post() on a non-object in"
en la linea
$twitter=$connection->post('statuses/update', array('status' =>utf8_encode($mensaje)));
Jodidamente genial
se agrede
saludos
cómo creo la pagina donde tengo que ingresar el mensaje?
hola
muchas gracias, anduvo todo perfecto
gracias
hola, la primera vez que lo utilisé, todo salió a la perfección, pero lo probé con mi cuenta, a la hora de dar de alta una nueva cuenta de twitter, hacer una nueva app y ponerle los otros datos, ya no funcionó, nisiquiera regresandole los datos de mi cuenta, ahora ni una ni otra alguien que sepa que pasa???
Fatal error: Call to undefined function curl_init() in /home/vol14/zobyhost.com/zoby_4978665/guaiqueries.zobyhost.com/htdocs/twitteroauth/twitteroauth.php on line 199
@beltranbg
Alguien tiene idea de hacer esto? http://twitter.com/#!/AnnoyingNavi
Actualizar cada 5 min nombrando a alguien y añadiendo un texto, si este dice una palabra clave
yo tengo que hacer que en la web donde implemento la api, la persona que entra y postee, se le actualize en su usuario, este código lo hace siempre en el mio.
como seria esa forma ? .. estuve buscando y no consigo ..
Gracias por la ayuda !!
Hola, si alguien me puede ayudar, bueno este ejemplo me funciono perfecto, solo que el twitter se genera con la cuenta con la que cree la api en twitter.
Yo ando buscando una api, con la que con un login y password de un usuario poder simular que este envio el twitter, es para hacer un calendario programado de twitters para los gerentes de la empresa.
Si alguien sabe de un script con el que se pueda hacer estaria muy agradecido.
Muchas gracias, este ejemplo funiona bien, solo que tienes que configurar tu acortado bit.ly que es otra cosa, pero puedes colocar el twitt en una cariable y listo.
Saludos,
Hola amigo, yo llevo desde la semana pasada tratando de twitear desde php y no he podido , ya hice todos los pasos pero no me sale , sencillamente no lo envia , no me muestra ningun error , hay alguna configuracion en el servidor que me falte??? bueno espero su respuesta , saludos
Hola amigo yo tengo el mismo problema, no me funciona tu ejemplo.
Creo que es con la conexion, sera que falta algo por configurar?
Hola, la verdad, es q sos un capo!!!!!! estuve matando por esto y lo resolviste muy bien…..a mi me re sirvió tu ayuda….la verdad no tengo palabras para agradecerte!!!!!!
paso mi código:
<html>
<head>
<title>Agregando a twitter</title>
<SCRIPT language="JavaScript" type="text/javascript">
function contador (campo, cuentacampo, limite) {
if (campo.value.length > limite) campo.value = campo.value.substring(0, limite);
else cuentacampo.value = limite – campo.value.length;
}
</script>
</head>
<body>
<?php
function volver(){
echo"
<SCRIPT LANGUAGE = 'JavaScript'>
<!–
setTimeout( 'reDirect()', 0 );
function reDirect(){
document.location.href = 'index.php';
}
–>
</SCRIPT>
";
}//fin funcion volver
if ($_POST['Enviar']){
//<input type="text" name="url" value="http://masquewordpress.com/tutoriales/actualizar-twitter-a-traves-de-php-y-oauth/" width="20">
require('twitteroauth.php'); //incluir la librería
define('_CONSUMER_KEY','sdfsdf'); //La obtenes en el paso 1
define('_CONSUMER_SECRET','sdfsdf'); //La obtenes en el paso 1
define('_OAUTH_TOKEN','sdfsdf'); //La obtenes en el paso 1
define('_OAUTH_TOKEN_SECRET','sdfsdf'); //La obtenes en el paso 1
$mensaje = $_POST['mensaje'];
$link = $_POST['link'];
//Función para acortar URL con bit.ly . Primero debemos registrarnos en http://bit.ly para obtener clave api y usuario
function tinyurl($url_larga){
$tiny = "http://api.bit.ly/v3/shorten?login=sdfsdf&apiKey=sdfsdf&format=txt&longUrl=".$url_larga;
$sesion = curl_init();
curl_setopt ( $sesion, CURLOPT_URL, $tiny );
curl_setopt ( $sesion, CURLOPT_RETURNTRANSFER, 1 );
$url_tiny = curl_exec ( $sesion );
curl_close( $sesion );
return($url_tiny);
}//fin funcion
//declaramos la función que realiza la conexión a tu aplicación de twitter
function getConnectionWithAccessToken() {
$connection = new TwitterOAuth(_CONSUMER_KEY, _CONSUMER_SECRET,_OAUTH_TOKEN, _OAUTH_TOKEN_SECRET);
return $connection;
}//fin funcion
$bit=tinyurl($link); //reducimos el link con la api de bit.ly
$quedan=(140-strlen($bit))-4; // calculo los caracteres restantes que me quedan para publicar restando los puntos suspensivo
$mensaje=substr($mensaje,0,$quedan).' …'.$bit; // corto el mensaje en caso de que sea muy largo
//Realizamos la conexión
$connection = getConnectionWithAccessToken();
//Publicamos el mensaje en twitter
$twitter=$connection->post('statuses/update', array('status' =>utf8_encode($mensaje)));
volver();
}//fin si Enviar
?>
<form name="form" method="post" action=''>
<!– <input type='text' size='80' name="mensaje" wrap=physical onKeyDown="contador(this.form.mensaje,this.form.remLen2,140);" onKeyUp="contador(this.form.mensaje,this.form.remLen2,140);">–>
<textarea name="mensaje" wrap=physical onKeyDown="contador(this.form.mensaje,this.form.remLen2,116);" onKeyUp="contador(this.form.mensaje,this.form.remLen2,116);"></textarea>
<input type="text" name="remLen2" size="3" maxlength="3" value="116" readonly>
<input type="text" name="link" value="http://google.com" width="40">
<input type="submit" value="Enviar" name="Enviar"></form></div>
</body>
</html>
hola federico, oiie, una pregunta.. la vdd soy SUPERnuevo en esto, pero pues quisiera preguntarte, en donde le dices a que cuenta de twitter se le actualizara el estado. espero ke me respondas.
Todo funciona perfectamente pero esto solo me deja publicar 4 o 5 tweets y despues ya no puedo volver a publicar hasta dentro de unas 10 o 12 horas otros 4 o 5 tweets y de nuevo lo mismo acaso tweeter pone alguna limitacion con el oauth???
Ok no, ya lo cheque bien el problema era mio al duplicar un tweet por eso no se publicaba de nuevo.
Quiero hacerte una pregunta en tu pagina del ejemplo despues de publicar un tweet aparece informacion supongo que la obtienes con un get cual usas exactamente?? asi es como me fije del error donde salía duplicado y me gustaria saber que imprimes para poder verificar errores etc etc. gracias de antemano
El codigo funciona perfecto
pero quisiera saber como hago un RT
un respondo un "twit" con este codigo
Gracias