twitterapiexchange secret developer data php twitter

secret - El ejemplo más simple de PHP para recuperar la línea de tiempo del usuario con la API de Twitter versión 1.1



twitter token (14)

Nota importante: A mediados de 2018, el proceso para obtener tokens de la API de Twitter se volvió mucho más burocrático. Me ha llevado más de una semana laboral recibir un conjunto de tokens API, y esto es para un proyecto de código abierto para chicos y chicas con más de 1.2 millones de instalaciones en Packagist y 1.6k estrellas en Github, que en teoría debería ser una prioridad más alta .

Si tiene la tarea de trabajar con la API de Twitter para su trabajo, debe tener en cuenta este tiempo de espera extremadamente largo. También considere otras vías de redes sociales como Facebook o Instagram y proporcione estas opciones, ya que el proceso para recuperar sus tokens es instantáneo.

¿Así que quieres usar la API de Twitter v1.1?

Nota: los archivos para estos están en GitHub .

La versión 1.0 pronto quedará obsoleta y no se permitirán las solicitudes no autorizadas. Entonces, aquí hay una publicación para ayudarlo a hacer precisamente eso, junto con una clase de PHP para hacer su vida más fácil.

1. Crea una cuenta de desarrollador: configura una cuenta de desarrollador en Twitter

Debe visitar el sitio oficial de desarrolladores de Twitter y registrarse para obtener una cuenta de desarrollador. Este es un paso gratuito y necesario para realizar solicitudes para la API v1.1.

2. Crea una aplicación: crea una aplicación en el sitio de desarrolladores de Twitter

¿Qué? ¿Pensaste que podías hacer solicitudes no autenticadas? No con la API v1.1 de Twitter. http://dev.twitter.com/apps visitar http://dev.twitter.com/apps y hacer clic en el botón "Crear aplicación".

En esta página, complete los detalles que desee. Para mí, no importó, porque solo quería hacer una carga de solicitudes de bloqueo para deshacerme de los seguidores de spam. El punto es que vas a obtener un conjunto de claves únicas para usar en tu aplicación.

Entonces, el punto de crear una aplicación es darte a ti mismo (y a Twitter) un conjunto de claves. Estos son:

  • La clave del consumidor
  • El secreto del consumidor
  • El token de acceso
  • El token secreto de acceso

Aquí hay un poco de información sobre para qué sirven estos tokens.

3. Crear tokens de acceso : los necesitará para realizar solicitudes exitosas

OAuth solicita algunos tokens. Así que necesitas tenerlos generados para ti.

Haga clic en "crear mi token de acceso" en la parte inferior. Luego, una vez que vuelvas a la parte inferior, tendrás algunas claves recién generadas. Debe tomar las cuatro claves previamente etiquetadas de esta página para sus llamadas a la API, así que anótelas en algún lugar.

4. Cambiar el nivel de acceso : no quieres solo lectura, ¿verdad?

Si desea hacer un uso decente de esta API, deberá cambiar su configuración a Lectura y Escritura si está haciendo algo distinto a la recuperación de datos estándar utilizando las solicitudes GET .

Elija la pestaña "Configuración" cerca de la parte superior de la página.

Déle a su aplicación acceso de lectura / escritura y presione "Actualizar" en la parte inferior.

Puedes leer más sobre el modelo de permisos de aplicaciones que usa Twitter aquí.

5. Escriba el código para acceder a la API : lo he hecho casi todo por usted.

Combiné el código anterior, con algunas modificaciones y cambios, en una clase de PHP, por lo que es muy sencillo realizar las solicitudes que necesita.

Esto utiliza OAuth y la API de Twitter v1.1 , y la clase que he creado, que puede encontrar a continuación.

require_once(''TwitterAPIExchange.php''); /** Set access tokens here - see: https://dev.twitter.com/apps/ **/ $settings = array( ''oauth_access_token'' => "YOUR_OAUTH_ACCESS_TOKEN", ''oauth_access_token_secret'' => "YOUR_OAUTH_ACCESS_TOKEN_SECRET", ''consumer_key'' => "YOUR_CONSUMER_KEY", ''consumer_secret'' => "YOUR_CONSUMER_SECRET" );

