Simplest PHP example for retrieving user_timeline with Twitter API version 1.1

前端 未结 14 2299
盖世英雄少女心
盖世英雄少女心 2020-11-21 17:37

Because of the Twitter API 1.0 retirement as of June 11th 2013, the script below does not work anymore.

// Create curl resource 
$ch = curl_init(); 
// Set u         


        
14条回答
  •  温柔的废话
    2020-11-21 18:06

    If it is useful for anyone... In my blog I've implement the following PHP code in order to retrieve the last tweets, extract their most relevant data and then saved them into a MySQL database. It works because I got it in my blog.

    The "tweets" table where store them:

    CREATE TABLE IF NOT EXISTS `tweets` (
      `tweet_id` int(11) NOT NULL auto_increment,
      `id_tweet` bigint(20) NOT NULL,
      `text_tweet` char(144) NOT NULL,
      `datetime_tweet` datetime NOT NULL,
      `dayofweek_tweet` char(3) NOT NULL,
      `GMT_tweet` char(5) NOT NULL,
      `shorturl_tweet` char(23) NOT NULL,
      PRIMARY KEY  (`tweet_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=83 ;
    

    get_tweets.php:

    $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 returnTweets($last_id) {
        $oauth_access_token         = "2687912757-vbyfJA483SEyj2HJ2K346aVMxtOIgVbsY4Edrsw";
        $oauth_access_token_secret  = "nIruzmR0bXqC3has4fTf8KAq4pgOceiuKqjklhroENU4W";
        $api_key                    = "ieDSTFH8QHHPafg7H0whQB9GaY";
        $api_secret                 = "mgm8wVS9YP93IJmTQtsmR8ZJADDNdlTca5kCizMkC7O7gFDS1j";
        $twitter_timeline           = "user_timeline";  //[mentions_timeline/user_timeline/home_timeline/retweets_of_me]
        //create request
        $request= array(
            'screen_name'       => 'runs_ES',
            'count'             => '3',
            'exclude_replies'   => 'true'
            );
        if (!is_null($last_id)) { //Add to the request if it exits a last_id
            $request['since_id']= $max_id;
        }
        $oauth = array(
            'oauth_consumer_key'        => $api_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($api_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;
    }
    
    function parse_tweettext($tweet_text) {
        $text= substr($tweet_text, 0, -23);
        $short_url= substr($tweet_text, -23, 23);
        return array ('text'=>$text, 'short_url'=> $short_url);
    }
    
    function parse_tweetdatetime($tweetdatetime) {
        //Thu Aug 21 21:57:26 +0000 2014 Sun Mon Tue Wed Thu Fri Sat
        $months= array('Jan'=>'01', 'Feb'=>'02', 'Mar'=>'03', 'Apr'=>'04', 'May'=>'05', 'Jun'=>'06', 
                        'Jul'=>'07', 'Aug'=>'08', 'Sep'=>'09', 'Oct'=>'10', 'Nov'=>'11', 'Dec'=>'12');
        $GMT= substr($tweetdatetime, -10, 5);
        $year= substr($tweetdatetime, -4, 4);
        $month_str= substr($tweetdatetime, 4, 3);
        $month= $months[$month_str];
        $day= substr($tweetdatetime, 8, 2); 
        $dayofweek= substr($tweetdatetime, 0, 3);
        $time= substr($tweetdatetime, 11, 8);
        $date= $year.'-'.$month.'-'.$day;
        $datetime= $date.' '.$time;
        return array('datetime'=>$datetime, 'dayofweek'=>$dayofweek, 'GMT'=>$GMT);
        //datetime: "YYYY-MM-DD HH:MM:SS", dayofweek: Mon, Tue..., GMT: +####
    }
    
    //First check in the database the last id tweet:
    $query= "SELECT MAX(tweets.id_tweet) AS id_last FROM tweets;";
    $result= exec_query($query);
    $row= mysql_fetch_object($result);
    if ($result!= 0 && mysql_num_rows($result)) { //if error in query or not results
        $last_id= $row->id_last;
    }
    else {
        $last_id= null;
    }
    
    $json= returnTweets($last_id);
    $tweets= json_decode($json, TRUE);
    
    foreach ($tweets as $tweet) {
        $tweet_id= $tweet['id'];
        if (!empty($tweet_id)) { //if array is not empty
            $tweet_parsetext= parse_tweettext($tweet['text']);
            $tweet_text= utf8_encode($tweet_parsetext['text']);
            $tweet_shorturl= $tweet_parsetext['short_url'];
            $tweet_parsedt= parse_tweetdatetime($tweet['created_at']);
            $tweet_datetime= $tweet_parsedt['datetime'];
            $tweet_dayofweek= $tweet_parsedt['dayofweek'];
            $tweet_GMT= $tweet_parsedt['GMT'];
            //Insert the tweet into the database:
            $fields = array(
                'id_tweet' => $tweet_id,
                'text_tweet' => $tweet_text,
                'datetime_tweet' => $tweet_datetime,
                'dayofweek_tweet' => $tweet_dayofweek,
                'GMT_tweet' => $tweet_GMT,
                'shorturl_tweet' => $tweet_shorturl
                );
            $new_id= mysql_insert('tweets', $fields);
        }
    } //end of foreach
    ?>
    

    The function to save the tweets:

    function mysql_insert($table, $inserts) {
        $keys = array_keys($inserts);
        exec_query("START TRANSACTION;");
        $query= 'INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $inserts).'\')';
        exec_query($query);
        $id= mysql_insert_id();
        if (mysql_error()) {
            exec_query("ROLLBACK;");
            die("Error: $query");
        }
        else {
            exec_query("COMMIT;");
        }
        return $id;
    }
    

提交回复
热议问题