2012-10-20 1 views
7

Modifica: Ho risposto alla mia domanda. Non conosco l'etichetta corretta per indicare questo nella domanda originale o semplicemente per rispondere e accettarlo da solo.Lo stato di ricezione di Twitter ha esito negativo con parametri aggiuntivi

Come aggiungere parametri aggiuntivi per filtrare i retweet e le risposte?

Ho provato a inviare una domanda ai forum di twitter dev, ma penso che otterrò risultati migliori chiedendole anche qui.

Ho utilizzato il codice di esempio da questo answer per implementare un recupero di stati di lavoro. Voglio cercare di filtrare i retweet e le risposte utilizzando i parametri che ho visto sul Twitter dev api e aggiornare l'URL dal

$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"; 

che restituisce un errore 23 "Could not autenticarti ".

La mia "ipotesi" è che non dovrei includere i parametri aggiuntivi nell'URL di base, ma come parametri aggiuntivi nell'array oauth in cui è stato commentato il codice di esempio.

// 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); 

Codice completo del campione con token rimossi.

<?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>"; 
} 

?> 
+3

Twitter dice che la richiesta è una richiesta 'GET', quindi mettere i parametri nell'array' POST' probabilmente non darà il risultato desiderato. –

+0

Sono d'accordo. Stavo disegnando a cannucce con quello. – TEEKAY

+0

In questo momento sono rassegnato a filtrarli in modo programmatico dopo il fatto, ma ho visto questo post sui forum di Twitter Dev e sembra rilevante. Stesso codice campione, direzione diversa ma problema simile. Probabilmente lo esaminerò più tardi. https://dev.twitter.com/discussions/12242 – TEEKAY

risposta

3

Quindi il cambiamento è piuttosto semplice. I parametri non appartengono all'URL principale. L'url è solo l'url di base, quindi i parametri vengono aggiunti all'array oauth e i parametri vengono aggiunti all'url nell'array $ options.


Mostrato con due parametri esclude i retweet e le risposte.

<?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>"; 
} 

?> 
+1

QUESTO era il mio problema ... strano modo di inviare parametri semplici. Non l'ho capito nella documentazione dell'API –