Zend_Service_Twitter - 准备好 API v1.1

Posted

技术标签:

【中文标题】Zend_Service_Twitter - 准备好 API v1.1【英文标题】:Zend_Service_Twitter - Make API v1.1 ready 【发布时间】:2012-09-22 12:32:08 【问题描述】:

Zend_Service_Twitter 组件仍然适用于 Twitters API v1.0,它将在 2013 年 3 月 5 日被弃用。所以我想让我的新网站准备好 Twitter API 交互 v1.1。 v1.0 一切正常,但如果我将 URL 从 /1/ 更改为 /1.1/ 它会失败并显示 HTTP 标头代码 400 和 JSON 错误消息:Bad Authentication data(代码:215)

要获取请求和访问令牌保持不变并且无需任何更改即可工作, 但是如果我想像这样验证凭据,则会收到上述错误:

// Take a look for the code here: http://framework.zend.com/manual/1.12/en/zend.oauth.introduction.html
$accessToken = $twitterAuth->getAccessToken($_GET, unserialize($_SESSION['TWITTER_REQUEST_TOKEN']));


// I have a valid access token and now the problematic part
$twitter = new Zend_Service_Twitter(array(
    'username' => $accessToken->getParam('screen_name'),
    'accessToken' => $accessToken
));
print_r($twitter->account->verifyCredentials());

我将Zend/Service/Twitter.php中的verifyCredentials代码从那个改成了那个:

public function accountVerifyCredentials()

    $this->_init();
    $response = $this->_get('/1/account/verify_credentials.xml');
    return new Zend_Rest_Client_Result($response->getBody());


// to

public function accountVerifyCredentials()

    $this->_init();
    $response = $this->_get('/1.1/account/verify_credentials.json');
    return Zend_Json::decode($response->getBody());

现在我在return Zend_Json[...]之前添加了这一行:

print_r($this->_localHttpClient->getLastRequest());

// And I get this output of it:

GET /1.1/account/verify_credentials.json HTTP/1.1
Host: api.twitter.com
Connection: close
Accept-encoding: gzip, deflate
User-Agent: Zend_Http_Client
Accept-Charset: ISO-8859-1,utf-8
Authorization: OAuth realm="",oauth_consumer_key="",oauth_nonce="91b6160db351060cdf4c774c78e2d0f2",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1349107209",oauth_version="1.0",oauth_token="hereismytoken",oauth_signature="hereisavalidsignature"

如您所见,oauth_consumer_key(以及realm)是空的。那可能是错误吗?我该如何解决这个错误(因为更严格的新 API 版本?)?以某种方式设置oauth_consumer_key 可以吗?如果是,我该如何处理?

编辑: 我还发现了关于 Zend 框架问题跟踪器的错误报告: http://framework.zend.com/issues/browse/ZF-12409(也许可以点个赞?)

【问题讨论】:

【参考方案1】:

对于 ZF 1.12.3,解决方法是在 oauthOptions 选项中传递 consumerKey 和 consumerSecret,而不是直接在选项中。

        $options = array(
            'username' => /*...*/,
            'accessToken' => /*...*/,
            'oauthOptions' => array(
                'consumerKey' => /*...*/,
                'consumerSecret' => /*...*/,
            )
        );

【讨论】:

非常感谢。对我帮助很大。 调用状态更新函数也有变化。 status已更改为statuses$twitter->statuses->update('...')【参考方案2】:

当您在 Zend_Twitter_Service 组件中等待修复此问题时,您可以执行以下解决方法:

您需要将 customerKeycustomerSecret 发送到 Zend_Service_Twitter

$twitter = new Zend_Service_Twitter(array(
                'consumerKey' => $this->consumer_key,
                'consumerSecret' => $this->consumer_secret,
                'username' => $user->screenName,
                'accessToken' => unserialize($user->token)
));

【讨论】:

【参考方案3】:

今天我遇到了同样的问题 - Zend Framework 使用 API 1。

我创建了类似的新类

class Zend_Service_Twitter11 extends Zend_Service_Twitter

并覆盖我需要的函数。

statusUpdate
statusReplies

【讨论】:

这不是一个描述性很强的类名。如果 Zend 没有编写它,它不应该在不同的命名空间中吗?我意识到这只是一些调整,但如果你重写一个类,使用不同的命名空间是个好习惯。【参考方案4】:
    $this->_session = new Zend_Session_Namespace('auth_twitter');
    $config = Zend_Registry::get('config')->twitter->toArray();
    $access_tokenSession = unserialize($this->_session->access_token);



    $accessToken = new Zend_Oauth_Token_Access();
    $accessToken->setToken($access_tokenSession->oauth_token);
    $accessToken->setTokenSecret($access_tokenSession->oauth_token_secret);

    $temp = array();
    $temp['oauthOptions']['consumerKey'] = $config['consumerKey'];
    $temp['oauthOptions']['consumerSecret'] = $config['consumerSecret'];
    $temp['accessToken'] = $accessToken;
    $temp['username'] = $access_tokenSession->screen_name;


    $this->_twitter = new Zend_Service_Twitter($temp, null);

    $this->_twitter->account->accountVerifyCredentials()->toValue()

【讨论】:

以上是关于Zend_Service_Twitter - 准备好 API v1.1的主要内容,如果未能解决你的问题,请参考以下文章

最佳实践zend framework + facebook Api

MySql“视图”、“准备好的语句”和“准备好的语句需要重新准备”

如何创设有准备的环境

存活跌价准备,资产减值损失

如果应该准备所有 SQL 查询以防止 SQL 注入,为啥语法允许非准备查询?

每次开机都出现"系统准备工具" 怎么去掉?