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

1
2
3
4
twitter.callbackUrl = "http://yourhost.com/twitter/callback"
twitter.siteUrl = "http://twitter.com/oauth"
twitter.consumerKey = "dadd58b24026011e2ce361"
twitter.consumerSecret = "ljsvb3fEM28e8c5a4fbb4f38bc378pNRzL5I1CrfV5B"

Далее создаём контроллер для твиттера приблизительно такого вида.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

class TwitterController extends Zend_Controller_Action
{
    public function init()
    {
    }

    public function indexAction()
    {
    }

    public function authAction()
    {
    }

    public function callbackAction()
    {
    }

    public function testAction()
    {
    }
}

Ну а теперь по порядку. В методе init() извлекаем конфигурационные данные из бутстрапа и помещаем их реестр. В будущем они нам пригодятся.

1
2
3
4
5
6
7
<?php

public function init()
{
    $options = $this->getInvokeArg('bootstrap')->getOptions();
    Zend_Registry::set('options', $options);
}

Далее authAction(). В нём будет произведено перенаправление в твиттер, где приложению вами будет разрешено (или не разрешено) взаимодействие с птичьим аккаунтом. В случае успеха произойдёт редирект на указанный ранее callbackURL (т.е. в callbackAction()), где сериализованный токен будет сохранён в БД для дальнейшего использования

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php

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() будет произведена проверка проверка связи, а заодно и извлечены последние записи, ради которых всё и затевалось.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

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();
    }
}

Подобным же образом можно и твитнуть из приложения. Приведу пример в сокращении.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php

$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('Превед, Медвед!');
}

Вот, собственно, и всё. Надеюсь, что мысль не потерялась за нагромождением кода.

Комментарии

avatar
Хуторная Елена
avatar
Ты ко мне заходишь, не знаешь что написать, а я у меня вот с твоими записями иногда так бывает ))) Странно, что мы до сих пор общаемся )))
ответить
avatar
morontt
avatar
Тут у меня записи очень специфические :-) А странного ничего нету, я общаюсь ради общения, например. Да и нельзя замыкаться в какой-то одной области, отбрасывая остальные.
ответить
avatar
Хуторная Елена
avatar
И вообще лишь бы человек был хороший, а найти о чем пообщаться, можно всегда )))
ответить
avatar
morontt
avatar
и это тоже :)
ответить
4 комментария Написать что-нибудь
Или войдите, чтобы не заполнять форму:
Адрес электронной почты нигде не отображается, необходим только для обратной связи.
Напрограммировано на Go 1.23.2, версия движка 589441d