Меню

ponomaryov.org.ua

Личный сайт

Читать Twitter в QIP

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

twitter to qip

Поставив один из клиентов (Twitterlicious) я обнаружил что это просто еще одна аська, которая висит в трее. Вполне естественно возникло желание читать новости твиттер-ленты сразу в аське или в любом IM-клиенте. Я пользуюсь QIP Infium под Windows и хотел бы настроить его для получения твитов, хотя бы в самом простом варианте.


QIP Infium поддерживает Jabber и я хотел бы научить его читать твиттер именно через джаббер-протокол. Но, как известно, из-за проблем с нагрузкой на сервера и неудачной технической архитектурой сервиса, руководители твиттера отказались от поддержки джаббера.
Именно так вызрела идея написать, скрипт, который бы отсылал на джаббер последние обновления твиттер-ленты. Код скрипта и небольшие пояснения приведены ниже.
Начальные установки, в которых необходимо указать все необходимые для работы скрипта реквизиты. Прежде всего, это имя и пароль от Твиттера. Данный скрипт использует самую простую базовую авторизацию. В документации к твиттеру написано, что данный метод авторизации планируется в ближайшем будующем отменить и перейти на более продвинутую авторизацию через внешние сервисы. Если вы действительно хотите сделать все красиво или планируете создать сервис для пользователей, то пожалуй, вам действительно стоит отказаться от базовой авторизации. Но для моих целей ее было вполне достаточно.
Кроме того, нужно указать сервер, имя и пароль джаббер-аккаунта с которого будут рассылаться сообщения. Т.е. данные для того бота, который будет уведомлять нас об обновлениях твиттер-ленты. Имя пользователя нужно указывать без адреса сервера, т.е. vasya, а не vasya@jabber.ru.
Также нужно указать джаббер адрес получателя рассылки, т.е. тот аккаунт, которым вы постоянно пользуетесь в QIP. В принципе, это может быть аккаунты вида login@qip.ru, который получает каждый пользователь QIP Infium, или даже аккаунт Gtalk.

Далее, подключается библиотека для работы с jabber. Как самую простую, я выбрал xmphp Она позволяет просто и удобно отослать сообщения, без необходимости вникать в подробности работы xmpp-протокола.

// Twitter Accoung Info
$username = 'TwitterName';
$password = 'TwitterPass';
// Jabber Info
$j_server = "jabber.ru";
$j_user = "JabberBotName";
$j_password = "JabberBotName";
$reciver = "myjabber@jabber.ru";
include 'XMPPHP/XMPP.php';

Еще парочка подготовительных операций. Формируем URL, по котором мы будем получать обновления твиттера в формате xml. А также, проверяем содержимое временного файла, в котором хранится идентификатор последнего полученного сообщения. Если таковой файл имеется, а он должен появится после предыдущего запуска скрипта, то указываем в URL, что нам нужны только сообщения, написанные позже указанного. Это все необходимо для того, чтобы на джаббер не приходили одни и те же сообщения.

$url = "http://twitter.com/statuses/friends_timeline/".$username.".xml";
$credentials = $username.":".$password;
$last_file = "last.txt";

$last_id = trim(@file_get_contents($last_file));

if($last_id)
    {
     $url .= "?since_id=".$last_id;
    }

Curl’ом делаем запрос на последние сообщения использую базовую авторизацию.

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);





curl_setopt($ch, CURLOPT_USERPWD, $credentials);

$data = curl_exec($ch);

curl_close($ch);

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

$message = "";
$xml = new SimpleXMLElement($data);

foreach($xml->status as $status)
    {
     $message .= $status->user->name." : ".$status->text."n";
    }

$last_id = $xml->status[0]->id;
file_put_contents($last_file, $last_id."");

С помощью библиотеки xmphp отправляем сообщение. Если будет заниматься отладкой скрипта, то могут помочь опции $printlog=true и $loglevel=XMPPHP_Log::LEVEL_VERBOSE.

    $conn = new XMPPHP_XMPP($j_server, 5222, $j_user, $j_password,
    'xmpphp', $j_server, $printlog=false,
    $loglevel=XMPPHP_Log::LEVEL_INFO);

try {
    $conn->connect();
    $conn->processUntil('session_start');
    $conn->presence();
    $conn->message($reciver, $message);
    $conn->disconnect();
} catch(XMPPHP_Exception $e) {
    die($e->getMessage());
}

Скажу сразу, что последняя часть с отправкой сообщения на джаббер не всегда работает корректно. Например, у одного и того же хостер на одном сервере данная процедура работает отлично, на другом — не работает.
Теперь остается только закачать скрипт на сервер и настроить cron. Надеюсь у Вас все получится 🙂 Если будут возникать проблемы — пишите вопросы в комментариях.
Скачать скрипт с библиотекой можно по ссылке

download-button