Asegúrese de colocar las llaves que recibió de su aplicación en los espacios respectivos.

A continuación, debe elegir la URL a la que desea realizar una solicitud. Twitter tiene su documentación de API para ayudarlo a elegir qué URL y también el tipo de solicitud (POST o GET).

/** URL for REST request, see: https://dev.twitter.com/docs/api/1.1/ **/ $url = ''https://api.twitter.com/1.1/blocks/create.json''; $requestMethod = ''POST'';

En la documentación, cada URL indica lo que puede pasarle. Si estamos usando la URL de "bloques" como la anterior, puedo pasar los siguientes parámetros POST:

/** POST fields required by the URL above. See relevant docs as above **/ $postfields = array( ''screen_name'' => ''usernameToBlock'', ''skip_status'' => ''1'' );

Ahora que ha configurado lo que desea hacer con la API, es hora de realizar la solicitud real.

/** Perform the request and echo the response **/ $twitter = new TwitterAPIExchange($settings); echo $twitter->buildOauth($url, $requestMethod) ->setPostfields($postfields) ->performRequest();

Y para una solicitud POST , eso es todo!

Para una solicitud GET , es un poco diferente. Aquí hay un ejemplo:

/** Note: Set the GET field BEFORE calling buildOauth(); **/ $url = ''https://api.twitter.com/1.1/followers/ids.json''; $getfield = ''?username=J7mbo''; $requestMethod = ''GET''; $twitter = new TwitterAPIExchange($settings); echo $twitter->setGetfield($getfield) ->buildOauth($url, $requestMethod) ->performRequest();

Ejemplo de código final : para una solicitud GET simple para una lista de mis seguidores.

$url = ''https://api.twitter.com/1.1/followers/list.json''; $getfield = ''?username=J7mbo&skip_status=1''; $requestMethod = ''GET''; $twitter = new TwitterAPIExchange($settings); echo $twitter->setGetfield($getfield) ->buildOauth($url, $requestMethod) ->performRequest();

¡He puesto estos archivos en GitHub con crédito a @ lackovic10 y @rivers! Espero que alguien lo encuentre útil; Sé que lo hice (lo usé para el bloqueo masivo en un bucle).

Además, para aquellos en Windows que tienen problemas con los certificados SSL, consulte esta publicación . Esta biblioteca utiliza cURL debajo del capó, por lo que debe asegurarse de que tiene configurados sus certificados de cURL probablemente. Google también es tu amigo.

Debido al retiro de la API 1.0 de Twitter a partir del 11 de junio de 2013 , el siguiente script ya no funciona.

// Create curl resource $ch = curl_init(); // Set url curl_setopt($ch, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/myscreenname.json?count=10"); // Return the transfer as a string curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // $output contains the output string $output = curl_exec($ch); // Close curl resource to free up system resources curl_close($ch); if ($output) { $tweets = json_decode($output,true); foreach ($tweets as $tweet) { print_r($tweet); } }

¿Cómo puedo obtener la línea de tiempo del usuario (estados recientes) con el menor código posible?

Encontré esto: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline pero obtengo el siguiente error:

"{"errors":[{"message":"Could not authenticate you","code":32}]}"

Hay muchas clases por ahí, pero después de probar varias, ninguna de ellas parece funcionar debido a estas actualizaciones en Twitter, además de que algunas de ellas son clases bastante avanzadas con una gran cantidad de funciones que realmente no necesito.

¿Cuál es la forma más simple / más corta de obtener los estados de usuario recientes con PHP?


¡Gracias Kris!

Me funcionó sin usar parámetros en la consulta, siempre que usé más de un parámetro, me mostró el error: 32 No se pudo autenticar.

El problema para mí, fue en la codificación ampersand. Así que en tu código donde está la siguiente línea

$url .= "?".http_build_query($query);

Agregué la siguiente línea a continuación:

$url=str_replace("&","&",$url);

Y funcionó utilizando dos o más parámetros como screen_name y count.

Todo el código se ve así:

