【问题标题】:PHP Twitter API search/tweets GET tweets from last hour ONLYPHP Twitter API 搜索/推文 仅获取上一小时的推文
【发布时间】:2018-03-12 07:35:02
【问题描述】:

您好,我一直在互联网上四处寻找,但还没有找到解决方案。我只想获取过去一小时内具有特定主题标签的推文。

我正在使用该标签提取推文,但我不知道如何仅获取过去一小时的推文。

以下是一些示例数据:

如您所见,那里有一个 created_at 日期,但我不知道如何使用它来获取过去一小时的日期。我认为这将是我能够做到的唯一方法。

我能想到的最好方法是将该日期转换为 UNIX 时间戳,然后检查它是否是过去一小时内的推文。但是有很多数据要经过,这似乎不是一个很好的解决方案,但我想不到。

如果这是唯一的解决方案,有人会给我一个示例,说明如何将该日期转换为 PHP 中的 UNIX 时间戳。如果您有不同的解决方案,我很乐意看到一个详细的示例:) 谢谢

您可能还会发现此链接很有用https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets

【问题讨论】:

    标签: php api twitter


    【解决方案1】:

    我也找不到替代解决方案,所以我对其进行了编码。 WINDOW 常量将时间间隔定义为 1 小时。希望对您有所帮助!

    <?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
    $countCalls=0;      //Api Calls
    $countTweets=0;     //Tweets fetched
    $intervalTweets=0;  //Tweets in the last WINDOW hour
    $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);
        $countCalls+=1;
        //Partial results, updating the total amount of tweets fetched
        $countTweets += count($twitter_data->statuses);
        //Searching for tweets inside the time window
        foreach($twitter_data->statuses as $tweet){
            $time=new DateTime($tweet->created_at);
            $interval = $time->diff($now);      
            $days=$interval->format('%a');
            $hours=$interval->h;
            $mins=$interval->i;
            $secs=$interval->s;
            $diff=$days*24 + $hours + $mins/60 + $secs/3600;
            if($diff<WINDOW){
                $intervalTweets+=1;
            }else{
                $done = true;
                break;
            }               
        }       
        //If not all the tweets have been fetched, then redo... 
        if(!$done && 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>";
    echo "<p>API calls: ".$countCalls."</p>";
    echo "<p>tweets in the last ".WINDOW." hour: ".$intervalTweets."</p>";
    ?>
    

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 2015-12-10
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      相关资源
      最近更新 更多