php - template - El estado de obtención de Twitter falla con parámetros adicionales
twitter card template (1)
Editar: respondí mi propia pregunta. No conozco la etiqueta adecuada para indicar esto en la pregunta original o simplemente responder y aceptarlo yo mismo.
¿Cómo agrego parámetros adicionales para filtrar los retweets y las respuestas?
Traté de enviar una pregunta a los foros de desarrolladores de twitter, pero creo que obtendré mejores resultados también preguntándola aquí.
He utilizado el código de muestra de esta respuesta para implementar una recuperación de estados de trabajo. Quiero intentar filtrar los retweets y las respuestas utilizando los parámetros que vi en la aplicación de desarrollo de Twitter y actualizar la URL de
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
a
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json?include_rts=false";
que devuelve un error 23 "No se pudo autenticar".
Mi "conjetura" es que no debería incluir los parámetros adicionales en la url base, sino como parámetros adicionales en la matriz oauth donde el código de muestra fue comentado.
// 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);
Código de muestra completo con tokens eliminados.
<?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";
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json?include_rts=false";
$oauth_access_token = "removed";
$oauth_access_token_secret = "removed";
$consumer_key = "removed";
$consumer_secret = "removed";
$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);
foreach ($twitter_data as $tweet)
{
$text = $tweet->text;
echo $text . "</br></br>";
}
?>
Entonces el cambio es bastante simple. Los params no pertenecen a la url principal. La url es solo la url base, luego los params se agregan a la matriz oauth y los params se agregan adicionalmente a la url en la matriz $ options.
Se muestra con dos parámetros excluye retweets y respuestas.
<?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 = "removed";
$oauth_access_token_secret = "removed";
$consumer_key = "removed";
$consumer_secret = "removed";
$oauth = array( ''exclude_replies'' => ''true'',
''include_rts'' => ''false'',
''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 . ''?exclude_replies=true&include_rts=false'',
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);
foreach ($twitter_data as $tweet)
{
$text = $tweet->text;
echo $text . "</br></br>";
}
?>