Zend Framework → Zend_Service_Twitter, последние записи twitter
Внимание, данная запись устарела. Описанное работоспособно для ZF 1.12.2 (и ниже) и twitter API 1.0, более актуальная запись находится тут → Zend_Service_Twitter, небольшие изменения
Обещался почти месяц назад описать внутренности кода, вытягивающего последние записи из твиттера, так что теперь придётся. Или забью и забуду.
Сложного ничего нет. Необходима лишь документация и гугл. Кроме того, нужно зарегистрировать своё веб-приложение на dev.twitter.com для того, чтобы получить consumer key и consumer secret. Там же вами для приложения будет указан callbackURL, который примет токен для авторизации.
Параметры для аутентификации поместим в application.ini
twitter.callbackUrl = "http://yourhost.com/twitter/callback" twitter.siteUrl = "http://twitter.com/oauth" twitter.consumerKey = "dadd58b24026011e2ce361" twitter.consumerSecret = "ljsvb3fEM28e8c5a4fbb4f38bc378pNRzL5I1CrfV5B"
Далее создаём контроллер для твиттера приблизительно такого вида.
class TwitterController extends Zend_Controller_Action { public function init() { } public function indexAction() { } public function authAction() { } public function callbackAction() { } public function testAction() { } }
Ну а теперь по порядку. В методе init() извлекаем конфигурационные данные из бутстрапа и помещаем их реестр. В будущем они нам пригодятся.
public function init() { $options = $this->getInvokeArg('bootstrap')->getOptions(); Zend_Registry::set('options', $options); }
Далее authAction(). В нём будет произведено перенаправление в твиттер, где приложению вами будет разрешено (или не разрешено) взаимодействие с птичьим аккаунтом. В случае успеха произойдёт редирект на указанный ранее callbackURL (т.е. в callbackAction()), где сериализованный токен будет сохранён в БД для дальнейшего использования
public function authAction() { $options = Zend_Registry::get('options'); $consumer = new Zend_Oauth_Consumer($options['twitter']); $session = new Zend_Session_Namespace('twitter'); $session->requestToken = serialize($consumer->getRequestToken()); $consumer->redirect(); } public function callbackAction() { $options = Zend_Registry::get('options'); $consumer = new Zend_Oauth_Consumer($options['twitter']); $session = new Zend_Session_Namespace('twitter'); $params = $this->_request->getParams(); if (!empty($params) && !empty($session->requestToken)) { $token = $consumer->getAccessToken($this->_request->getParams(), unserialize($session->requestToken) ); $tokenString = serialize($token); $sysParameters = new Application_Model_SysParameters(); $sysParameters->saveOption('twitter_token', $tokenString); unset($session->requestToken); return $this->_helper->redirector('index'); } else { throw new Exception('Invalid access. No token provided.'); } }
В testAction() будет произведена проверка проверка связи, а заодно и извлечены последние записи, ради которых всё и затевалось.
public function testAction() { $sysParameters = new Application_Model_SysParameters(); $accessToken = $sysParameters->getOption('twitter_token'); try { if (empty($accessToken)) { throw new Exception('You are not logged in. Please, try again.'); } $token = unserialize($accessToken); $options = Zend_Registry::get('options'); $config = $options['twitter']; $config['username'] = $token->getParam('screen_name'); $config['accessToken'] = $token; $twitter = new Zend_Service_Twitter($config); $response = $twitter->account->verifyCredentials(); if (!$response || !empty($response->error)) { throw new Exception('Wrong credentials. Please, try to login again.'); } Zend_Debug::dump($twitter->status->userTimeLine()); } catch (Exception $e) { echo $e->getMessage(); } }
Подобным же образом можно и твитнуть из приложения. Приведу пример в сокращении.
$options = Zend_Registry::get('options'); $config = $options['twitter']; $config['username'] = $token->getParam('screen_name'); $config['accessToken'] = $token; $twitter = new Zend_Service_Twitter($config); $response = $twitter->account->verifyCredentials(); if ($response && empty($response->error)) { $twitter->status->update('Превед, Медвед!'); }
Вот, собственно, и всё. Надеюсь, что мысль не потерялась за нагромождением кода.
Комментарии