我正在开发一个网站,允许用户搜索城市或国家/地区的十大推特趋势。起初我只依赖Twitter的Rest API,但我有很多速率限制问题(在学校我的速率限制消失得比我有机会使用它更快)。我知道验证我的API调用将有助于我更好地处理这个问题(经过身份验证的API调用是从验证用户的限制中收取的,而未经身份验证的API调用是从调用的IP地址'分配中扣除的。)
我实施了@ abraham的PHP库(https://github.com/abraham/twitteroauth),遗憾的是我的API调用未经过身份验证。我知道我已经实现了@ abraham的PHP库,因为它在最后打印出我的用户信息。我在其下面有我的推特趋势搜索,但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));
它没有解决我的问题,但也许是在正确的轨道上?
答案 0 :(得分:1)
首先,您会发现保持PHP和HTML分离将真正有助于简化代码并将逻辑问题分开(聚合数据并显示它是两个不同的问题)(许多PHP人员,如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);
CONSUMER_KEY
和CONSUMER_SECRET
来自您的趋势测试应用,$token
和$secret
来自用户登录Twitter并允许您的应用获得许可。创建TwitterOAuth
对象时是否显示所有这些值?
另外,请确保更新twitteroauth.php
文件中的配置项(特别是第21行应设置为使用1.1 API,第29行应设置为'json')。