$token = ''YOUR TOKEN''; $token_secret = ''TOKEN SECRET''; $consumer_key = ''YOUR KEY''; $consumer_secret = ''KEY SECRET''; $host = ''api.twitter.com''; $method = ''GET''; $path = ''/1.1/statuses/user_timeline.json''; // api call path $query = array( // query parameters ''screen_name'' => ''twitterapi'', ''count'' => ''2'' ); $oauth = array( ''oauth_consumer_key'' => $consumer_key, ''oauth_token'' => $token, ''oauth_nonce'' => (string)mt_rand(), // a stronger nonce is recommended ''oauth_timestamp'' => time(), ''oauth_signature_method'' => ''HMAC-SHA1'', ''oauth_version'' => ''1.0'' ); $oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting $query = array_map("rawurlencode", $query); $arr = array_merge($oauth, $query); // combine the values THEN sort asort($arr); // secondary sort (value) ksort($arr); // primary sort (key) // http_build_query automatically encodes, but our parameters // are already encoded, and must be by this point, so we undo // the encoding step $querystring = urldecode(http_build_query($arr, '''', ''&'')); $url = "https://$host$path"; // mash everything together for the text to hash $base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring); // same with the key $key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret); // generate the hash $signature = rawurlencode(base64_encode(hash_hmac(''sha1'', $base_string, $key, true))); // this time we''re using a normal GET query, and we''re only encoding the query params // (without the oauth params) $url .= "?".http_build_query($query); $url=str_replace("&","&",$url); //Patch by @Frewuill $oauth[''oauth_signature''] = $signature; // don''t want to abandon all that work! ksort($oauth); // probably not necessary, but twitter''s demo does it // also not necessary, but twitter''s demo does this too function add_quotes($str) { return ''"''.$str.''"''; } $oauth = array_map("add_quotes", $oauth); // this is the full value of the Authorization line $auth = "OAuth " . urldecode(http_build_query($oauth, '''', '', '')); // if you''re doing post, you need to skip the GET building above // and instead supply query parameters to CURLOPT_POSTFIELDS $options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"), //CURLOPT_POSTFIELDS => $postfields, CURLOPT_HEADER => false, CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); // do our business $feed = curl_init(); curl_setopt_array($feed, $options); $json = curl_exec($feed); curl_close($feed); $twitter_data = json_decode($json);

Espero que ayude a alguien con el mismo problema que tuve.


Aquí hay una breve para obtener un número específico de tweets de su línea de tiempo. Básicamente, hace lo mismo que los otros ejemplos, solo que con menos código.

Solo complete las claves y ajuste $count a su gusto:

$url = ''https://api.twitter.com/1.1/statuses/user_timeline.json''; $count = ''10''; $oauth = array(''count'' => $count, ''oauth_consumer_key'' => ''[CONSUMER KEY]'', ''oauth_nonce'' => md5(mt_rand()), ''oauth_signature_method'' => ''HMAC-SHA1'', ''oauth_timestamp'' => time(), ''oauth_token'' => ''[ACCESS TOKEN]'', ''oauth_version'' => ''1.0''); $oauth[''oauth_signature''] = base64_encode(hash_hmac(''sha1'', ''GET&'' . rawurlencode($url) . ''&'' . rawurlencode(implode(''&'', array_map(function ($v, $k) { return $k . ''='' . $v; }, $oauth, array_keys($oauth)))), ''[CONSUMER SECRET]&[ACCESS TOKEN SECRET]'', true)); $twitterData = json_decode(file_get_contents($url . ''?count='' . $count, false, stream_context_create(array(''http'' => array(''method'' => ''GET'', ''header'' => ''Authorization: OAuth '' . implode('', '', array_map(function ($v, $k) { return $k . ''="'' . rawurlencode($v) . ''"''; }, $oauth, array_keys($oauth))))))));

