Пишем бота на PHP для Twitter или как пользоваться Twitter API (oAuth)

На днях столкнулся с необходимость написания небольшого бота для Twitter, который бы отправлял новости в мой аккаунт. Сразу отправился на изучение Twitter API. В принципе, там нет ничего сложного. Всего около 50 запросов.

Небольшую сложность представляет собой только oAuth аутентификация, которая на первый взгляд кажется какой-то абсурдной. Раньше, что бы обновить статус в своем аккаунте, можно было воспользоваться простой HTTP аутентификации, но с 31 августа 2010 года она была заменена полностью на oAuth.

Поэтому прежде чем отправить новый Твит надо пройти всю процедуру авторизации и получение ключей доступа.

Регистрация приложения

Первое, что нам необходимо сделать, это зарегистрировать наше новое приложения. Регистрация доступна по адресу https://dev.twitter.com/apps.

На данном этапе нам необходимо будет ввести стандартные необходимые поля: название нашего приложения (Application Name), его описание (Application Name), сайт нашего приложения (Application Website) , организацию (Organization – если есть).

Ниже необходимо выбрать какой тип приложения мы будем использовать Client или Browser. Так как взаимодействия с браузером и пользователем у нас не будет, то мы выбираем Client (Desktop Client).

Дальше выбираем уровень доступа (Default Access type) Чтение-Запись твиттов (Read & Write) или просто чтение (Read-only).

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

Callback URL не указываем, так как нет взаимодействия с веб интерфейсом.

После успешной регистрации вашего приложения вам будут предоставлены 2 ключа доступа – это OAuth Consumer key и Consumer secret.

TwitterOAuth PHP Class

Что бы не писать свой велосипед  мы воспользуемся готовым классом TwitterOAuth
для доступа к Twitter API разработанным Abraham Williams. Данный класс как раз реализует протокол oAuth и необходимые методы. Данный класс выложен в открытом доступе на GitHub и доступен по адресу https://github.com/abraham/twitteroauth. Или прямая ссылка на скачивание https://github.com/abraham/twitteroauth/zipball/0.2.0-beta3 .
Из этого архива нам понадобятся только 2 файла, которые находятся в папке «twitteroauth».

oAuth авторизация и получение PIN

Обычно, авторизация приложений происходит через нажатие кнопки «Аторизация через Twitter» на сайте, но в Desktop приложениях такого нет, поэтому авторизация происходит через  PIN доступ.

Шаг 1

Для начала нам необходимо получить ссылку для доступа нашего приложения к определенному аккаунту и Request коды для получения токенов аутентификации. Для этого воспользуемся следующим кодом:

define('TWITTER_KEY', 'Ваш Consumer key');
define('TWITTER_SECRET', 'Ваш Consumer secret');

include_once 'twitteroauth.php';

/**
 * Шаг 1
 * Получаем ссылку для регистрации нашего приложения к нужному аккаунту
 *
 * @return void
 */
function generateAuthLink()
{
    $oauth = new TwitterOAuth(TWITTER_KEY, TWITTER_SECRET);

    $request = $oauth->getRequestToken();

    $requestToken       = $request['oauth_token'];
    $requestTokenSecret = $request['oauth_token_secret'];

    $requestStr = 'request_token=' . $requestToken . "\n";
    $requestStr .= 'request_token_secret=' . $requestTokenSecret . "\n";

    file_put_contents('request.txt', $requestStr);

    // Создаем ссылку
    $registerURL = $oauth->getAuthorizeURL($request);
    // Показываем ссылку
    echo '<a href="' . $registerURL . '">Register with Twitter</a>';
}

Получаем ссылку вида https://twitter.com/oauth/authenticate?oauth_token=<Токен авторизации>. Теперь идем в браузер и авторизуемся на твиттере под аккаунтом, от которого мы будем отправлять сообщения. Теперь в адресную строку вставляем выше сгенерированную ссылку и жмем Enter. Открывается следующая страница:

После этого мы разрешаем приложению доступ к нашему аккаунту , который будет ботом и отправлять сообщения в Twitter. На следующей странице вам будет показан ваш PIN код доступа. В файл «request.txt»  были записаны Request коды для получения токенов  аутентификации (доступа).

Шаг 2

Далее получим наш oAuth токен уже для непосредственной отправки сообщений.  Воспользуемся следующим кодом

/**
 * Шаг 2
 * Получаем коды доступа
 *
 * @param  $requestToken Токен для запроса кодов дсотупа
 * @param  $requestTokenSecret Секретный токен для запроса кодов доступа
 * @param  $pin PIN доступа
 * @return void
 */
function generateOauthToken($requestToken, $requestTokenSecret, $pin)
{

    $oauth = new TwitterOAuth(TWITTER_KEY, TWITTER_SECRET, $requestToken, $requestTokenSecret);

    // Создаем коды доступа по PIN коду
    $request = $oauth->getAccessToken($pin);
    $accessToken       = $request['oauth_token'];
    $accessTokenSecret = $request['oauth_token_secret'];

    $requestStr = 'accessToken=' . $accessToken . "\n";
    $requestStr .= 'accessTokenSecret=' . $accessTokenSecret . "\n";

    file_put_contents('access.txt', $requestStr);

    echo "ok";
}

Теперь в файле «access.txt» будут необходимые коды, которые вам надо куда-то сохранить и впоследствии использовать.

ВНИМАНИЕ! Если по каким-то причинам не удалось получить access токены, то попробуйте выполнить все с первого шага ещё раз.

Шаг 3

Теперь попробуем отправить наше первое сообщение используя oauth_token и oauth_token_secret.

/**
 * Шаг 3
 * Отправляем сообщение в Twitter
 *
 * @param  $accessToken Токен доступа
 * @param  $accessSecret Секретный токен доступа
 * @return void
 */
function sendMessage($accessToken, $accessSecret)
{
    $oauth = new TwitterOAuth(TWITTER_KEY, TWITTER_SECRET, $accessToken, $accessSecret);

    // Проверяем от кого будут идти сообщение
    $credentials = $oauth->get("account/verify_credentials");
    echo "Connected as @" . $credentials->screen_name;

    // Отправляем сообщение
    $oauth->post('statuses/update', array('status' => "VeXell robot: hello world"));
}

В результате в моём аккаунте появилась вот такая запись:

В дальнейшем вы можете написать отдельный класс для отправки необходимых вам сообщений в твиттер, автоматически фолловить за кем то или ретвитить нужные вам сообщения с поиском по тегам.

На этом пока что все, хороших вам Твитов. И фолловте меня на Twitter`е http://twitter.com/#!/vexell

Вот мой архив с примером использования бота, который можно скачать тут.

p.s. Только не забудьте изменять необходимые параметры на свои.