Zend OAuth с твиттерами однократного доступа - PullRequest
4 голосов
/ 06 августа 2010

Я занимаюсь разработкой приложения, в котором пользователям требуется войти в систему с помощью Twitter и OAuth. Все отлично работает благодаря Zend_OAuth. Проблема заключается в том, что веб-приложение также будет выполнять некоторые вызовы API Twitter, но они будут обрабатываться внутри системы без необходимости аутентификации. Для этого Twitter Dev предоставляет ключи access_token и access_token_secret (здесь упоминается http://dev.twitter.com/pages/oauth_single_token)

Проблема в том, что я не могу заставить Zend_OAuth хорошо играть с существующими токенами доступа. Есть ли кто-нибудь, кто может помочь с несколькими строками кода, как я могу сделать вызов API с моими существующими ключами без перенаправления на страницу авторизации Twitter? Я знаю, что это можно сделать.

PS. Если возможно, я не хочу использовать внешние библиотеки, подобные тем, которые упомянуты на dev.twitter.com - только то, что Zend Framework предлагает

Спасибо!

Ответы [ 4 ]

15 голосов
/ 08 сентября 2010

Для ZF версии 1.10.8 минимальный код, необходимый для публикации в Twitter:

$token = new Zend_Oauth_Token_Access;
$token->setParams(array(
'oauth_token' => 'REPLACE_WITH_TOKEN',
'oauth_token_secret' => 'REPLACE_WITH_TOKEN_SECRET'
));

$twitter = new Zend_Service_Twitter(array(
'consumerKey' => 'REPLACE_WITH_CONSUMER_KEY', 
'consumerSecret' => 'REPLACE_WITH_CONSUMER_SECRET',
'accessToken' => $token
));

$response = $twitter->status->update('REPLACE WITH MESSAGE');

Все токены и секреты доступны после регистрации приложения на http://dev.twitter.com

4 голосов
/ 08 августа 2010

После повторной генерации объекта access_token из компонентов токена и токенкрета, сохраненных в БД (так же, как показал Джастин), вы можете, альтернативно, в зависимости от потребностей в Твиттере, обойти Zend_Oauth_Consumer и Zend_Service_Twitter и использовать Zend_Http_Client, доступный через Zend_Oauth_ok.Это хорошо работает для простой публикации статуса - вот что показано ниже:

$token = new Zend_Oauth_Token_Access();
$token->setToken('singletoken');
$token->setTokenSecret('singlesecret');

$client = $token->getHttpClient(array('requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER, 
'version' => '1.0', 
'signatureMethod' => 'HMAC-SHA1', 
'callbackUrl' => 'http://example.org/dummyurl', 
'requestTokenUrl' => 'http://twitter.com/oauth/request_token', 
'accessTokenUrl' => 'http://twitter.com/oauth/access_token', 
'userAuthorizationUrl' => 'http://twitter.com/oauth/authorize', 
'consumerKey' => 'yourconsumerkey',
'ConsumerSecret' => 'yourconsumersecret',
));

$client->setUri('http://twitter.com/statuses/update.json');
$client->setMethod(Zend_Http_Client::POST);
$client->setParameterPost('status', $_POST["tweet_text"]);
$response = $client->request();

$data = Zend_Json::decode( $response->getBody(), Zend_Json::TYPE_OBJECT);

if($data->text) { /* success */ }
1 голос
/ 27 марта 2012

Если пример кода не работает, попробуйте изменить регистр "ConsumerSecret" на "consumerSecret" Мне понадобилось несколько часов, чтобы поймать это. Надеюсь, это сэкономит ваше время.

1 голос
/ 06 августа 2010
$token = new Zend_Oauth_Token_Access();
$token->setToken('singletoken');
$token->setTokenSecret('singlesecret');
$consumer = new Zend_Oauth_Consumer(
array('requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER, 
'version' => '1.0', 
'signatureMethod' => 'HMAC-SHA1', 
'callbackUrl' => 'http://example.org/dummyurl', 
'requestTokenUrl' => 'http://twitter.com/oauth/request_token', 
'accessTokenUrl' => 'http://twitter.com/oauth/access_token', 
'userAuthorizationUrl' => 'http://twitter.com/oauth/authorize', 
'consumerKey' => 'yourconsumerkey',
'ConsumerSecret' => 'yourconsumersecret',
));

$twtr = new Zend_Service_Twitter(array('accessToken'=>$token), $consumer);

Должен это сделать.

...