Zenno SignalDesk: находим самое важное в потоке информации

  • Автор темы Автор темы nexx1
  • Дата начала Дата начала

nexx1

Client
Регистрация
16.08.2016
Сообщения
338
Реакции
133
Баллы
43
SignalDesk.png


На этот конкурс я решил представить инструмент, которым сам активно пользуюсь каждый день.

Этот проект нужен для того, чтобы автоматически следить за большим количеством источников информации и не тратить время на ручной просмотр сайтов, Telegram-каналов, Reddit, YouTube, GitHub и других площадок, при этом находясь в курсе всего, что тебя интересует.

Изначально для этого приходилось вручную проверять Telegram-каналы, сайты, и со временем стало понятно, что такой способ отнимает много времени - часть материалов повторяется или попросту теряется в общем потоке информации.

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

Например, можно настроить проект на новости про нейросети, криптовалюты, SEO или технологии.

Что умеет проект

ВозможностьЧто делает
Сбор публикацийОпрашивает источники HTTP-запросами, без запуска браузера.
ФильтрацияОтбирает публикации по ключевым словам, стоп-словам и дате.
Проверка повторовУчитывает уже обработанные записи, чтобы не отправлять их повторно.
УведомленияОтправляет результаты в Telegram, Discord и файл. Каналы можно комбинировать.
Тестовый режимПоказывает результаты в логе без отправки уведомлений и записи в базу.
База SQLiteХранит обработанные записи и статистику, поддерживает авто-очистку.

Какие источники можно подключить

В проекте предусмотрены восемь типов источников:

ИсточникЧто можно отслеживатьКак устроен сбор
RSS / AtomНовости сайтов и блоговXML-парсер с резервным разбором через регулярные выражения.
TelegramПубличные каналыЧтение веб-версии канала без авторизации.
RedditПубликации в сабреддитахПолучение записей в формате JSON.
YouTubeНовые видео на каналеAtom-лента по ID канала.
GitHubРелизы репозиториевAtom-лента релизов.
Hacker NewsНовости и технические обсужденияFirebase API.
Веб-страницыПубликации на нужных сайтахРазбор страницы по заданным регулярным выражениям.
Twitter / XПубликации через Nitter или RSS-BridgeНужен доступный промежуточный сервис.

Как добавить источник

Источники задаются в текстовом файле: одна строка - одна запись. Формат такой:

Код:
Развернуть Свернуть Копировать
ИМЯ|URL|ТИП|ПРИОРИТЕТ

Примеры записей:

Код:
Развернуть Свернуть Копировать
TechCrunch AI|https://techcrunch.com/category/artificial-intelligence/feed/|rss|1
Crypto Insider|https://t.me/s/crypto_insider|telegram|1
ollama releases|https://github.com/ollama/ollama/releases.atom|atom|2

Сохраните файл и укажите путь к нему в переменной sources_file. Для комментариев используйте строки, начинающиеся с #: так удобно разделять источники по темам.

Как работают фильтры

Каждая публикация проходит три проверки:

  1. Свежесть. Если запись старше значения max_age_hours, она отбрасывается. Например, при значении 24 остаются публикации за последние сутки.
  2. Стоп-слова. Запись отклоняется, если в ней есть слово или фраза из списка исключений.
  3. Ключевые слова. Публикация проходит отбор, если содержит слово или фразу из заданного списка.

ПараметрНазначениеПример
keywordsСлова и фразы для отбора публикацийAI|GPT|neural|OpenAI
stop_wordsСлова и фразы для исключения публикацийspam|casino|курс за 3 дня
max_age_hoursМаксимальный возраст публикации в часах1 - час, 24 - сутки, 168 - неделя

Списки можно указать прямо в keywords и stop_words, разделяя значения символом |. Другой вариант - отдельные файлы, по одному слову или фразе на строку. Пути к ним задаются в keywords_file и stop_words_file.

Куда отправлять результаты

Доступны три канала. Можно выбрать один или включить несколько одновременно.

КаналЧто нужно настроитьДля чего подходит
TelegramТокен бота и Chat IDЛичные уведомления.
DiscordURL вебхукаОбщий канал для команды.
Файлnotify_to_file = 1Архив, ручной разбор и дальнейшая обработка.

Пример сообщения:

Код:
Развернуть Свернуть Копировать
📰 Заголовок новости

Описание или первые строки публикации...

🏷 Категория
✍️ Автор
📡 Источник
🔗 Ссылка

Готовые подборки источников

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

