Jabber-проекты: работа над RSS-транспортом от Binary

Как уже писал ранее, в мире на jabber-серверах не осталось транспортов, обеспечивающих возможность чтения новостей через RSS-ленты. Чуть позже переделал страницу на JabberWorld’e, где были собраны периодически сканируемые мировые jabber-серверы, на использование XMPP Server Scanner, о чем напишу когда-нибудь позже. Попутно на https://xmpp.love нашел огромный список серверов – больший, чем у меня был в самом начале на JabberWorld’e (а потом туда добавилось и еще несколько сотен серверов) – в итоге получил примерно 2500 работающих серверов. Тем не менее, RSS-транспорта и там, к сожалению, не нашлось.

Некоторое время назад начал делать архив Jabber-проектов; в их числе оказались и полученные от Binary – одного из авторов http://wiki.jrudevels.org – проекты RSS и погодного транспорта. Погодный запустил, номинально работает, но данные о погоде получать уже неоткуда, да и мне он менее интересен. А вот с RSS решил разобраться подробнее. Стоит заметить, что есть еще один проект RSS-транспорта от поляков – PyRSS. Разрабатывать его прекратили еще в 2005, поэтому все, что о нем можно узнать (и скачать код), находится на странице на JaWiki.

Транспорт от поляков запустил, позже сделал минимальные правки – не было commit’а в базу при каких-то там обновлениях, плюс поправил схему самой базы – все же та делалась очень давно и в хедерах значился еще 4-й MySQL.  Были странности в работе (сейчас уже, исходя из опыта с JRD RSS думаю, что причины могут быть похожими) – например, на одной из лент постоянно сваливались все сообщения, несмотря на то, что они приходили раньше.

Однако идея регистрировать все ленты через админа мне не сильно понравилась, у Binary, судя по скриншотам, было поинтереснее. Запустил; сходу из проблем – почти никакую ленту нельзя зарегистрировать – выдает ошибку. Начал потихоньку разбираться во всем этом – при практически отсутствии знаний по Python и тому, как это все работает.

Итоги:

  • Скрипт перевел с PostgreSQL на MySQL
  • Восстановил схему базы
  • Убрал ILIKE – в мускуле его нет. Case insensitive решается на стороне базы (есть в схеме)
  • Заменил внутренности dbQuote на escape_string.
  • Поиск работает только по описанию, но не по урлу. Однако при попытке регистрации такой же ленты с другим описанием выдает конфликт. В итоге кто-то может насоздавать лент с мусорным описанием и далее будет тяжело найти что-либо нужное.

Дальше пошло-поехало:

  • Поиск можно делать по всему, в том числе по URL’у
  • Добавлена обработка в том числе HTTPS-лент – то, из-за чего раньше не удавалось их регистрировать
  • Названия лент и описания можно делать на русском
  • Есть возможность настраивать интервал обновления при регистрации ленты
  • Сделаны нормальные визитки для лент, в которых есть адрес ленты и интервал обновления. Добавил RSS-лого в качестве фото для транспорта и ботов. Планировал отдавать в качестве фото в vCard’e ссылку на favicon.ico сайта – в jabber’e это возможно; однако ни один из опробованных клиентов с этим не работал. В итоге оставил просто RSS-лого.
  • Конфиг вынесен в отдельный файл.
  • Добавлено преобразование ряда HTML-тегов в соответствующие символы
  • Добавлено удаление ссылок из тела ленты при вычислении хэша – на некоторых лентах это приводило к постоянным изменениям ленты (апдейт SID или alt-текста о числе просмотра картинок на форумах).
  • Сделал реконнект для базы
  • Сделал таймаут для получения лент
  • Привел в порядок тему с encode()

H31, один из основных авторов на JabberWorld’e, предложил создать под эти проекты репозитории на github’e. С git’ом дела раньше почти не имел (на уровне одной команды – git clone); начал читать немного о нем – правда, пока приостановил изучение, изучив на несколько команд больше – теперь знаю, как делать коммиты. Для текущей работы этого было достаточно, остальное дочитаю потом. Так или иначе, код переделанного транспорта доступен по ссылке https://github.com/jabberworld/jrd_rss.

