API Twitter - подсчет количества твитов определенной строки - PullRequest
0 голосов
/ 05 июня 2018

Я использую твиттер-API, чтобы попытаться получить целое число, которое сообщает мне, сколько твитов имеется в определенной строке, которую я даю.

например, я ищу "mercedes", а затем хочу получить целое число из твиттера, которое говорит: "1249".1249 означало бы, что за последние 2 недели было так много твитов.Насколько я знаю, Twitter возвращает данные только за последние 2 недели.Из-за меня тоже нормально, если я верну все записи и извлечу их с помощью php или тому подобного.Я уже отправил несколько тестовых запросов, но всегда возвращаю только массивы с максимум 20 записями.

У кого-нибудь есть решение?

И я уже рассматривал похожие вопросы, но не смог найти то, что мне помогло.Многие ответы на вопросы, которые я видел, больше не работают, так как твиттер и его API изменились и эволюционировали

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Я также не смог найти решение, поэтому я кодировал его, используя кусочки кода и идеи, как предыдущий @ JeffProd one , и избегая использования библиотеки lib.Я надеюсь, что это может помочь вам.

PS: Вы должны подать заявку на учетную запись разработчика Twitter и создать приложение, чтобы получить свои токены и ключи.

<?php
//Access token & access token secret
define("TOKEN", 'XXXXXXXXXXXXXXXX'); //Access token
define("TOKEN_SECRET", 'XXXXXXXXXXXXXXXX'); //Access token secret
//Consumer API keys
define("CONSUMER_KEY", 'XXXXXXXXXXXXXXXX'); //API key
define("CONSUMER_SECRET", 'XXXXXXXXXXXXXXXX'); //API secret key

$method='GET';
$host='api.twitter.com';
$path='/1.1/search/tweets.json'; //API call path
$url="https://$host$path";
//Query parameters
$query = array(
    'q' => 'wordtosearch',          /* Word to search */
    'count' => '100',               /* Specifies a maximum number of tweets you want to get back, up to 100. As you have 100 API calls per hour only, you want to max it */
    'result_type' => 'recent',      /* Return only the most recent results in the response */
    'include_entities' => 'false'   /* Saving unnecessary data */
);
//time window in hours
define("WINDOW", 1); 

//Authentication
$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'
);
//Used in Twitter's demo
function add_quotes($str) { return '"'.$str.'"'; }

//Searchs Twitter for a word and get a couple of results
function twitter_search($query, $oauth, $url){  
    global $method; 

    $arr=array_merge($oauth, $query); //Combine the values THEN sort
    asort($arr); //Secondary sort (value)
    ksort($arr); //Primary sort (key)
    $querystring=http_build_query($arr,'','&');
    //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=str_replace("&amp;","&",$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
    $oauth=array_map("add_quotes", $oauth); //Also not necessary, but twitter's demo does this too  
    //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);
    //Query Twitter API
    $feed=curl_init();
    curl_setopt_array($feed, $options);
    $json=curl_exec($feed);
    curl_close($feed);
    //Return decoded response
    return json_decode($json);
};

//Initializing
$done = false;      //Loop flag
$countTweets=0;     //Tweets fetched
$twitter_data = new stdClass();
$now=new DateTime(date('D M j H:i:s O Y')); //Current search time

//Fetching starts
do{
    $twitter_data = twitter_search($query,$oauth,$url);
    //Partial results, updating the total amount of tweets fetched
    $countTweets += count($twitter_data->statuses); 
    //If not all the tweets have been fetched, then redo... 
    if(isset($twitter_data->search_metadata->next_results)){        
        //Parsing information for max_id in tweets fetched
        $string="?max_id="; 
        $parse=explode("&",$twitter_data->search_metadata->next_results);       
        $maxID=substr($parse[0],strpos($parse[0],$string)+strlen($string));     
        $query['max_id'] = -1+$maxID; //Returns results with an ID less than (that is, older than) or equal to the specified ID, to avoid getting the same last tweet
        //Twitter will be queried again, this time with the addition of 'max_id'        
    }else{      
        $done = true;
    }   
}while(!$done);

//If all the tweets have been fetched, then we are done
echo "<p>query: ".urldecode($query['q'])."</p>";
echo "<p>tweets fetched: ".$countTweets."</p>";
?>
0 голосов
/ 06 июня 2018

Используя общедоступный API поиска, вы будете получать твиты только за последние 7 дней, а не все твиты.Таким образом, ваши результаты не будут точными.

Если вы все еще хотите тестировать, вы должны использовать стандартный API поиска: https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets.html

Установите для параметра "cout" значение 100, ипроверяйте значение «next_results» в результатах, чтобы зациклить 100 других твитов и так далее, пока не получите результат.

...