Получение RSS ленты из twitter после обновления API 1.1

В связи с обновлениями twitter API с версии 1.0 до версии 1.1 перестали работать запросы не получение RSS ленты в старом стиле, вроде:

Это связано с окончанием поддержки twitter-ом XML, RSS и Atom стандартов вывода. Разработчики прокомментировали их мотивы при принятии подобного решения тезисом о том, что доля подобных запросов мала и может быть безболезненно для пользователей отключена.

Но я склонен предполагать, что найдутся пользователи, которые бы хотели, все же, видеть таковой функционал. Для этой группы и будет вестись повествование ниже.

Это уже было в «Симпсонах»

Существует масса решений этой проблемы. Наверное, наиболее адекватное — это создание виджета в своем аккаунте твиттера с последующей пересылкой данных в google apps script для последующего формирования самой RSS ленты. Это решение описано здесь.
Но ведь не у всех есть свой твиттер-аккаунт, а среди тех, у кого его нет, вполне могут найтись и те, кто хочет просто читать чужие твиты.

Строго говоря, то решение, которое я предложу ниже, есть не совсем чтение чьего-то твиттера, это просто поиск всех упоминаний имени пользователя.

Начнем

Для реализации такового «чтения» без авторизации существует готовый скрипт, написанный на perl, код которого доступен по этой ссылке. Он успешно взаимодействует с twitter API 1.1 и выдает результаты поиска в удобной RSS форме. Для того, чтобы им воспользоваться можно скопировать его на какой-либо сервер, принадлежащий вам и поддерживающий perl в качестве языка исполнения сценариев страниц, либо воспользоваться уже существующей инкарнацией, расположенной по этому адресу.
Но он наделен одним существенным недостатком:
$body = "<![CDATA[" . HTML::Entities::encode_numeric($body) . "]]>";

Здесь поля «title» и «description» кодируются в спецсимволы, соответствующие unicode таблице. С англоязычными твитами проблем возникать не будет, а вот с русскоязычными могут. Если Ваш RSS клиент не поддерживает расшифровку таких спецсимволов, твиты будут нечитаемы.

Если Вы выбрали установку этого скрипта на свой сервер, Вам будет достаточно просто поправить одну строку, в противном же случае путей решения этой проблемы существует два: на удаленной стороне и на стороне локального ПО.

Я для чтения RSS использую Feed Notifier. У него обработка спецсимволов отсутствует. Поддержка их обработки может быть добавлена самостоятельно, т.к. это ПО, большей частью, написано на python и исходные коды для нее доступны по этому адресу.
Но в моем случае было принято решение следовать по пути полной обработки на стороне серверов.
Не мудрствуя лукаво, был написан скрипт для google apps script, который и выполняет задачу преобразования кодированных спецсимволов. Приведу его код:

function doGet() { var response = UrlFetchApp.fetch("http://twitrss.me/twitter_user_to_rss/?user=username &fetch=Fetch+RSS").getContentText("Windows-1251"); var decode = XmlService.parse(response); var rootElement = decode.getRootElement(); var channel = rootElement.getChildren("channel"); var items = channel[0].getChildren("item"); for (var i = 0; i < items.length; i++) { var title = items[i].getChildren("title"); var description = items[i].getChildren("description"); var decode_title = new XML('<d>' + title[0].getText() + '</d>'); var decode_description = new XML('<d>' + description[0].getText() + '</d>'); title[0].setText(decode_title.toString()); description[0].setText(decode_description.toString()); } var output = XmlService.getPrettyFormat().format(decode); return ContentService.createTextOutput(output); }

В этом скрипте стоит только заменить username на имя пользователя, обновления которого Вы хотели бы отслеживать.
Вопрос создания и публикации скрипта не сложен, но есть свои особенности. Во-первых после копирования кода скрипта в заново созданный документ, его надо сохранить. Во-вторых обязательно надо его прогнать, чтобы скрипт запросил разрешения на свое исполнение, которые мы в последствии ему и дадим (кнопка «Run»). В-третьих его надо опубликовать для запуска из любого источника, в т.ч. анонимного.

Как результат, мы будем иметь ссылку вида: https://script.google.com/macros/s/многобуквенный_идентификатор _скрипта/exec
Отлично, теперь мы имеет RSS ленту, где все спецсимволы заменены их соответствующими юникодовыми аналогами.
Для тех, чей RSS клиент поддерживает HTTPS на этом статья заканчивается. Feed Notifier не поддерживает HTTPS. В принципе, проблема отсутствия поддержки HTTPS может быть решена внесением соответствующих изменений в исходный код. Но и здесь я пошел по пути server-side.

Поскольку по этому каналу не передается никакой чувствительной информации, HTTPS траффик может вполне быть перенаправлен в обычный HTTP канал. Для этого я использовал банальный веб-прокси. Вот этому веб-прокси можно передать адрес для перехода в качестве GET параметра, так что выбрал я именно его.

Таким образом, в результате всех этих манипуляций вполне достаточно скормить RSS клиенту ссылку вида:
http://www.webproxy.net/view?q=https://script.google.com/macros/s/многобуквенный_идентификатор_скрипта/exec
чтобы получить вполне работоспособную версию RSS ленты обновлений twitter.

Если хочется читать более чем одного человека, вполне достаточно в тот же документ добавить еще один скрипт того же содержания, но с другим username.

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

  Поделиться:
Оригинал статьи — habrahabr.ru Размещено — 16.09.2014