El ejemplo de PHP más simple para recuperar user_timeline con la API de Twitter versión 1.1

Resuelto fellowworldcitizen asked hace 54 años • 14 respuestas

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?

fellowworldcitizen avatar Jan 01 '70 08:01 fellowworldcitizen
Aceptado

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".

Ingrese la descripción de la imagen aquí

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.

Ingrese la descripción de la imagen aquí

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 .

Ingrese la descripción de la imagen aquí

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

Ingrese la descripción de la imagen aquí

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.

Jimbo avatar Mar 09 '2013 19:03 Jimbo

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
Rivers avatar Oct 17 '2012 17:10 Rivers

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
           );
lackovic10 avatar Dec 22 '2012 23:12 lackovic10

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 $requestla 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()

budiDino avatar Apr 23 '2013 12:04 budiDino

¡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("&amp;","&",$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("&amp;","&",$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.

Frewuill avatar Apr 05 '2013 17:04 Frewuill