2

我正在开发一个网站,该网站允许用户搜索一个城市或国家的十大推特趋势。起初我只依赖 Twitter 的 Rest API,但我遇到了很多速率限制问题(在学校我的速率限制消失得比我有机会使用它的速度更快)。我知道对我的 API 调用进行身份验证将有助于我更好地处理这个问题(经过身份验证的 API 调用按身份验证用户的限制收费,而未经身份验证的 API 调用从调用 IP 地址的分配中扣除)。

我实现了@abraham 的 PHP 库(https://github.com/abraham/twitteroauth),不幸的是我的 API 调用没有经过身份验证。我知道我已经实现了@abraham 的 PHP 库,因为它会在最后打印出我的用户信息。我在它下面有我的 twitter 趋势搜索,但 API 调用没有经过身份验证。我不知道如何解决这个问题,任何帮助都将不胜感激!

这是我用来按国家/地区划分的十大趋势:

function showContent(){

// we're going to point to Yahoo's APIs
$BASE_URL = "https://query.yahooapis.com/v1/public/yql";

// the following code should only run if we've submitted a form
if(isset($_REQUEST['location']))
{
    // set a variable named "location" to whatever we passed from the form
    $location = $_REQUEST['location'];

    // Form YQL query and build URI to YQL Web service in two steps:

    // first, we show the query
    $yql_query = "select woeid from geo.places where text='$location'";
    // then we combine the $BASE_URL and query (urlencoded) together
    $yql_query_url = $BASE_URL . "?q=" . urlencode($yql_query) . "&format=json";

    //var_dump($location);

    // show what we're calling
    // echo $yql_query_url;

    // Make call with cURL (curl pulls webpages - it's very common)
    $session = curl_init($yql_query_url);
    curl_setopt($session, CURLOPT_RETURNTRANSFER,true);
    $json = curl_exec($session);

    // Convert JSON to PHP object 
    $phpObj = json_decode($json);

    // Confirm that results were returned before parsing
    if(!is_null($phpObj->query->results)){


      // Parse results and extract data to display
      foreach($phpObj->query->results as $result){
    //var_dump($result);    
     $woeid = $result[0]->woeid;


     if (is_numeric ($location)) 
         {
    echo "<span style='color:red; padding-left: 245px;'>Please enter a city or a country</span>";
    } 
    else if(empty($result)){
     echo "No results found";
    }
    else {
    /*  echo "The woeid of $location is $woeid <br />"; */
     }  
    } 
    }

    $jsontrends=file_get_contents("http://api.twitter.com/1/trends/".$woeid.".json"); 

    $phpObj2 = json_decode($jsontrends, true);

    echo "<h3 style='margin-top:20px'>TRENDS: ".$phpObj2[0]['locations'][0]['name']."</h3> \r\n";

    $data = $phpObj2[0]['trends']; 

    foreach ($data as $item) { 

    echo "<br /><a href=\"".$item['url']."\" target=\"_blank\">".$item['name']."</a>\r\n";

    echo "<br /> \r\n"; 

    }
    if(empty($item)){
    echo "No results found";
    }

    }
    }

然后我将它添加到@abraham 的 html.inc 文件(连同一些 php 以查看速率限制状态),并且 html.inc 包含在 index.php 中:

<h1>Top Twitter Trends</h1>                 
<form name='mainForm' method="get">
<input name='location' id='location' type='text'/><br/>
<button id='lookUpTrends'>Submit</button>
</form>

<?php showContent(); 

$ratelimit = file_get_contents("http://api.twitter.com/1/account/rate_limit_status.json"); 

echo $ratelimit; 
?>  
</div>

@abraham 的 index.php 文件有一些示例调用,由于我的调用看起来不像这样,我认为这可能是它没有被验证的原因。

    /* Some example calls */

    //$connection->post('statuses/update', array('status' => date(DATE_RFC822)));
    //$connection->post('statuses/destroy', array('id' => 5437877770));
    //$connection->post('friendships/create', array('id' => 9436992));
    //$connection->post('friendships/destroy', array('id' => 9436992));

请帮助我找到我需要修复的问题,以便我的 API 调用通过身份验证。

更新 10-21

我认为为了进行经过身份验证的 API 调用,我需要包含如下代码:

$connection->get('trends/place', array('id' => $woeid));

它没有解决我的问题,但也许它在正确的轨道上?

4

1 回答 1

1

首先,您会发现将 PHP 和 HTML 分开确实有助于简化代码并将逻辑关注点分开(聚合数据和显示数据是两个不同的关注点)(许多 PHPer 喜欢MVC)。

您共享的代码似乎是正确的。我的猜测是问题在于 OAuth 连接的创建,它应该类似于:

    <?php
    /* Create TwitteroAuth object with app key/secret and token key/secret from default phase */
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $token,$secret);

您的Trends Test 应用程序的位置和CONSUMER_KEY位置,以及登录 twitter 并允许您的应用程序许可的用户的位置和位置。创建对象时是否会显示所有这些值?CONSUMER_SECRET$token$secretTwitterOAuth

此外,请确保更新文件中的配置项twitteroauth.php(特别是第 21 行应设置为使用 1.1 API,第 29 行应设置为“json”)。

于 2012-10-23T17:41:46.240 回答