На сейчас пока нет идей, что еще можно было бы добавить. Потенциально, разве что, сделать список всех зарегистрированных лент доступный в “Браузере сервисов” – так, как это сделано у поляков. Возможно, позже сделаю – будет какой-нибудь версией 1.1 или вроде того. В целом, хватает поиска, но все зависит от того, насколько активно транспорт будет использоваться. Наличие полного списка лент удобно, например, тогда, когда ищешь что-то интересное среди существующих лент, но толком не знаешь, какие ключевые слова нужны.

А дальше… В идеале – запустить все под Python 3. Код уже более-менее знаком, так что править будет проще. Зависимости – mysqldb и feedparser – есть под Python 3. Основная проблема – pyxmpp, который уже не развивается. Из заметок:

  • Пробовал конвертацию под Python3 через 2to3. В целом, дополнительно правки потом минимальные – нет import md5, надо сделать from hashlib import md5. Само собой, надо поставить все сопутствующие пакеты под python3 – python3-libxml2 python3-dnspython python3-mysqldb python3-feedparser. Дальше проблема начинается с работой с pyxmpp.
  • Пробовал через тот же 2to3 сконвертировать pyxmpp и положить ее в каталог скрипта, но так просто не заработало, вылетает с ошибкой. В общем, если и пытаться сконвертировать ее под 3-ку, то надо заниматься серьезнее.
  • У автора есть pyxmpp2. Как drop-in replacement не пойдет, нужны минимальные правки скрипта (в частности import’ы поправить). Но так или иначе, во многих файлах стоят заглушки: “ImportError(“{0} is not yet rewritten for PyXMPP2”). Так что пользоваться этим пока сложно. Но коммиты идут, так что потенциально когда-нибудь можно будет рассмотреть такую возможность.
  • Если уж совсем будет (кому-то) нечем заняться – можно попробовать задействовать какую-то другую библиотеку, тот же python-twisted – или что там нынче актуально для jabber’а. В целом, логика работы транспорта более-менее ясна и сохраняется, остается позаменять точки взаимодействия со старой либой на новую. Хотя все равно это огромный объем работы.

В целом, пока есть возможность запустить Python 2, можно пользоваться тем, что есть. Библиотеки при необходимости можно скачать отдельно и просто разместить в каталоге транспорта.

Облом вышел при раскатывании транспорта уже на боевом сервере – до того все тестировал на местной копии, где остался старый ejabberd – копия еще до переезда на VPS. Локально все работало прекрасно, на боевом же сервере транспорт отказывался подключаться; в логах ejabberd’а была куча crash dump’ов. Из того, что я пока понял – на новом сервере отключены (либо они требуют для работы какие-то зависимости) какие-то механизмы авторизации, которые были доступны на старом сервере. А у транспорта, в силу использования старой библиотеки pyxmpp, современных вариантов авторизации нет. В итоге с подключением облом. Если заглянуть в /usr/share/pyshared/pyxmpp/sasl – там есть digest_md5 и plain; есть еще gssapi, но я так понял, что это для других немного целей. В свою очередь в конфиге актуального ejabberd’а вижу такое: “Disabling digest-md5 SASL authentication. digest-md5 requires plain-text password storage (see auth_password_format option).”. Ну и чуть ниже: “## Store the plain passwords or hashed for SCRAM: auth_password_format: scram”. Если заглянуть в разрабатываемую pyxmpp2, то там в подкаталоге sasl уже есть scram. UPDATE: на локальной копии VPS’ки все прекрасно работает. ejabberd, похоже, надо просто ребутнуть.

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

Update: выпустил версию 1.1, в которой добавил упомянутый выше просмотр списка зарегистрированных лент через “Браузер сервисов”. Плюс поменялся алгоритм хранения информации о полученных и прочитанных статьях – в общем, все есть в CHANGELOG на github’e.

Вроде вышло неплохо :).

А транспорт пока запущен в “боевом” режиме через jabbercity.ru.

3 мысли о “Jabber-проекты: работа над RSS-транспортом от Binary”

Добавить комментарий