- Регистрация
- 16.08.2016
- Сообщения
- 338
- Реакции
- 133
- Баллы
- 43
На этот конкурс я решил представить инструмент, которым сам активно пользуюсь каждый день.
Этот проект нужен для того, чтобы автоматически следить за большим количеством источников информации и не тратить время на ручной просмотр сайтов, Telegram-каналов, Reddit, YouTube, GitHub и других площадок, при этом находясь в курсе всего, что тебя интересует.
Изначально для этого приходилось вручную проверять Telegram-каналы, сайты, и со временем стало понятно, что такой способ отнимает много времени - часть материалов повторяется или попросту теряется в общем потоке информации.
Так появился SignalDesk, который круглосуточно собирает публикации из разных источников, анализирует их с помощью заданных фильтров и отправляет только подходящие материалы, отсекая весь мусор,
помогает держать руку на пульсе без постоянного переключения между десятками и сотнями источников - собирает, сортирует и доставляет нужную информацию туда, где вам удобнее её получать.
Например, можно настроить проект на новости про нейросети, криптовалюты, SEO или технологии.
Что умеет проект
| Возможность | Что делает |
|---|---|
| Сбор публикаций | Опрашивает источники HTTP-запросами, без запуска браузера. |
| Фильтрация | Отбирает публикации по ключевым словам, стоп-словам и дате. |
| Проверка повторов | Учитывает уже обработанные записи, чтобы не отправлять их повторно. |
| Уведомления | Отправляет результаты в Telegram, Discord и файл. Каналы можно комбинировать. |
| Тестовый режим | Показывает результаты в логе без отправки уведомлений и записи в базу. |
| База SQLite | Хранит обработанные записи и статистику, поддерживает авто-очистку. |
Какие источники можно подключить
В проекте предусмотрены восемь типов источников:
| Источник | Что можно отслеживать | Как устроен сбор |
|---|---|---|
| RSS / Atom | Новости сайтов и блогов | XML-парсер с резервным разбором через регулярные выражения. |
| Telegram | Публичные каналы | Чтение веб-версии канала без авторизации. |
| Публикации в сабреддитах | Получение записей в формате 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. Для комментариев используйте строки, начинающиеся с #: так удобно разделять источники по темам.Как работают фильтры
Каждая публикация проходит три проверки:
- Свежесть. Если запись старше значения
max_age_hours, она отбрасывается. Например, при значении24остаются публикации за последние сутки. - Стоп-слова. Запись отклоняется, если в ней есть слово или фраза из списка исключений.
- Ключевые слова. Публикация проходит отбор, если содержит слово или фразу из заданного списка.
| Параметр | Назначение | Пример |
|---|---|---|
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 | Личные уведомления. |
| Discord | URL вебхука | Общий канал для команды. |
| Файл | notify_to_file = 1 | Архив, ручной разбор и дальнейшая обработка. |
Пример сообщения:
Код:
📰 Заголовок новости
Описание или первые строки публикации...
🏷 Категория
✍️ Автор
📡 Источник
🔗 Ссылка
Готовые подборки источников
Чтобы не собирать список с нуля, можно взять одну из тематических подборок.
| Тема | Файл источников | Количество |
|---|---|---|
| ИИ и нейросети | sources_ai.txt | 85+ |
| Криптовалюты | sources_crypto.txt | 90+ |
| ИТ и технологии | sources_tech.txt | 40+ |
| Наука | sources_science.txt | 35+ |
| SEO и маркетинг | sources_marketing_seo.txt | 30+ |
| Игры | sources_gaming.txt | 25+ |
| Дизайн и искусство | sources_design_art.txt | 25+ |
| Бизнес и финансы | sources_business.txt | 30+ |
| Здоровье | sources_health_fitness.txt | 25+ |
| Развлечения | sources_entertainment.txt | 25+ |
| Мировые новости | sources_world_news.txt | 25+ |
| ИИ на русском | sources_ai_ru.txt | 15+ |
| Криптовалюты на русском | sources_crypto_ru.txt | 15+ |
| Новости и технологии на русском | sources_news_ru.txt | 25+ |
Для части тем также есть готовые списки ключевых слов:
| Тема | Файл ключевых слов |
|---|---|
| ИИ, включая русскоязычную подборку | 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. Подготовьте проект
- Поместите
System.Data.SQLite.dllв папкуExternalAssemblies. - Если планируете получать уведомления в Telegram, создайте бота через
@BotFatherи сохраните токен. Личный Chat ID можно узнать через@userinfobot.
2. Заполните настройки
| Переменная | Что указать |
|---|---|
sources_file | Путь к файлу источников. Обязательный параметр. |
telegram_bot_token | Токен от BotFather. Нужен для отправки в Telegram. |
telegram_chat_id | Chat ID получателя. Нужен для отправки в Telegram. |
keywords_file | Путь к файлу ключевых слов, если используете отдельный файл. |
stop_words_file | Путь к файлу стоп-слов, если используете отдельный файл. |
dry_run | 1 - тестовый режим, 0 - рабочий. По умолчанию: 1. |
max_age_hours | Максимальный возраст публикации в часах. По умолчанию: 24. |
discord_webhook | URL вебхука, если нужна отправка в Discord. |
notify_to_file | 1, если нужно сохранять результаты в файл. |
auto_translate | ru, если нужен перевод на русский. |
db_reset | 1 для очистки базы. |
Если в настройках включено использование прокси, добавьте их в файл
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, резервный - регулярные выражения. - Модульная структура. Компоненты связаны через интерфейсы; обработчик выбирается по типу источника.
- Чтение настроек с проверками. Отсутствующая переменная не приводит к падению кода.
Начать удобнее с одной темы и небольшого списка источников. Когда фильтры дают нужную выборку, можно подключать остальные подборки и расширять мониторинг.
Все важные переменные вынесены во входные параметры проекта:
Спасибо за внимание!
Вложения
Последнее редактирование:


