El ejemplo de PHP más simple para recuperar user_timeline con la API de Twitter versión 1.1
Debido al retiro de Twitter API 1.0 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 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 aparece el siguiente error:
"{"errors":[{"message":"Could not authenticate you","code":32}]}"
Hay muchas clases disponibles, 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 sencilla/corta de obtener los estados de usuario recientes con PHP?
Nota importante: a partir de mediados de 2018, el proceso para obtener tokens API de Twitter se volvió mucho más burocrático. Me llevó más de una semana laboral 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,6k estrellas en Github, que en teoría debería ser una 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 redes sociales como Facebook o Instagram y brinde estas opciones, ya que el proceso para recuperar sus tokens es instantáneo.
¿Quieres utilizar 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 solicitudes no autorizadas. Entonces, aquí tienes una publicación para ayudarte a hacer precisamente eso, junto con una clase de PHP para hacerte la vida más fácil.
1. Cree una cuenta de desarrollador: configure una cuenta de desarrollador en Twitter
Debe visitar el sitio oficial para 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. Cree una aplicación: cree una aplicación en el sitio para desarrolladores de Twitter.
¿Qué? ¿Pensaste que podías realizar solicitudes no autenticadas? No con la API v1.1 de Twitter. Debe 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 un montón de solicitudes de bloqueo para deshacerme de los seguidores de spam. El punto es que obtendrá un conjunto de claves únicas para usar en su aplicación.
Entonces, el objetivo de crear una aplicación es brindarte 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
Aquí hay un poco de información sobre para qué sirven estos tokens.
3. Cree tokens de acceso : los necesitará para realizar solicitudes exitosas
OAuth solicita algunos tokens. Por lo tanto, debe generarlos para usted.
Haga clic en "crear mi token de acceso" en la parte inferior. Luego, una vez que te desplaces hacia abajo nuevamente, tendrás algunas claves recién generadas. Debe tomar las cuatro claves previamente etiquetadas de esta página para sus llamadas API, así que anótelas en algún lugar.
4. Cambie el nivel de acceso : no desea que sea de 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 más que la recuperación de datos estándar mediante solicitudes GET .
Elija la pestaña "Configuración" cerca de la parte superior de la página.
Dale a tu aplicación acceso de lectura/escritura y presiona "Actualizar" en la parte inferior.
Puede leer más sobre el modelo de permisos de aplicaciones que utiliza Twitter aquí.
5. Escriba código para acceder a la API : he hecho la mayor parte por usted
Combiné el código anterior, con algunas modificaciones y cambios, en una clase PHP para que sea realmente sencillo realizar las solicitudes que necesitas.
Esto utiliza OAuth y la API de Twitter v1.1 , y la clase que he creado y 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 la URL a la que desea realizar una solicitud. Twitter tiene su documentación API para ayudarte 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 usamos la URL "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. He aquí 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 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; Lo sé (lo usé para 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 internamente, por lo que probablemente debes asegurarte de tener tus certificados de cURL configurados. Google también es tu amigo.
Vaya a dev.twitter.com y cree una aplicación . Esto le proporcionará las credenciales que necesita. Aquí hay una implementación que escribí 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
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 pantalla y contarías con este enfoque?), ya que he perdido mucho tiempo para resolverlo. afuera.
Debe agregar los parámetros tanto a la URL como al proceso de creación de 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
);
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 la solicitud desde un solo lugar y evitar errores tipográficos y similares (cambiar $request
la matriz en returnTweet()
la 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 simplemente llamareturnTweet()
¡Gracias Kris!
A mi me funcionó sin usar parámetros a la consulta, cada vez 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 del signo comercial. Entonces 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ó usando dos o más parámetros como screen_name y count.
El código completo 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 yo tuve.