Twitter API版本1.1中检索用户时间线的最简单PHP示例

304

由于 Twitter API 1.0 已于2013年6月11日退役,下面的脚本已经无法使用。

// Create curl resource 
$ch = curl_init(); 
// Set url 
curl_setopt($ch, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/myscreenname.json?count=10"); 
// Return the transfer as a string 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
// $output contains the output string 
$output = curl_exec($ch); 
// Close curl resource to free up system resources 
curl_close($ch);

if ($output) 
{
    $tweets = json_decode($output,true);

    foreach ($tweets as $tweet)
    {
        print_r($tweet);
    }
}

如何以最少的代码获取用户时间线(最近的状态)?

我找到了这个:https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline,但我收到了以下错误:

"{"errors":[{"message":"Could not authenticate you","code":32}]}"

有很多类可以用,但在尝试了几个之后,它们似乎都因Twitter上的更新而无法正常工作,而且其中一些类具有我实际上并不需要的大量功能。

使用PHP获取最近用户状态的最简单/最短方法是什么?


102
我会为这个答案不惜一切代价,他们的文档太差劲了。 - RCNeil
我对Twitter API还很陌生,有些困难。我发现自己正在使用已弃用的代码。 - Anthony
请查看 http://aamirafridi.com/twitter/twitter-api-1-1-using-php-and-javascript。 - Aamir Afridi
@Mark 谢谢Mark!!这很简单!!最初对我来说没用。我正在运行WAMP。根据这个线程,我不得不对Apache目录中的php.ini进行更改:https://dev59.com/HW035IYBdhLWcg3wZvJg - Adlin Ling
1
我刚刚写下了一个解决方案,没有使用CURL或任何其他额外的库:https://dev59.com/VGQn5IYBdhLWcg3wJ0e5#28948626 - Rauli Rajande
显示剩余2条评论
14个回答

837
重要提示:截至2018年中期,获取Twitter API令牌的流程变得更加官僚化。对于一个在Packagist上拥有超过120万次安装和在Github上拥有1.6k星的开源项目而言,我花费了超过一个工作周的时间才获得一组API令牌,理论上这应该是更高优先级的。如果你被分配使用Twitter API进行工作,你必须考虑到这个潜在的极长等待时间。同时,考虑其他社交媒体渠道,如Facebook或Instagram,并提供这些选项,因为检索其令牌的过程是即时的。

你想使用 Twitter v1.1 API 吗?

注意:这些文件在 GitHub 上.

版本 1.0 即将被弃用,未经授权的请求将不被允许。因此,本文将帮助您完成此操作,并提供一个 PHP 类来简化您的生活。

1. 创建开发者账户:在 Twitter 上设置开发者账户

您需要访问官方 Twitter 开发者网站并注册开发者账户。 这是一个免费且必要的步骤,以请求 v1.1 API。

2. 创建应用程序:在 Twitter 开发者网站上创建应用程序

什么?你以为可以进行未经身份验证的请求吗?使用Twitter的v1.1 API是不行的。 你需要访问http://dev.twitter.com/apps并单击“创建应用程序”按钮。

Enter image description here

在这个页面上,填写任何你想要的细节。对我来说,这并不重要,因为我只是想制作一堆块请求以摆脱垃圾关注者。关键是你要为自己获得{一组唯一的密钥},用于你的应用程序。
创建应用程序的目的是为自己(和 Twitter)提供一组密钥。它们是:
  • 使用者密钥
  • 使用者密钥密码
  • 访问令牌
  • 访问令牌密码
这里有一些关于这些令牌的信息。

3. 创建访问令牌:你需要这些来进行成功的请求

OAuth 请求几个令牌。所以你需要让它们为你生成。

Enter image description here

请点击底部的“创建我的访问令牌”。然后再次滚动到底部,您将获得一些新生成的密钥。您需要从此页面获取四个先前标记的密钥以进行API调用,因此请在某处做好记录。如果您要使用此API,除了使用GET请求进行标准数据检索之外,您需要将设置更改为读写权限。

Enter image description here

选择页面顶部附近的“设置”选项卡。

Enter image description here

请给你的应用程序授予读/写访问权限,然后在底部点击“更新”按钮。
您可以在此处阅读有关Twitter使用的应用程序权限模型的更多信息
5. 编写访问API的代码: 我已经为您完成了大部分工作。
我将上面的代码进行了一些修改和更改,并将其组合成了一个PHP类,因此非常容易进行所需的请求。
这使用了OAuthTwitter v1.1 API,以及我创建的类,您可以在下面找到。
require_once('TwitterAPIExchange.php');

/** Set access tokens here - see: https://dev.twitter.com/apps/ **/
$settings = array(
    'oauth_access_token' => "YOUR_OAUTH_ACCESS_TOKEN",
    'oauth_access_token_secret' => "YOUR_OAUTH_ACCESS_TOKEN_SECRET",
    'consumer_key' => "YOUR_CONSUMER_KEY",
    'consumer_secret' => "YOUR_CONSUMER_SECRET"
);

请确保将从应用程序获得的密钥放置在相应的空间中。

接下来,您需要选择要发出请求的URL。Twitter提供了他们的API文档,以帮助您选择URL和请求类型(POST或GET)。

/** URL for REST request, see: https://dev.twitter.com/docs/api/1.1/ **/
$url = 'https://api.twitter.com/1.1/blocks/create.json';
$requestMethod = 'POST';

在文档中,每个URL都说明了可以传递哪些内容。如果我们使用上面的“blocks” URL,我可以传递以下POST参数:
/** POST fields required by the URL above. See relevant docs as above **/
$postfields = array(
    'screen_name' => 'usernameToBlock', 
    'skip_status' => '1'
);

现在,您已经设置了要使用API执行的操作,是时候进行实际请求了。
/** Perform the request and echo the response **/
$twitter = new TwitterAPIExchange($settings);
echo $twitter->buildOauth($url, $requestMethod)
             ->setPostfields($postfields)
             ->performRequest();

对于一个 POST 请求,就是这样了!

对于一个GET请求,情况有些不同。这是一个例子:

/** Note: Set the GET field BEFORE calling buildOauth(); **/
$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?username=J7mbo';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
             ->buildOauth($url, $requestMethod)
             ->performRequest();     

最终代码示例:针对获取我的关注者列表的简单GET请求。
$url = 'https://api.twitter.com/1.1/followers/list.json';
$getfield = '?username=J7mbo&skip_status=1';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
             ->buildOauth($url, $requestMethod)
             ->performRequest();  

我已经将这些文件放在GitHub上,并感谢@lackovic10和@rivers的贡献! 我希望有人会发现它有用; 我知道我用它来进行批量阻止。

另外,对于那些在Windows上遇到SSL证书问题的人,请看这篇文章。该库在幕后使用cURL,因此您需要确保正确设置了cURL证书。Google也是您的好朋友。


4
@kaffolder 页面上的链接:http://www.profilepicture.co.uk/caching-api-responses-php/ 提供了一种简单的方法。您可以在第一次请求时将您的Twitter数据写入文件或数据库(MySQL或MongoDB),然后在每个后续请求中,检查当前时间是否符合您设置的文件时间限制(您可以将文件命名为时间限制)。如果文件存在且文件名在您所需的时间限制内,则获取数据而不是执行API请求。如果文件存在但超过了时间限制,则删除该文件并执行API请求。 - Jimbo
7
我不知道如何处理返回的json数据。我不想像"echo $twitter ->setGetfield($getfield)->buildOauth($url, $requestMethod)->performRequest();"那样只是在屏幕上显示出来。很抱歉,我不知道如何换行!我想做类似"$jsonData = json_decode($twitter);"这样的操作,但它不起作用——我觉得我可能遗漏了某些基本知识点,但我还没有完全明白…… - Ashley
69
谢谢,Twitter的文档杂乱无章,这篇文章帮了我很大忙。 - joren
7
让这个课程在Windows上运行需要满足一些先决条件。您需要在php.ini文件中加载工作正常的cURL版本,并使用curl.cainfo = path\to\cacert.pem在您的php.ini文件中加载CA证书。您可以在此处获取CA证书here - Jake Z
4
@Jimbo,我只是想指出一些在Windows中默认的cURL扩展功能存在缺陷,需要进行更换(因此提供了“修复”版本的链接)。如果不加载CA证书,则您的类将返回false,因为curl_error()报告了“SSL证书问题,请验证CA证书是否正确”。可以通过关闭CURLOPT_SSL_VERIFYPEER来避免这种情况,但我认为我应该包括实际使用CA证书的基本说明。我加入这个信息是为了帮助一些人节省几分钟的搜索时间。 - Jake Z
显示剩余60条评论

141

前往 dev.twitter.com 创建应用程序,这将为您提供所需的凭据。下面是我最近使用 PHPcURL 编写的一个实现示例。

<?php
    function buildBaseString($baseURI, $method, $params) {
        $r = array();
        ksort($params);
        foreach($params as $key=>$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;
    }

    $url = "https://api.twitter.com/1.1/statuses/user_timeline.json";

    $oauth_access_token = "YOURVALUE";
    $oauth_access_token_secret = "YOURVALUE";
    $consumer_key = "YOURVALUE";
    $consumer_secret = "YOURVALUE";

    $oauth = array( 'oauth_consumer_key' => $consumer_key,
                    'oauth_nonce' => time(),
                    'oauth_signature_method' => 'HMAC-SHA1',
                    'oauth_token' => $oauth_access_token,
                    'oauth_timestamp' => time(),
                    'oauth_version' => '1.0');

    $base_info = buildBaseString($url, 'GET', $oauth);
    $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
    $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
    $oauth['oauth_signature'] = $oauth_signature;

    // Make requests
    $header = array(buildAuthorizationHeader($oauth), 'Expect:');
    $options = array( CURLOPT_HTTPHEADER => $header,
                      //CURLOPT_POSTFIELDS => $postfields,
                      CURLOPT_HEADER => false,
                      CURLOPT_URL => $url,
                      CURLOPT_RETURNTRANSFER => true,
                      CURLOPT_SSL_VERIFYPEER => false);

    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $json = curl_exec($feed);
    curl_close($feed);

    $twitter_data = json_decode($json);

//print it out
print_r ($twitter_data);

?>

这可以从命令行运行:

$ php <name of PHP script>.php

2
感谢提供这段代码,运行非常顺畅。唯一的问题是我似乎无法找出如何设置返回的帖子计数。它只返回20条,而我想要完整的200条,就像Twitter限制一样。 - Flatlyn
24
你如何使用这种方法设置 screen_namecount 呢?我尝试将它添加到 $url 变量中,但是我收到了“无法验证您”的错误信息。 - Javier Villanueva
2
这段代码运行得非常好!我正在尝试修改它来使用search/tweets.json API,但我总是得到“无法验证身份”的响应 - 有什么想法吗? - Chris
2
这篇文章非常有帮助。我的代码似乎无法从 curl_init() 返回。我看了一些例子,它们看起来非常简单和直接,就像这里的代码一样... 我需要安装特殊的东西吗? - jessicaraygun
1
它在2016年10月26日对我起作用了。输出比我预期的要复杂一些。 - JohnC
显示剩余17条评论

62

Rivers贴出的代码很棒。非常感谢!我是新来的,无法评论,我只想回答javiervd提出的问题(如何使用这种方法设置screen_name和count?),因为我浪费了很多时间去弄清楚。

您需要将参数添加到URL和创建签名的过程中。 创建签名是帮助我的文章。这是我的代码:

$oauth = array(
           'screen_name' => 'DwightHoward',
           'count' => 2,
           'oauth_consumer_key' => $consumer_key,
           'oauth_nonce' => time(),
           'oauth_signature_method' => 'HMAC-SHA1',
           'oauth_token' => $oauth_access_token,
           'oauth_timestamp' => time(),
           'oauth_version' => '1.0'
         );

$options = array(
             CURLOPT_HTTPHEADER => $header,
             //CURLOPT_POSTFIELDS => $postfields,
             CURLOPT_HEADER => false,
             CURLOPT_URL => $url . '?screen_name=DwightHoward&count=2',
             CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false
           );

3
我很赞同这个观点。在Twitter的API文档中,这一点非常明显,但也不是非常“显而易见”。这种方法会影响“buildAuthorizationHeader”函数吗?我是分开实现的。 - Moe
我已经很久没有使用这个了,所以我不记得了。如果你还没有解决你的问题,我可以在接下来的几天里研究一下。 - lackovic10
我一直在尝试将您的解决方案适应于在statuses/update.json上执行POST请求,但没有成功,您有任何想法如何实现吗? - perrohunter
1
@perrohunter 我不确定,需要更深入地了解一下。如果你几天内找不到方法,请给我发消息,我会尽力帮助你。 - lackovic10

23

像其他答案中所述,创建一个Twitter应用程序以获得令牌、密钥和密钥。 使用下面的代码,您可以从一个地方修改请求参数并避免打字错误和类似的错误(在returnTweet()函数中更改$request数组)。

function buildBaseString($baseURI, $method, $params) {
    $r = array();
    ksort($params);
    foreach($params as $key=>$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 returnTweet(){
    $oauth_access_token         = "x";
    $oauth_access_token_secret  = "x";
    $consumer_key               = "x";
    $consumer_secret            = "x";

    $twitter_timeline           = "user_timeline";  //  mentions_timeline / user_timeline / home_timeline / retweets_of_me

    //  create request
        $request = array(
            'screen_name'       => 'budidino',
            'count'             => '3'
        );

    $oauth = array(
        'oauth_consumer_key'        => $consumer_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($consumer_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_decode($json, true);
}

然后只需调用returnTweet()


1
太棒了,@budidino!在https://dev.twitter.com/apps上创建了应用程序,并使用oauth_access_token、oauth_access_token_secret、consumer_key和consumer_secret填充了你的x。请注意,您需要按“创建我的访问令牌”按钮,它需要几秒钟才能生成,请耐心等待。 - Theo
@budidino 我们不需要包含任何库吗? - anam
我填写了密钥,将其添加到WordPress的functions.php文件中,在HTML文件中放置了<?php echo returnTweet(); ?>,但它只输出单词“Array”,没有其他内容。 - J82
@Desi,结果是推文数组,您需要处理如何显示它们中的每一个。尝试使用print_r(returnTweet())来查看其内容。请查看此示例以显示所有推文:https://gist.github.com/budidino/9681764#file-stackoverflow-returntweet - budiDino
@budidino 我尝试使用print_r(returnTweet()),结果屏幕上填满了很多文本。抱歉,我是 PHP 的初学者。我只想显示最新的推文。我检查了 Github 的链接,并尝试将其放入模板中,但最新的推文也没有显示出来。它只输出了 Tweet: Array。我确定这是基础知识,但您能否告诉我在我的模板中只需显示最后一个推文需要放什么? - J82
1
如果您只想获取最新的推文,您应该修改$request数组并将计数设置为1。假设您使用$tweet = returnTweet();然后,如果您想显示最新的推文(在这种情况下是唯一的一个),您可以编写类似于以下内容的内容:echo "latest tweet:" .$tweet[0]["text"]; 如果您想提取推文的更多内容,请务必查看Twitter返回的结构(例如$userProfileImageURL = $tweet[0]["user"]["profile_image_url"])。https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline - budiDino

17

谢谢您,Kris!

对我而言,没有使用查询参数就能正常工作,但是当我使用多个参数时,它会显示错误:32 无法验证您的身份。

问题出在“&”符号编码上。因此,在您的代码中,以下行存在问题:

$url .= "?".http_build_query($query);

我在下面添加了以下这行代码:
$url=str_replace("&amp;","&",$url);

它可以使用两个或更多的参数,例如 screen_name 和 count。

整个代码如下所示:

$token = 'YOUR TOKEN';
$token_secret = 'TOKEN SECRET';
$consumer_key = 'YOUR KEY';
$consumer_secret = 'KEY SECRET';

$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path

$query = array( // query parameters
    'screen_name' => 'twitterapi',
    'count' => '2'
);

$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'
);

$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);

$arr = array_merge($oauth, $query); // combine the values THEN sort

asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)

// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));

$url = "https://$host$path";

// 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 .= "?".http_build_query($query);
$url=str_replace("&amp;","&",$url); //Patch by @Frewuill

$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it

// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);

// 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);

// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$twitter_data = json_decode($json);

希望这篇文章能够帮助到遇到和我一样问题的人。

1
非常感谢,您的代码改进效果很好!有一个问题: "//建议使用更强的随机数"。这可能是什么?time()吗? - Sebastian
1
谢谢指出这一点。Sebastian:nonce是一种应该具有加密安全性的单次使用令牌。mt_rand()既太短(32位)又不是密码学PRNG。理论上,这使得oauth令牌变得脆弱,但为了在我的原始示例代码中简化,我想使用PHP中容易掌握的东西。 - Kris Reeves
收到错误32。无法验证您的身份。请问有什么帮助吗?我已经使用了您上面的代码。 - saadk
@frewuill,你太棒了兄弟,它对我非常有效,谢谢。 - vijay
@frewuill 这是最佳答案,它支持参数,并且我可以确认它甚至可以与新的2.0 Twitter API一起使用! - camillo777
如果您想在查询中使用带逗号的字段,则还需添加以下行(不太好看但可行):$url = str_replace("%252C", ",", $url); - camillo777

9
这个问题对我有很大帮助,但并没有完全理解需要发生什么。这篇博客文章做了一个很棒的工作,帮助我理解了它。
以下是所有重要的部分:
- 如上所述,您必须签署您的1.1 API请求。如果您正在执行诸如获取公共状态之类的操作,则需要应用程序密钥而不是用户密钥。您想要的页面的完整链接是:https://dev.twitter.com/apps - 您必须哈希所有参数,包括oauth参数和get参数(或POST参数)。 - 在缩小到被哈希的url编码形式之前,必须对参数进行排序。 - 您必须多次编码某些内容-例如,您可以从参数的url编码值创建查询字符串,然后对其进行url编码并与方法类型和url连接。
我理解所有的头痛,所以这里有一些代码来解决它:
$token = 'YOUR TOKEN';
$token_secret = 'TOKEN SECRET';
$consumer_key = 'YOUR KEY';
$consumer_secret = 'KEY SECRET';

$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path

$query = array( // query parameters
    'screen_name' => 'twitterapi',
    'count' => '2'
);

$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'
);

$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);

$arr = array_merge($oauth, $query); // combine the values THEN sort

asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)

// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));

$url = "https://$host$path";

// 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 .= "?".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

// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);

// 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);

// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$twitter_data = json_decode($json);

5

首先,我想感谢jimbo和(他的帖子 / twitter-api-php简单库)。

如果你要使用"twitter-api-php" PHP库(TwitterAPIExchange.php)来调用GET search/tweets API

首先,您只需注释掉“执行POST请求并回显响应”代码区域。

只需使用“执行GET请求并回显响应”代码,并回显响应并更改这两行:

$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?screen_name=J7mbo';

$url = 'https://api.twitter.com/1.1/search/tweets.json';
$getfield = '?q=J7mbo';

(将screen_name更改为q,就这样:)


我还没有运气 :/ - Ricardo

5
如果您已安装OAuth PHP库,则无需担心自己组合请求。
$oauth = new OAuth($consumer_key, $consumer_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($access_token, $access_secret);

$oauth->fetch("https://api.twitter.com/1.1/statuses/user_timeline.json");
$twitter_data = json_decode($oauth->getLastResponse());

print_r($twitter_data);

获取更多信息,可查看文档或其示例。您可以使用pecl install oauth来获取该库。


2

4
请您为我们这些蠢笨的人解释一下。您提供的信息与文档相比并没有更多的见解,甚至可能更少。在第二步中,您是否使用了PHP的HttpRequest()函数?还有Abraham的TwitterOAuth PHP库-https://github.com/abraham/twitteroauth-也可以实现此功能,但是并没有提供如何实现的示例。 - RCNeil
2
https://github.com/abraham/twitteroauth/blob/master/test.php 看起来有很多示例! - Matthew Rapati
2
@MatthewRapati 页面不存在。 - RN Kushwaha

0
这是一个简短的代码片段,用于从您的时间线中获取指定数量的推文。它基本上与其他示例执行相同的操作,只需更少的代码即可实现。
只需填写密钥并调整$count即可:
$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
$count = '10';

$oauth = array('count' => $count,
               'oauth_consumer_key' => '[CONSUMER KEY]',
               'oauth_nonce' => md5(mt_rand()),
               'oauth_signature_method' => 'HMAC-SHA1',
               'oauth_timestamp' => time(),
               'oauth_token' => '[ACCESS TOKEN]',
               'oauth_version' => '1.0');

$oauth['oauth_signature'] = base64_encode(hash_hmac('sha1', 'GET&' . rawurlencode($url) . '&' . rawurlencode(implode('&', array_map(function ($v, $k) { return $k . '=' . $v; }, $oauth, array_keys($oauth)))), '[CONSUMER SECRET]&[ACCESS TOKEN SECRET]', true));

$twitterData = json_decode(file_get_contents($url . '?count=' . $count, false, stream_context_create(array('http' => array('method' => 'GET',
                                                                                                                           'header' => 'Authorization: OAuth ' 
                                                                                                                                       . implode(', ', array_map(function ($v, $k) { return $k . '="' . rawurlencode($v) . '"'; }, $oauth, array_keys($oauth))))))));

这个示例使用匿名函数和file_get_contents而不是cURL库。请注意使用MD5哈希的nonce。似乎每个人都在使用time() nonce,然而,关于OAuth的大多数网络示例都使用某种加密字符串(例如:http://www.sitepoint.com/understanding-oauth-1/)。这对我来说更有意义。

进一步说明:您需要PHP 5.3+才能使用匿名函数(如果您的服务器/计算机处于某个冷战洞穴中并且无法升级,则除外)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接