Закралась мне как-то в голову мысль, что пора бы заняться интеграцией блога и твиттера в единое целое. Для этого существуют две такие замечательные вещи, как OAuth, связывающий ваше приложение с функционалом стороннего API, и сам функционал, реализованный, в данном случае, в виде Twitter API.
Проштудировав несколько мануалов (например, у Дмитрия Котерова имеется очень хорошая статья по этой теме) и поняв основной принцип работы OAuth, я пришел к выводу, что писать свой велосипед — неэффективная задача на данный момент, и решил посмотреть, что уже есть готового в интернете.
Итак, что же мы видим, зайдя на http://dev.twitter.com/pages/libraries? Невообразимое количество готовых решений для нашей задачи. Я решил остановится на приглянувшейся мне библиотеке Twitter-async от Jaisen Mathai. Далее опишу, как интегрировать библиотеку в Kohana 3 и как ей пользоваться.
Для начала зарегистрируем свое приложение в твиттере по адресу http://twitter.com/apps/new. Заполняем поля, выбираем тип «Browser» для «Application Type», «Default Access type» выставляем в «Read & Write». Обязательно заполняем поле «Callback URL» — страница, куда будет совершен редирект на ваш сайт после обмена секретными ключами между вашим приложением и твиттером. К примеру, у меня за это отвечает отдельный контроллер twitter c методом confirm, код которого я приведу позже (т.е выглядит это примерно так: sitename.com/twitter/confirm ). Все, заполняем капчу, жмем «Save» и получаем пару ключей — «Consumer key» и «Consumer secret». Они понадобятся чуть позже.
Следующий шаг — распаковываем содержимое архива с библиотекой Twitter-async в директорию /modules/epitwitter/classes/ вашего сайта на kohana3. Нам нужны всего три файла — EpiCurl.php, EpiOAuth.php и EpiTwitter.php. К примеру, путь до EpiTwitter.php будет выглядеть так: /modules/epitwitter/classes/EpiTwitter.php. Имя файла EpiTwitter.php переводим в нижний регистр (epitwitter.php ) и добавляем в него три строки прямо перед описанием самого класса:
Эти манипуляции нужны для интеграции библиотеки в систему загрузки модулей Kohana3.
Далее, создаем файл /modules/epitwitter/classes/secret.php, где будем хранить наши ключи:
Открываем наш bootstrap.php и добавляем в него сточку для загрузки библиотеки в систему:
Все, интеграцию библиотеки в систему мы завершили, теперь пришло время заставить ее работать.
Создаем контроллер /application/classes/controller/twitter.php — для CallbackURL, помните? Вот как он выглядит у меня:
В частности, нас интересует метод confirm — public function action_confirm(), на который ссылается настройка CallbackURL вашего приложения. Здесь происходит получение токена от OAuth твиттера и сохранения его значения (пары oauth_token и oauth_token_secret), к примеру, в кукисы. Затем происходит редирект на главную страницу, чтобы кукисы проинициализировались.
Что происходит на главной странице? За ядро сайта у меня отвечает контроллер Core.
У фреймворка Kohana3 есть замечательный метод before(), который замечателен тем, что в нем происходят процессы до активизации основного метода. Т.е до обработки основных данных главного метода и рендера шаблона, создаются экземпляры классов нашей библиотеки, производятся нужные манипуляции с ключами и в зависимости от обстоятельств, в шаблон передается либо ссылка на авторизацию в oAuth Twitter, либо данные о авторизованном пользователе.
У нашей библиотеки очень удобный способ обращения к TwitterAPI. К примеру, рассмотрим эту строчку:
Что здесь происходит? Все очень просто. Мы говорим нашему объекту: используя метод GET, постучи в TwitterAPI по адресу account/verify_credentials. Результат возвращается в json и парсится внутри объекта.
К примеру, чтобы узнать публичные данные какого-нибудь твиттер-аккаунта, согласно TwitterAPI, нужно заюзать метод users/show (см. http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-users%C2%A0show). Соответственно, вызов будет выглядеть так:
Все просто :)
Если выкинуть конкретизацию относительно интеграции в Kohana3, то вкратце связка вашего приложения + OAuth + Twitter API (используя библиотеку Twitter-async) выглядит так:
Проштудировав несколько мануалов (например, у Дмитрия Котерова имеется очень хорошая статья по этой теме) и поняв основной принцип работы OAuth, я пришел к выводу, что писать свой велосипед — неэффективная задача на данный момент, и решил посмотреть, что уже есть готового в интернете.
Итак, что же мы видим, зайдя на http://dev.twitter.com/pages/libraries? Невообразимое количество готовых решений для нашей задачи. Я решил остановится на приглянувшейся мне библиотеке Twitter-async от Jaisen Mathai. Далее опишу, как интегрировать библиотеку в Kohana 3 и как ей пользоваться.
Для начала зарегистрируем свое приложение в твиттере по адресу http://twitter.com/apps/new. Заполняем поля, выбираем тип «Browser» для «Application Type», «Default Access type» выставляем в «Read & Write». Обязательно заполняем поле «Callback URL» — страница, куда будет совершен редирект на ваш сайт после обмена секретными ключами между вашим приложением и твиттером. К примеру, у меня за это отвечает отдельный контроллер twitter c методом confirm, код которого я приведу позже (т.е выглядит это примерно так: sitename.com/twitter/confirm ). Все, заполняем капчу, жмем «Save» и получаем пару ключей — «Consumer key» и «Consumer secret». Они понадобятся чуть позже.
Следующий шаг — распаковываем содержимое архива с библиотекой Twitter-async в директорию /modules/epitwitter/classes/ вашего сайта на kohana3. Нам нужны всего три файла — EpiCurl.php, EpiOAuth.php и EpiTwitter.php. К примеру, путь до EpiTwitter.php будет выглядеть так: /modules/epitwitter/classes/EpiTwitter.php. Имя файла EpiTwitter.php переводим в нижний регистр (epitwitter.php ) и добавляем в него три строки прямо перед описанием самого класса:
…
include_once('EpiCurl.php');
include_once('EpiOAuth.php');
include_once('secret.php');
class EpiTwitter extends EpiOAuth
{
…
* This source code was highlighted with Source Code Highlighter.
Эти манипуляции нужны для интеграции библиотеки в систему загрузки модулей Kohana3.
Далее, создаем файл /modules/epitwitter/classes/secret.php, где будем хранить наши ключи:
<?php
define('CONSUMER_KEY', 'тут_ваш_consumer_key');
define('CONSUMER_SECRET', 'тут_ваш_consumer_secret');
?>
* This source code was highlighted with Source Code Highlighter.
Открываем наш bootstrap.php и добавляем в него сточку для загрузки библиотеки в систему:
Kohana::modules(array(
…
'epitwitter' => MODPATH.'epitwitter',
…
));
* This source code was highlighted with Source Code Highlighter.
Все, интеграцию библиотеки в систему мы завершили, теперь пришло время заставить ее работать.
Создаем контроллер /application/classes/controller/twitter.php — для CallbackURL, помните? Вот как он выглядит у меня:
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Twitter extends Controller {
…
public function action_confirm()
{
$twitterObj = new EpiTwitter(CONSUMER_KEY, CONSUMER_SECRET);
$twitterObj->setToken($_GET['oauth_token']);
$token = $twitterObj->getAccessToken();
Cookie::set('oauth_token',$token->oauth_token,60*60*24*7);
Cookie::set('oauth_token_secret',$token->oauth_token_secret,60*60*24*7);
header('Location: /');
exit();
}
…
}
* This source code was highlighted with Source Code Highlighter.
В частности, нас интересует метод confirm — public function action_confirm(), на который ссылается настройка CallbackURL вашего приложения. Здесь происходит получение токена от OAuth твиттера и сохранения его значения (пары oauth_token и oauth_token_secret), к примеру, в кукисы. Затем происходит редирект на главную страницу, чтобы кукисы проинициализировались.
Что происходит на главной странице? За ядро сайта у меня отвечает контроллер Core.
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Core extends Controller_Template {
public $template = 'main'; // основной шаблон сайта
…
public $twitterObj = NULL;
public $twitterInfo = NULL;
…
public function before()
{
parent::before();
//проверяем куки на наличие токена oAuth
if(isset($_COOKIE['oauth_token']) and isset($_COOKIE['oauth_token_secret']))
{
$twitterObj = new EpiTwitter(CONSUMER_KEY, CONSUMER_SECRET,
Cookie::get('oauth_token'), Cookie::get('oauth_token_secret'));
//передаем объект связки oAuth+TwitterAPI в публичное свойство класса для доступа из других методов и т.п
$this->twitterObj = $twitterObj;
//забираем данные о залогинившемся пользователе
$twitterInfo = $twitterObj->get_accountVerify_credentials();
$twitterInfo->response;
$this->twitterInfo = $twitterInfo;
$this->template->twitterObj = $this->twitterObj;
//передаем массив данных о пользователе в основной шаблон. Теперь на всех страницах будет отображаться логин пользователя и его юзерпик.
$this->template->twitterInfo = $twitterInfo;
}
else
{
//иначе создаем объект EpiTwitter и передаем в шаблон ссылку на авторизацию твиттер-аккаунта и получение токенов
$twitterObj = new EpiTwitter(CONSUMER_KEY, CONSUMER_SECRET);
$this->twitterObj = NULL;
$this->twitterInfo = NULL;
//Вот она, ссылка:
$this->template->twitter_login = $twitterObj->getAuthorizationUrl();
}
}
…
* This source code was highlighted with Source Code Highlighter.
У фреймворка Kohana3 есть замечательный метод before(), который замечателен тем, что в нем происходят процессы до активизации основного метода. Т.е до обработки основных данных главного метода и рендера шаблона, создаются экземпляры классов нашей библиотеки, производятся нужные манипуляции с ключами и в зависимости от обстоятельств, в шаблон передается либо ссылка на авторизацию в oAuth Twitter, либо данные о авторизованном пользователе.
У нашей библиотеки очень удобный способ обращения к TwitterAPI. К примеру, рассмотрим эту строчку:
$twitterInfo = $twitterObj->get_accountVerify_credentials();
Что здесь происходит? Все очень просто. Мы говорим нашему объекту: используя метод GET, постучи в TwitterAPI по адресу account/verify_credentials. Результат возвращается в json и парсится внутри объекта.
К примеру, чтобы узнать публичные данные какого-нибудь твиттер-аккаунта, согласно TwitterAPI, нужно заюзать метод users/show (см. http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-users%C2%A0show). Соответственно, вызов будет выглядеть так:
$twitterInfo = $twitterObj->get_usersShow(array('screen_name'=>'VasyaPupkin'));
Все просто :)
Если выкинуть конкретизацию относительно интеграции в Kohana3, то вкратце связка вашего приложения + OAuth + Twitter API (используя библиотеку Twitter-async) выглядит так:
- Регистрируем наше приложение в твиттере, получаем пару ключей — consumer_key и consumer_secret
- В callbackurl подготавливаем посадочное место для получения токена от OAuth Twitter'а, сохраняем куда-нибудь полученные токены для постоянной авторизации на нашем сайте.
- Используя полученную пару токенов и пару ключей consumer, создаем экземпляр EpiTwitter, с помощью которого можно свободно обращаться к Twitter API. Либо, если токены отсутсвуют, используя пару consumer_key и consumer_secret, получить ссылку на авторизацию в oAuth твиттера для получения токенов.