Ejemplo de PHP más simple para recuperar user_timeline con Twitter API versión 1.1
Frecuentes
Visto 314,451 equipos
303
Debido al retiro de Twitter API 1.0 a partir de Junio 11th 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 user_timeline (estados recientes) con el menor código posible?
Encontré esto: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline pero me sale el siguiente error:
"{"errors":[{"message":"Could not authenticate you","code":32}]}"
Hay muchas clases por ahí, pero después de probar varias, ninguna parece funcionar debido a estas actualizaciones en Twitter, además, algunas de ellas son clases bastante avanzadas con muchas funciones que realmente no necesito.
¿Cuál es la forma más simple/corta de obtener los estados de usuario recientes con PHP?
14 Respuestas
834
Nota Importante: A mediados de 2018, el proceso para obtener tokens API de Twitter se volvió mucho más burocrático. me ha tomado el control una semana laboral para recibir un conjunto de tokens API, y esto es para un proyecto de código abierto para ustedes, chicos y chicas con más de 1.2 millones de instalaciones en Packagist y 1.6 estrellas en Github, que teóricamente debería tener mayor prioridad.
Si tiene la tarea de trabajar con la API de Twitter para su trabajo, debe tener en cuenta este tiempo de espera potencialmente extremadamente largo. Considere también otras vías de medios sociales como Facebook o Instagram y brinde estas opciones, ya que el proceso para recuperar sus tokens es instantáneo.
Entonces, ¿quieres usar la API de Twitter v1.1?
Nota: los archivos para estos están en GitHub.
Versión 1.0 pronto quedará obsoleto y no se permitirán solicitudes no autorizadas. Entonces, aquí hay una publicación para ayudarlo a hacer precisamente eso, junto con una clase de PHP para facilitarle la vida.
1. Cree una cuenta de desarrollador: Configure usted mismo un cuenta de desarrollador en Twitter
Debe visitar el sitio oficial para desarrolladores de Twitter y registrarse para obtener una cuenta de desarrollador. Esto es un gratuitos y paso necesario para realizar solicitudes de la API v1.1.
2. Crea una aplicación: Crear una aplicación en el sitio para desarrolladores de Twitter
¿Qué? ¿Pensaste que podías hacer solicitudes no autenticadas? No con la API v1.1 de Twitter. tienes que visitar http://dev.twitter.com/apps y haga clic en el botón "Crear aplicación".
En esta página, complete los detalles que desee. Para mí, no importaba, porque solo quería hacer un montón de solicitudes de bloqueo para deshacerme de los seguidores no deseados. El punto es que te vas a conseguir un conjunto de claves únicas utilizar para su aplicación.
Entonces, el objetivo 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 secreto del token de acceso
Hay un poco de información aquí sobre para qué sirven estas fichas.
3. Crea tokens de acceso: los necesitará para realizar solicitudes exitosas
OAuth pide algunas fichas. Por lo tanto, debe generarlos para usted.
Haga clic en "crear mi token de acceso" en la parte inferior. Luego, una vez que se desplace hasta la parte inferior nuevamente, tendrá algunas claves recién generadas. Debe obtener las cuatro claves previamente etiquetadas de esta página para sus llamadas API, así que tome nota de ellas 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 Leer y escribir si está haciendo algo más que la recuperación de datos estándar usando peticiones.
Elija la pestaña "Configuración" cerca de la parte superior de la página.
Otorgue acceso de lectura/escritura a su aplicación y presione "Actualizar" en la parte inferior.
solicite leer más sobre el modelo de permisos de aplicaciones que Twitter usa aquí.
5. Escribir código para acceder a la API: He hecho la mayor parte por ti
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 usa OAuth y del API de Twitter v1.1, y la clase que he creado que puedes 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 claves que obtuvo de su aplicación anterior en sus respectivos espacios.
A continuación, debe elegir una URL a la que desea realizar una solicitud. Twitter tiene su Documentación de la 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 por un PUBLICAR solicitud, eso es todo!
Para una solicitud, 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 simple solicitud GET de 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, miren esta publicación. Esta biblioteca usa cURL debajo del capó, por lo que debe asegurarse de tener sus certificados cURL configurados probablemente. Google también es tu amigo.
Respondido el 20 de junio de 20 a las 10:06
@kaffolder El enlace en esa página:profilepicture.co.uk/caching-api-responses-php sugiere una forma sencilla de hacerlo. Usted escribe sus datos de Twitter en un archivo o base de datos (MySQL o MongoDB) en la primera solicitud, luego, en cada solicitud posterior, verifica la hora actual con el límite de tiempo que desea para el archivo (puede nombre el archivo como el límite de tiempo), y si el archivo existe y el nombre del archivo está dentro del límite de tiempo que desea, extraiga los datos en lugar de realizar la solicitud API. Si el archivo existe pero se pasa el límite de tiempo, elimine el archivo y luego realice la solicitud API. - Jimbo
No puedo entender cómo manejar los datos json una vez devueltos. No quiero simplemente repetirlo en la pantalla como en echo $twitter ->setGetfield($getfield) ->buildOauth($url, $requestMethod) ->performRequest(); DISCULPAS, ¡no puedo entender cómo hacer saltos de línea! Quiero hacer algo como $jsonData = json_decode($twitter); pero no funciona - Siento que me estoy perdiendo algo fundamental pero el centavo no cae... - Ashley
Gracias, la documentación de Twitter es un desastre desorganizado, esto fue de gran ayuda. - joren
Hay bastantes requisitos previos para que esta clase funcione en Windows. Necesitas tener una versión de trabajo de cURL cargado en tu php.ini
archivo y también necesita cargar los certificados de CA en su php.ini
El uso de archivos curl.cainfo = path\to\cacert.pem
. Puede obtener los certificados de CA aquí. - Jake Z
@Jimbo Estaba notando que algunas de las extensiones cURL predeterminadas tienen errores en Windows y requieren reemplazo (de ahí el enlace a las versiones "arregladas") y que sin cargar los certificados de CA, su clase devuelve un falso, como curl_error () informa que `Problema de certificado SSL, verifique que el certificado CA esté bien`. Esto se puede evitar desactivando CURLOPT_SSL_VERIFYPEER, pero pensé que incluiría las instrucciones básicas para usar los certificados de CA. Acabo de incluir esto para ahorrar potencialmente a algunas personas unos minutos de búsqueda. - Jake Z
141
Ve a dev.twitter.com y crea 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
respondido 21 mar '15, 22:03
Gracias por el fragmento de código, funciona perfectamente. El único problema es que parece que no puedo averiguar cómo configurar el retorno del recuento de publicaciones. Solo devuelve 20 y quiero la cantidad total, que es 200 según el límite de Twitter. - Flatlyn
¿Cómo configuraría el screen_name
y count
con este enfoque? Intenté agregarlo a la $url
variable pero obtuve el error "No se pudo autenticar". - Javier Villanueva
¡Este código funciona muy bien! Estoy tratando de modificarlo para usar la api search/tweets.json, pero siempre obtengo la respuesta 'no se pudo autenticar', ¿alguna idea? - Chris
Esta publicación ha sido muy útil. Mi código no parece regresar de curl_init()
aunque. He mirado algunos ejemplos y se ven muy simples y directos y exactamente como este código aquí... ¿Necesito instalar algo especial? - jessicaraygun
Funcionó para mí el 26 de octubre de 2016. El resultado fue un poco más complejo de lo que esperaba. - JohnC
62
El código pegado por Rivers es genial. ¡Muchas gracias! Soy nuevo aquí y no puedo comentar, solo me gustaría responder a la pregunta de javiervd (¿Cómo configurarías el nombre de la pantalla y contarías con este enfoque?), ya que he perdido mucho tiempo para resolverlo. afuera.
Debe agregar los parámetros tanto a la Enlance y al proceso de creación de la firma. Creando 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
);
respondido 23 mar '14, 16:03
No puedo votar esto lo suficiente. En la documentación de la API de Twitter, esto lo mira a la cara, pero nunca es súper 'obvio'. ¿Este enfoque interfiere con la buildAuthorizationHeader
¿función? Lo implementé por separado. - Moe
No he trabajado con esto durante mucho tiempo, así que no recuerdo, si aún no ha resuelto su problema, puedo investigarlo en los próximos días. - lacovic10
He estado tratando de adaptar su solución para realizar el POST en statuses/update.json sin suerte, ¿tiene alguna idea de cómo podría lograrse esto? - cazador de perros
@perrohunter no tengo idea de que tendría que investigar más sobre esto. Si no encuentras la manera en un par de días, envíame un mensaje e intentaré ayudarte. - lacovic10
23
Como se indicó en otras respuestas, cree una aplicación de Twitter para obtener el token, la clave y el secreto. Con el siguiente código, puede modificar los parámetros de solicitud desde un solo lugar y evitar errores tipográficos y similares (cambiar $request
matriz en returnTweet()
función).
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 llama returnTweet()
Respondido 25 Abr '13, 15:04
Impresionante trabajo @budidino! Creó la aplicación en dev.twitter.com/apps y llenó sus x con oauth_access_token, oauth_access_token_secret, consumer_key, consumer_secret. * tenga en cuenta * que debe presionar "crear mi token de acceso" y demora unos segundos en generarse, así que espere. - Theo
@budidino dnt, ¿necesitamos incluir alguna biblioteca? - mi madre
Completé las claves, agregué esto a mi functions.php
archivo en WordPress, poner <?php echo returnTweet(); ?>
en un archivo HTML, y genera la palabra "Array" y nada más. - J82
@Desi, el resultado es una variedad de tweets, debe manejar cómo muestra cada uno de ellos. prueba print_r(returnTweet()) solo para ver qué hay dentro. Mira este ejemplo de mostrar todos los tweets: gist.github.com/budidino/9681764#file-stackoverflow-returntweet - budiDino
Si desea obtener solo el último tweet, debe modificar la matriz $request y establecer el conteo en 1. Digamos que usa $tweet = returnTweet(); luego, si desea mostrar el último tweet (en este caso, el único), puede escribir algo como esto: echo "último tweet:" .$tweet[0]["texto"]; Asegúrese de verificar la estructura de los twitter devueltos si desea extraer algo más que el texto del tweet (ejemplo $userProfileImageURL = $tweet[0]["user"]["profile_image_url"]). dev.twitter.com/docs/api/1.1/get/statuses/user_timeline - budiDino
17
¡Gracias Kris!
Me funcionó sin usar parámetros a la consulta, siempre que usaba más de un parámetro me mostraba el error: 32 No se pudo autenticar.
El problema para mí estaba en la codificación ampersand. Entonces, en su 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ó usando 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.
Respondido 05 Abr '13, 18:04
¡Muchas gracias, la mejora de tu código funciona bien! Una pregunta re: "// se recomienda un nonce más fuerte". ¿Qué podría ser eso? tiempo()? - Sebastián
Gracias por señalar eso. Sebastian: un nonce es un token de un solo uso que debe ser criptográficamente seguro. mt_rand() es demasiado corto (32 bits) y no es un PRNG criptográfico. En teoría, esto hace que el token de autenticación sea débil, pero en aras de la simplicidad en mi código de ejemplo original, quería usar algo que estuviera a mano en PHP y que fuera fácilmente comprensible. - kris reeves
recibiendo el error 32. No se pudo autenticar. ¿Alguna ayuda, por favor? He usado tu código anterior - saadk
@frewuill, eres genial hermano, me está funcionando de maravilla, gracias. - vijay
@frewuill ESTA fue la mejor respuesta, también funciona con parámetros y puedo confirmar que funciona incluso con la nueva API de Twitter 2.0. - camilo777
9
Esta pregunta me ayudó mucho, pero no me ayudó a comprender lo que debe suceder. Esta publicación de blog hizo un trabajo increíble al guiarme a través de él.
Aquí están las partes importantes 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: https://dev.twitter.com/apps
- Debe codificar TODOS los parámetros, tanto los de autenticación como los parámetros de obtención (o parámetros POST) juntos.
- Debe ORDENAR los parámetros antes de reducirlos a la forma codificada de URL que se codifica.
- 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 en url y concatena con el tipo de método y la url.
Simpatizo con todos los dolores de cabeza, así que aquí hay un código para terminarlo 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);
respondido 14 mar '13, 01:03
5
Si tiene instalada la biblioteca PHP OAuth, no tiene que preocuparse por realizar la solicitud usted mismo.
$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 obtener más información, consulte El documentos o la ejemplo. Usted puede utilizar pecl install oauth
para conseguir la biblioteca.
respondido 18 mar '13, 18:03
5
Antes que nada quería agradecer a jimbo y (su post /biblioteca simple twitter-api-php).
Si va a utilizar el OBTENER API de búsqueda/tweets con la biblioteca PHP "twitter-api-php" (TwitterAPIExchange.php):
Primero, solo tiene que comentar el área de código "Realizar una solicitud POST y hacer eco de la respuesta".
Simplemente use el código "Realizar una solicitud GET y repetir la respuesta" y repetir la respuesta y cambiar 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';
(Cambiar screen_name
a q
, eso es todo :)
respondido 23 mar '14, 16:03
aun no tengo suerte :/ - Ricardo
2
Necesitarás un para crear una "aplicación" en Twitter (y necesitas una cuenta de Twitter para hacer esto).
Entonces, necesitas usar OAuth para realizar una solicitud autorizada a Twitter.
Puede utilizar el OBTENER estados / user_timeline recurso para obtener una lista de tweets recientes.
Respondido 16 Oct 12, 19:10
Por favor, para nosotros, gente estúpida, explíquese. Está dando tanta información, si no menos, que la documentación. ¿Usas PHP? HttpRequest()
función para el paso 2? Está el PHP TwitterOAuth de Abraham: github.com/abraham/twitteroauth - biblioteca que se supone que debe hacer esto también, pero en realidad no se proporciona un ejemplo de cómo implementarlo. - RC Neil
github.com/abraham/twitteroauth/blob/master/test.php parece tener un montón de ejemplos! - Mateo Rapati
@MatthewRapati Falta la página. - RN Kushwaha
0
Aquí hay uno 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.
Simplemente complete las claves y ajuste $count
a tu 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))))))));
Éste utiliza funciones anónimas y file_get_contents
en lugar de la biblioteca cURL. Tenga en cuenta el uso de un nonce hash MD5. Todo el mundo parece estar de acuerdo con el time()
De momento, sin embargo, la mayoría de los ejemplos en la web relacionados con OAuth usan 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).
Respondido el 13 de enero de 15 a las 13:01
-1
De sus generador de firmas, puedes generar curl
comandos 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
respondido 21 mar '15, 21:03
-2
$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));
Respondido el 23 de junio de 14 a las 08:06
Incluya una explicación sobre lo que hace este código, para que el OP pueda aprender de él. - cerbro
-2
Gracias a este hilo, y especialmente a budidino porque su código es lo que me llevó a casa. Solo quería contribuir a cómo recuperar los datos JSON de una solicitud. Realice cambios en la matriz de solicitud "//crear solicitud" que forma parte del código para realizar diferentes solicitudes. En última instancia, esto generará el 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;
?>
Respondido 04 Jul 14, 00:07
-2
Si le sirve a alguien... 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 almacenarlos:
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;
}
Respondido el 31 de diciembre de 15 a las 15:12
'Funciona porque lo tengo en mi blog' es uno de mis favoritos. Tu publicación no responde la pregunta real. Además, el código php que está utilizando tiene mala calidad. Lee un poco aquí phptherightway.com . Especialmente sobre DB - Maciej Paprocki
¡También ha hecho públicas todas sus claves y tokens, así que no se sorprenda si alguien lo toma y piratea su cuenta de Twitter! - garrettlynchirl
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php twitter or haz tu propia pregunta.
Mataría por la respuesta a esto. Su documentación es terriblemente mala. - RCNeil
Soy nuevo en la API de Twitter y tengo problemas con ella. Me encontré usando un código obsoleto. - Anthony
Echa un vistazo a aamirafridi.com/twitter/… - Aamir Afridi
@Mark ¡Gracias Marcos! ¡¡Eso fue fácil!! Eso no funcionó para mí inicialmente. Estoy ejecutando WAMP. Tuve que hacer un cambio en mi php.ini en mi directorio de Apache de acuerdo con este hilo: stackoverflow.com/questions/5444249/… - Adlin Ling
Acabo de escribir la solución sin CURL ni ninguna otra biblioteca adicional: stackoverflow.com/questions/17049821/… - Rauli Rajande