Компонент Zend_Service_Twitter по-прежнему предназначен для Twitters API версии 1.0, который будет устаревшим на 5 марта 2013 года. Поэтому я хотел сделать свой новый сайт с поддержкой API Twitter 1.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());
Я изменил код проверкиCredentials в Zend/Service/Twitter.php
от этого:
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
установить как-то oauth_consumer_key
? Если да, как я могу это сделать?
Изменить: я также нашел отчет об ошибке в вопросительном треке Zend Framework: http://framework.zend.com/issues/browse/ZF-12409 (может быть, сделать upvote?)
с ZF 1.12.3 обходным путем является передача userKey и userSecret в опцию oauthOptions, а не только в опциях.
$options = array( 'username' => /*...*/, 'accessToken' => /*...*/, 'oauthOptions' => array( 'consumerKey' => /*...*/, 'consumerSecret' => /*...*/, ) );
Пока вы ждете, чтобы исправить эту проблему в компоненте Zend_Twitter_Service, вы можете сделать это:
Вам необходимо отправить customerKey и customerSecret в Zend_Service_Twitter
$twitter = new Zend_Service_Twitter(array( 'consumerKey' => $this->consumer_key, 'consumerSecret' => $this->consumer_secret, 'username' => $user->screenName, 'accessToken' => unserialize($user->token) ));
Сегодня у меня такая же проблема – Zend Framework работает с API 1.
Я создал новый класс, например
class Zend_Service_Twitter11 extends Zend_Service_Twitter
И переопределить функции, которые мне нужны.
statusUpdate statusReplies
и т.д
$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()