Пишем бота на 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. Только не забудьте изменять необходимые параметры на свои.