Pull to refresh

FOSS News №87 – Спецвыпуск про Telegram бота: как мы за пару хакатонов сделали то, что я не мог сделать за полгода

Reading time 4 min
Views 3.4K

Дайджесты FOSS News мы выпускаем с конца января 2020 г. (самому не верится). Робот собирает материалы из RSS и HTML-парсингом из нескольких десятков источников, я с помощью базы ключевых слов и интерактивного консольного скрипта фильтрую и категоризую, три человека вычитывают. Пару раз уже выступал про дайджесты на конференциях. И где-то уже полгода я хотел сделать подготовку распределённой, чтобы у самого появилось время для более творческой работы по улучшению дайджестов (давать больше контекста, добавлять авторские комментарии к главным материалам и прочее), но никак не мог найти время написать этого бота. И недавно, благодаря финансовой поддержке читателей, мы в PermLUG провели пару хакатонов, где наконец-то сделали этого бота.

Для начала напомню схему подготовки дайджестов до появления бота.

Немного подробностей по наиболее важным этапам:

  1. FNGS (англ. FOSS News Gathering Server) — сервер, собирающий материалы из 46 русско- и англоязычных источников, в основном через RSS, и фильтрующий по вхождениям 2015 ключевых слов.

  2. fncategorizer.py — интерактивный консольный скрипт, который показывает мне каждый собранный материал и предлагает решить, включать ли в дайджест (несмотря на фильтрацию по ключевым словам, «мусор» всё равно иногда попадает), ставить ли главным материалом, какой тип и категорию материала присваивать и есть ли материалы схожей тематики.

  3. remotedatatohtml.py — скрипт, выкачивающий разобранные материалы текущего выпуска из базы данных и генерирующий HTML для загрузки в Google Drive (да, не «правоверно», но очень удобно).

  4. Ручные правки: составление аннотаций главных материалов, перевод английских заголовков, рисование постера.

  5. Вычитка тремя редакторами.

  6. googledoctohtml.py — конвертация гуглодокумента в разметку Хабра, в том числе автоматическое составление оглавления.

  7. Публикация на Хабр и размещение ссылок на эту статью по соцсетям и в RSS.

Теперь же планируется, что бот займёт место между пунктами 1 и 2.

Блок-схема работы бота следующая:

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

  2. Бот показывает кнопку «Следующая новость» от пользователя.

  3. Пользователь запрашивает новость.

  4. Бот загружает случайный некатегоризованный материал с FNGS.

  5. Бот показывает для новости заголовок и ссылку и задаёт вопрос «Включить в дайджест?» и кнопки с тремя вариантами ответа: «Да», «Нет» и «Не знаю».

  6. Пользователь нажимает одну из кнопок.

  7. Бот загружает оценку пользователя на FNGS.

  8. Бот переходит к пункту 2) и снова показывает кнопку, ожидая следующей команды на выдачу новости.

Далее, когда я сажусь работать с fncategorizer.py, скрипт показывает мне сводку оценок от пользователей бота и в данный момент это работает для отбрасывания материалов, которые хоть и прошли проверку на ключевые слова, но на самом деле сочтены лишними. Кроме сводки, скрипт на каждый материал показывает оценки пользователей. Ещё бот устроен таким образом, что один и тот же материал для оценки он может дать максимум трём пользователям, это нужно для «кворума», чтобы рекомендация о включении или невключении в дайджест была основана на нескольких голосах и чтобы можно было использовать мнение большинства. Например, пользователи работали с ботом пару дней и по N-ному числу материалов есть мнение большинства (2/2, 2/3, 3/3), что материал надо исключить. И я могу разом всё одобрить на исключение или же указать номера материалов, которые нужно оставить, а остальное исключить.

В разработке бота на двух PermLUG хакатонах (и вне них) помимо меня участвовало ещё два человека (@invasy, @lemonbro) и ещё несколько работало по другим направлениям, связанным с дайджестами. Бот уже две недели проходит внутреннее тестирование девятью людьми и не было найдено ни одного (!) существенного бага, что меня очень порадовало. Напомню, что средства на хакатоны мы получили от читателей дайджестов, за что мы очень благодарны.

Ещё в комплекте с используемым веб-фреймворком Django шла админка, которую легко настроить под свои нужды, вот одна из панелей в ней:

А для случаев, когда не хватает возможностей админки, есть консоль, тоже из фреймворка, вот простой пример её использования:

Теперь мы официально открываем бота для публичного тестирования и приглашаем всех заинтересованных подключиться к https://t.me/fossnewsbot, интерфейс простой, всё должно быть понятно.

Планы по улучшению у нас в данный момент следующие:

  1. Помимо pull-модели, когда пользователи сами запрашивают материалы для оценки, сделать для более вовлечённых на выбор push-модель, когда материалы идут для оценки постоянным потоком и не надо постоянно нажимать кнопку для получения нового. Конечно это не значит, что пользователь должен непрерывно работать с ботом до конца собранных FNGS материалов, просто материал сохраняется для последующей оценки. Оценить сейчас или потом, решает пользователь.

  2. Опять же для более вовлечённых мы хотим помимо оценки, стоит ли включать материал в дайджест, добавить возможность выбирать, является ли материал главным и какой тип и категорию ему установить.

  3. Для более обоснованной оценки мы будем выводить ключевые слова, по которым материал прошёл автоотбор, или пометку о том, что источник является особо доверенным и из него собираются все материалы (как например с OpenNET).

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

  5. Вывод количества материалов, оставшихся для разбора.

  6. Геймификация: ачивки, рейтинги и прочее.

Ещё мы сейчас работаем над использованием Data Science инструментов для более интеллектуального отбора и категоризации материалов в FNGS.

Исходники всех инструментов автоматизации подготовки FOSS News доступны под публичными лицензиями, вот полный список:

  1. FOSS News Gathering Server

  2. FOSS News Tools

  3. FOSS News Telegram Bot

Стэк: Python, Django, DRF, requests, aiogram, dynaconf.

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

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

Вы можете поддержать наши хакатоны, нажав Хабра-кнопку «Задонатить» под статьёй и сделав перевод или просто поставив плюс статье (я участвую в программе поощрения авторов). Код мы делаем открытый, свободный и для общественной пользы и будем рады солидарности со стороны читателей.

[←] Предыдущий выпуск

Tags:
Hubs:
+1
Comments 3
Comments Comments 3

Articles