Este utiliza funciones anónimas y file_get_contents lugar de la biblioteca cURL. Tenga en cuenta el uso de un MD5 hasce nonce. Todos parecen estar de acuerdo con la time() , sin embargo, la mayoría de los ejemplos en la web relacionados con OAuth utilizan algún tipo de cadena cifrada (como esta: http://www.sitepoint.com/understanding-oauth-1/ ) . Esto tiene más sentido para mí también.

Nota adicional: necesita PHP 5.3+ para las funciones anónimas (en caso de que su servidor / computadora esté en una cueva de la guerra fría y no pueda actualizarlo).


Como se indica en otras respuestas, cree una aplicación de Twitter para obtener el token, la clave y el secreto. Usando el siguiente código, puede modificar los parámetros de solicitud desde un punto y evitar errores tipográficos y errores similares (cambie la matriz $request en la función returnTweet() ).

function buildBaseString($baseURI, $method, $params) { $r = array(); ksort($params); foreach($params as $key=>$value){ $r[] = "$key=" . rawurlencode($value); } return $method."&" . rawurlencode($baseURI) . ''&'' . rawurlencode(implode(''&'', $r)); } function buildAuthorizationHeader($oauth) { $r = ''Authorization: OAuth ''; $values = array(); foreach($oauth as $key=>$value) $values[] = "$key=/"" . rawurlencode($value) . "/""; $r .= implode('', '', $values); return $r; } function returnTweet(){ $oauth_access_token = "x"; $oauth_access_token_secret = "x"; $consumer_key = "x"; $consumer_secret = "x"; $twitter_timeline = "user_timeline"; // mentions_timeline / user_timeline / home_timeline / retweets_of_me // create request $request = array( ''screen_name'' => ''budidino'', ''count'' => ''3'' ); $oauth = array( ''oauth_consumer_key'' => $consumer_key, ''oauth_nonce'' => time(), ''oauth_signature_method'' => ''HMAC-SHA1'', ''oauth_token'' => $oauth_access_token, ''oauth_timestamp'' => time(), ''oauth_version'' => ''1.0'' ); // merge request and oauth to one array $oauth = array_merge($oauth, $request); // do some magic $base_info = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", ''GET'', $oauth); $composite_key = rawurlencode($consumer_secret) . ''&'' . rawurlencode($oauth_access_token_secret); $oauth_signature = base64_encode(hash_hmac(''sha1'', $base_info, $composite_key, true)); $oauth[''oauth_signature''] = $oauth_signature; // make request $header = array(buildAuthorizationHeader($oauth), ''Expect:''); $options = array( CURLOPT_HTTPHEADER => $header, CURLOPT_HEADER => false, CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); $feed = curl_init(); curl_setopt_array($feed, $options); $json = curl_exec($feed); curl_close($feed); return json_decode($json, true); }

y luego solo llame a returnTweet()


Desde su generador de firmas , puede generar comandos de curl de la forma:

curl --get ''https://api.twitter.com/1.1/statuses/user_timeline.json'' --data ''count=2&screen_name=twitterapi'' --header ''Authorization: OAuth oauth_consumer_key="YOUR_KEY", oauth_nonce="YOUR_NONCE", oauth_signature="YOUR-SIG", oauth_signature_method="HMAC-SHA1", oauth_timestamp="TIMESTAMP", oauth_token="YOUR-TOKEN", oauth_version="1.0"'' --verbose


El código pegado por Rivers es genial. ¡Muchas gracias! Soy nuevo aquí y no puedo comentar, solo quiero responder a la pregunta de javiervd (¿Cómo establecería el nombre de pantalla y contaría con este enfoque?), Ya que he perdido mucho tiempo para averiguarlo. afuera.

Debe agregar los parámetros tanto a la URL como al proceso de creación de la firma. Crear una firma es el artículo que me ayudó. Aquí está mi código:

$oauth = array( ''screen_name'' => ''DwightHoward'', ''count'' => 2, ''oauth_consumer_key'' => $consumer_key, ''oauth_nonce'' => time(), ''oauth_signature_method'' => ''HMAC-SHA1'', ''oauth_token'' => $oauth_access_token, ''oauth_timestamp'' => time(), ''oauth_version'' => ''1.0'' ); $options = array( CURLOPT_HTTPHEADER => $header, //CURLOPT_POSTFIELDS => $postfields, CURLOPT_HEADER => false, CURLOPT_URL => $url . ''?screen_name=DwightHoward&count=2'', CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false );


Esta pregunta me ayudó mucho, pero no me ayudó a comprender lo que debe suceder. Esta publicación del blog hizo un trabajo increíble al guiarme a través de él.

Aquí están los bits importantes, todo en un solo lugar:

  • Como se indicó anteriormente, DEBE firmar sus solicitudes de API 1.1. Si está haciendo algo como obtener estados públicos, querrá una clave de aplicación en lugar de una clave de usuario. El enlace completo a la página que desea es: dev.twitter.com/apps
  • Debe combinar TODOS los parámetros, tanto los únicos como los parámetros de obtención (o parámetros POST) juntos.
  • Debe ORDENAR los parámetros antes de reducirlos a la forma codificada en url que se procesa.
  • Debe codificar algunas cosas varias veces; por ejemplo, crea una cadena de consulta a partir de los valores codificados en url de los parámetros, y luego codifica ESO y concatena con el tipo de método y la url.

Simpatizo con todos los dolores de cabeza, así que aquí hay algo de código para resumirlo todo:

$token = ''YOUR TOKEN''; $token_secret = ''TOKEN SECRET''; $consumer_key = ''YOUR KEY''; $consumer_secret = ''KEY SECRET''; $host = ''api.twitter.com''; $method = ''GET''; $path = ''/1.1/statuses/user_timeline.json''; // api call path $query = array( // query parameters ''screen_name'' => ''twitterapi'', ''count'' => ''2'' ); $oauth = array( ''oauth_consumer_key'' => $consumer_key, ''oauth_token'' => $token, ''oauth_nonce'' => (string)mt_rand(), // a stronger nonce is recommended ''oauth_timestamp'' => time(), ''oauth_signature_method'' => ''HMAC-SHA1'', ''oauth_version'' => ''1.0'' ); $oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting $query = array_map("rawurlencode", $query); $arr = array_merge($oauth, $query); // combine the values THEN sort asort($arr); // secondary sort (value) ksort($arr); // primary sort (key) // http_build_query automatically encodes, but our parameters // are already encoded, and must be by this point, so we undo // the encoding step $querystring = urldecode(http_build_query($arr, '''', ''&'')); $url = "https://$host$path"; // mash everything together for the text to hash $base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring); // same with the key $key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret); // generate the hash $signature = rawurlencode(base64_encode(hash_hmac(''sha1'', $base_string, $key, true))); // this time we''re using a normal GET query, and we''re only encoding the query params // (without the oauth params) $url .= "?".http_build_query($query); $oauth[''oauth_signature''] = $signature; // don''t want to abandon all that work! ksort($oauth); // probably not necessary, but twitter''s demo does it // also not necessary, but twitter''s demo does this too function add_quotes($str) { return ''"''.$str.''"''; } $oauth = array_map("add_quotes", $oauth); // this is the full value of the Authorization line $auth = "OAuth " . urldecode(http_build_query($oauth, '''', '', '')); // if you''re doing post, you need to skip the GET building above // and instead supply query parameters to CURLOPT_POSTFIELDS $options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"), //CURLOPT_POSTFIELDS => $postfields, CURLOPT_HEADER => false, CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); // do our business $feed = curl_init(); curl_setopt_array($feed, $options); $json = curl_exec($feed); curl_close($feed); $twitter_data = json_decode($json);


Gracias a este hilo, y especialmente a Budidino porque su código es lo que lo llevó a casa para mí. Solo quería contribuir a recuperar los datos JSON de una solicitud. Realice los cambios en la parte de la matriz de solicitud "// crear solicitud" para realizar diferentes solicitudes. En última instancia, esto dará salida al JSON en la pantalla del navegador

<?php function buildBaseString($baseURI, $method, $params) { $r = array(); ksort($params); foreach($params as $key=>$value){ $r[] = "$key=" . rawurlencode($value); } return $method."&" . rawurlencode($baseURI) . ''&'' . rawurlencode(implode(''&'', $r)); } function buildAuthorizationHeader($oauth) { $r = ''Authorization: OAuth ''; $values = array(); foreach($oauth as $key=>$value) $values[] = "$key=/"" . rawurlencode($value) . "/""; $r .= implode('', '', $values); return $r; } function returnTweet(){ $oauth_access_token = "2602299919-lP6mgkqAMVwvHM1L0Cplw8idxJzvuZoQRzyMkOx"; $oauth_access_token_secret = "wGWny2kz67hGdnLe3Uuy63YZs4nIGs8wQtCU7KnOT5brS"; $consumer_key = "zAzJRrPOj5BvOsK5QhscKogVQ"; $consumer_secret = "Uag0ujVJomqPbfdoR2UAWbRYhjzgoU9jeo7qfZHCxR6a6ozcu1"; $twitter_timeline = "user_timeline"; // mentions_timeline / user_timeline / home_timeline / retweets_of_me // create request $request = array( ''screen_name'' => ''burownrice'', ''count'' => ''3'' ); $oauth = array( ''oauth_consumer_key'' => $consumer_key, ''oauth_nonce'' => time(), ''oauth_signature_method'' => ''HMAC-SHA1'', ''oauth_token'' => $oauth_access_token, ''oauth_timestamp'' => time(), ''oauth_version'' => ''1.0'' ); // merge request and oauth to one array $oauth = array_merge($oauth, $request); // do some magic $base_info = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", ''GET'', $oauth); $composite_key = rawurlencode($consumer_secret) . ''&'' . rawurlencode($oauth_access_token_secret); $oauth_signature = base64_encode(hash_hmac(''sha1'', $base_info, $composite_key, true)); $oauth[''oauth_signature''] = $oauth_signature; // make request $header = array(buildAuthorizationHeader($oauth), ''Expect:''); $options = array( CURLOPT_HTTPHEADER => $header, CURLOPT_HEADER => false, CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); $feed = curl_init(); curl_setopt_array($feed, $options); $json = curl_exec($feed); curl_close($feed); return $json; } $tweet = returnTweet(); echo $tweet; ?>



Primero que todo quería agradecer a jimbo y ( su biblioteca simple de post / twitter-api-php).

Si va a utilizar la API GET search / tweets con la biblioteca PHP "twitter-api-php" (TwitterAPIExchange.php):

Primero, solo tiene que comentar el área del código "Realizar una solicitud POST y repetir la respuesta".

Simplemente use el código "Realizar una solicitud GET y haga eco de la respuesta", haga eco de la respuesta y cambie estas dos líneas:

$url = ''https://api.twitter.com/1.1/followers/ids.json''; $getfield = ''?screen_name=J7mbo'';

a

$url = ''https://api.twitter.com/1.1/search/tweets.json''; $getfield = ''?q=J7mbo'';

(Cambia screen_name a q , eso es :)


Si tiene instalada la biblioteca PHP de OAuth, no debe preocuparse por usted mismo para realizar la solicitud.

$oauth = new OAuth($consumer_key, $consumer_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI); $oauth->setToken($access_token, $access_secret); $oauth->fetch("https://api.twitter.com/1.1/statuses/user_timeline.json"); $twitter_data = json_decode($oauth->getLastResponse()); print_r($twitter_data);

Para más información, echa un vistazo a los docs o su example . Puedes usar pecl install oauth para obtener la biblioteca.


Vaya a dev.twitter.com y cree una aplicación . Esto le proporcionará las credenciales que necesita. Aquí hay una implementación que he escrito recientemente con PHP y cURL .

<?php function buildBaseString($baseURI, $method, $params) { $r = array(); ksort($params); foreach($params as $key=>$value){ $r[] = "$key=" . rawurlencode($value); } return $method."&" . rawurlencode($baseURI) . ''&'' . rawurlencode(implode(''&'', $r)); } function buildAuthorizationHeader($oauth) { $r = ''Authorization: OAuth ''; $values = array(); foreach($oauth as $key=>$value) $values[] = "$key=/"" . rawurlencode($value) . "/""; $r .= implode('', '', $values); return $r; } $url = "https://api.twitter.com/1.1/statuses/user_timeline.json"; $oauth_access_token = "YOURVALUE"; $oauth_access_token_secret = "YOURVALUE"; $consumer_key = "YOURVALUE"; $consumer_secret = "YOURVALUE"; $oauth = array( ''oauth_consumer_key'' => $consumer_key, ''oauth_nonce'' => time(), ''oauth_signature_method'' => ''HMAC-SHA1'', ''oauth_token'' => $oauth_access_token, ''oauth_timestamp'' => time(), ''oauth_version'' => ''1.0''); $base_info = buildBaseString($url, ''GET'', $oauth); $composite_key = rawurlencode($consumer_secret) . ''&'' . rawurlencode($oauth_access_token_secret); $oauth_signature = base64_encode(hash_hmac(''sha1'', $base_info, $composite_key, true)); $oauth[''oauth_signature''] = $oauth_signature; // Make requests $header = array(buildAuthorizationHeader($oauth), ''Expect:''); $options = array( CURLOPT_HTTPHEADER => $header, //CURLOPT_POSTFIELDS => $postfields, CURLOPT_HEADER => false, CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); $feed = curl_init(); curl_setopt_array($feed, $options); $json = curl_exec($feed); curl_close($feed); $twitter_data = json_decode($json); //print it out print_r ($twitter_data); ?>

Esto se puede ejecutar desde la línea de comando:

$ php <name of PHP script>.php


Si es útil para cualquiera ... En mi blog, he implementado el siguiente código PHP para recuperar los últimos tweets, extraer sus datos más relevantes y luego guardarlos en una base de datos MySQL. Funciona porque lo tengo en mi blog.

La tabla de "tweets" donde se almacenan:

CREATE TABLE IF NOT EXISTS `tweets` ( `tweet_id` int(11) NOT NULL auto_increment, `id_tweet` bigint(20) NOT NULL, `text_tweet` char(144) NOT NULL, `datetime_tweet` datetime NOT NULL, `dayofweek_tweet` char(3) NOT NULL, `GMT_tweet` char(5) NOT NULL, `shorturl_tweet` char(23) NOT NULL, PRIMARY KEY (`tweet_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=83 ;

get_tweets.php:

<?php function buildBaseString($baseURI, $method, $params) { $r= array(); ksort($params); foreach($params as $key=>$value){ $r[]= "$key=".rawurlencode($value); } return $method."&".rawurlencode($baseURI).''&''.rawurlencode(implode(''&'', $r)); } function buildAuthorizationHeader($oauth) { $r= ''Authorization: OAuth ''; $values= array(); foreach($oauth as $key=>$value) { $values[]= "$key=/"".rawurlencode($value)."/""; } $r.= implode('', '', $values); return $r; } function returnTweets($last_id) { $oauth_access_token = "2687912757-vbyfJA483SEyj2HJ2K346aVMxtOIgVbsY4Edrsw"; $oauth_access_token_secret = "nIruzmR0bXqC3has4fTf8KAq4pgOceiuKqjklhroENU4W"; $api_key = "ieDSTFH8QHHPafg7H0whQB9GaY"; $api_secret = "mgm8wVS9YP93IJmTQtsmR8ZJADDNdlTca5kCizMkC7O7gFDS1j"; $twitter_timeline = "user_timeline"; //[mentions_timeline/user_timeline/home_timeline/retweets_of_me] //create request $request= array( ''screen_name'' => ''runs_ES'', ''count'' => ''3'', ''exclude_replies'' => ''true'' ); if (!is_null($last_id)) { //Add to the request if it exits a last_id $request[''since_id'']= $max_id; } $oauth = array( ''oauth_consumer_key'' => $api_key, ''oauth_nonce'' => time(), ''oauth_signature_method'' => ''HMAC-SHA1'', ''oauth_token'' => $oauth_access_token, ''oauth_timestamp'' => time(), ''oauth_version'' => ''1.0'' ); //merge request and oauth to one array $oauth= array_merge($oauth, $request); //do some magic $base_info= buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", ''GET'', $oauth); $composite_key= rawurlencode($api_secret).''&''.rawurlencode($oauth_access_token_secret); $oauth_signature= base64_encode(hash_hmac(''sha1'', $base_info, $composite_key, true)); $oauth[''oauth_signature'']= $oauth_signature; //make request $header= array(buildAuthorizationHeader($oauth), ''Expect:''); $options= array(CURLOPT_HTTPHEADER => $header, CURLOPT_HEADER => false, CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false); $feed= curl_init(); curl_setopt_array($feed, $options); $json= curl_exec($feed); curl_close($feed); return $json; } function parse_tweettext($tweet_text) { $text= substr($tweet_text, 0, -23); $short_url= substr($tweet_text, -23, 23); return array (''text''=>$text, ''short_url''=> $short_url); } function parse_tweetdatetime($tweetdatetime) { //Thu Aug 21 21:57:26 +0000 2014 Sun Mon Tue Wed Thu Fri Sat $months= array(''Jan''=>''01'', ''Feb''=>''02'', ''Mar''=>''03'', ''Apr''=>''04'', ''May''=>''05'', ''Jun''=>''06'', ''Jul''=>''07'', ''Aug''=>''08'', ''Sep''=>''09'', ''Oct''=>''10'', ''Nov''=>''11'', ''Dec''=>''12''); $GMT= substr($tweetdatetime, -10, 5); $year= substr($tweetdatetime, -4, 4); $month_str= substr($tweetdatetime, 4, 3); $month= $months[$month_str]; $day= substr($tweetdatetime, 8, 2); $dayofweek= substr($tweetdatetime, 0, 3); $time= substr($tweetdatetime, 11, 8); $date= $year.''-''.$month.''-''.$day; $datetime= $date.'' ''.$time; return array(''datetime''=>$datetime, ''dayofweek''=>$dayofweek, ''GMT''=>$GMT); //datetime: "YYYY-MM-DD HH:MM:SS", dayofweek: Mon, Tue..., GMT: +#### } //First check in the database the last id tweet: $query= "SELECT MAX(tweets.id_tweet) AS id_last FROM tweets;"; $result= exec_query($query); $row= mysql_fetch_object($result); if ($result!= 0 && mysql_num_rows($result)) { //if error in query or not results $last_id= $row->id_last; } else { $last_id= null; } $json= returnTweets($last_id); $tweets= json_decode($json, TRUE); foreach ($tweets as $tweet) { $tweet_id= $tweet[''id'']; if (!empty($tweet_id)) { //if array is not empty $tweet_parsetext= parse_tweettext($tweet[''text'']); $tweet_text= utf8_encode($tweet_parsetext[''text'']); $tweet_shorturl= $tweet_parsetext[''short_url'']; $tweet_parsedt= parse_tweetdatetime($tweet[''created_at'']); $tweet_datetime= $tweet_parsedt[''datetime'']; $tweet_dayofweek= $tweet_parsedt[''dayofweek'']; $tweet_GMT= $tweet_parsedt[''GMT'']; //Insert the tweet into the database: $fields = array( ''id_tweet'' => $tweet_id, ''text_tweet'' => $tweet_text, ''datetime_tweet'' => $tweet_datetime, ''dayofweek_tweet'' => $tweet_dayofweek, ''GMT_tweet'' => $tweet_GMT, ''shorturl_tweet'' => $tweet_shorturl ); $new_id= mysql_insert(''tweets'', $fields); } } //end of foreach ?>

La función para guardar los tweets:

function mysql_insert($table, $inserts) { $keys = array_keys($inserts); exec_query("START TRANSACTION;"); $query= ''INSERT INTO `''.$table.''` (`''.implode(''`,`'', $keys).''`) VALUES (/'''.implode(''/',/''', $inserts).''/')''; exec_query($query); $id= mysql_insert_id(); if (mysql_error()) { exec_query("ROLLBACK;"); die("Error: $query"); } else { exec_query("COMMIT;"); } return $id; }


$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET); $timelines = $connection->get(''statuses/user_timeline'', array(''screen_name'' => ''NSE_NIFTY'', ''count'' => 100, ''include_rts'' => 1));