ТемаФайл источниковКоличество
ИИ и нейросетиsources_ai.txt85+
Криптовалютыsources_crypto.txt90+
ИТ и технологииsources_tech.txt40+
Наукаsources_science.txt35+
SEO и маркетингsources_marketing_seo.txt30+
Игрыsources_gaming.txt25+
Дизайн и искусствоsources_design_art.txt25+
Бизнес и финансыsources_business.txt30+
Здоровьеsources_health_fitness.txt25+
Развлеченияsources_entertainment.txt25+
Мировые новостиsources_world_news.txt25+
ИИ на русскомsources_ai_ru.txt15+
Криптовалюты на русскомsources_crypto_ru.txt15+
Новости и технологии на русскомsources_news_ru.txt25+

Для части тем также есть готовые списки ключевых слов:

ТемаФайл ключевых слов
ИИ, включая русскоязычную подборкуkeywords_ai.txt
Криптовалюты, включая русскоязычную подборкуkeywords_crypto.txt
ИТ и технологииkeywords_tech.txt
Наукаkeywords_science.txt
SEO и маркетингkeywords_marketing.txt

В русскоязычные подборки входят:

  • ИИ: разделы AI/ML на Хабре, vc.ru и 11 Telegram-каналов.
  • Криптовалюты: ForkLog, Bits.media, РБК Крипто и Telegram-каналы.
  • Новости и технологии: РБК, Lenta.ru, N+1, Хабр, vc.ru и Naked Science.

Подборки можно объединять: скопируйте нужные строки из нескольких файлов в один. Формат у них одинаковый.

Автоматический перевод

Если нужны и русскоязычные, и англоязычные источники, можно включить перевод на русский:

Код:
Развернуть Свернуть Копировать
auto_translate = ru

Перед отправкой заголовок и описание англоязычной публикации переводятся через Google Translate. Текст с кириллицей пропускается без перевода. В этой реализации API-ключ не требуется; если перевод завершится с ошибкой, проект отправит оригинал.

Первый запуск

1. Подготовьте проект

  1. Поместите System.Data.SQLite.dll в папку ExternalAssemblies.
  2. Если планируете получать уведомления в Telegram, создайте бота через @BotFather и сохраните токен. Личный Chat ID можно узнать через @userinfobot.

2. Заполните настройки

ПеременнаяЧто указать
sources_fileПуть к файлу источников. Обязательный параметр.
telegram_bot_tokenТокен от BotFather. Нужен для отправки в Telegram.
telegram_chat_idChat ID получателя. Нужен для отправки в Telegram.
keywords_fileПуть к файлу ключевых слов, если используете отдельный файл.
stop_words_fileПуть к файлу стоп-слов, если используете отдельный файл.
dry_run1 - тестовый режим, 0 - рабочий. По умолчанию: 1.
max_age_hoursМаксимальный возраст публикации в часах. По умолчанию: 24.
discord_webhookURL вебхука, если нужна отправка в Discord.
notify_to_file1, если нужно сохранять результаты в файл.
auto_translateru, если нужен перевод на русский.
db_reset1 для очистки базы.

Если в настройках включено использование прокси, добавьте их в файл proxy.txt в папке проекта.

Для получения результатов настройте хотя бы один канал доставки: Telegram, Discord или файл. Если используете только Discord или файл, токен Telegram-бота и Chat ID не нужны.

3. Проверьте работу в тестовом режиме

Оставьте dry_run = 1 и запустите проект в один поток. Источники будут опрашиваться, а фильтры - работать как обычно. В логе можно посмотреть, какие публикации прошли отбор, какие были отклонены и почему.

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

По результатам запуска скорректируйте ключевые слова, стоп-слова и max_age_hours. Это проще сделать по реальным публикациям: сразу видно, каких слов не хватает и что даёт лишние совпадения.

4. Включите отправку и расписание

Когда результаты отбора вас устроят, установите dry_run = 0 и добавьте проект в расписание. Для начала можно выбрать запуск раз в 10-15 минут, затем скорректировать интервал под свои источники.

Технические детали

  • C# без браузерных инстансов. Сбор данных выполняется HTTP-запросами через ZennoPoster.HTTP.Request.
  • SQLite в режиме WAL. Предусмотрены повторные попытки при блокировках и автоматическая очистка базы.
  • Два способа разбора RSS. Основной парсер использует XmlDocument, резервный - регулярные выражения.
  • Модульная структура. Компоненты связаны через интерфейсы; обработчик выбирается по типу источника.
  • Чтение настроек с проверками. Отсутствующая переменная не приводит к падению кода.

Начать удобнее с одной темы и небольшого списка источников. Когда фильтры дают нужную выборку, можно подключать остальные подборки и расширять мониторинг.

Все важные переменные вынесены во входные параметры проекта:

1788702519247-png.143482

Спасибо за внимание!
 

Вложения

  • 1788702519247.png
    1788702519247.png
    24,2 KB · Просмотры: 7
  • SignalDesk.zip
    SignalDesk.zip
    192,2 KB · Просмотры: 1
Последнее редактирование:

Кто просматривает тему: (Всего: 2, Пользователи: 1, Гости: 1)