Telegram-бот для анализа объективности новостей с помощью AI. Оценивает правдивость, объективность и конструктивность каждого материала, выявляет пропагандистские техники и присылает ежедневную сводку качественных новостей.
🌐 Лендинг: https://bossincrypto.github.io/news-objectivity-bot/ 📦 Репозиторий: https://github.com/BOSSincrypto/news-objectivity-bot
Каждая новость анализируется по трём независимым осям (шкала 1-10):
| Ось | Что измеряет | 9-10 | 5-6 | 1-2 |
|---|---|---|---|---|
| Truth (Правдивость) | Фактическая точность и верифицируемость | Безупречно точно, первоисточники | Смешанная точность | Дезинформация |
| Objectivity (Объективность) | Отделение фактов от мнений, нейтральность | Строго факты | Мнение без маркировки | Пропаганда |
| Constructiveness (Конструктивность) | Ориентация на решения | Фокус на решениях | Нейтрально | Негатив ради негатива |
Источники классифицируются по системе FIMI (Foreign Information Manipulation and Interference, рамка ЕС):
| Классификация | Описание | В карантине? |
|---|---|---|
🟢 INDEPENDENT_EXILE |
Независимые СМИ в изгнании (золотой стандарт) | Нет |
🟢 INDEPENDENT |
Международные независимые СМИ | Нет |
🟡 PRIVATE |
Частные СМИ (могут быть под давлением) | Нет |
🔴 STATE_CONTROLLED |
Государственные СМИ | Да (исключены из сводки) |
Источники класса STATE_CONTROLLED автоматически исключаются из ежедневной сводки, но остаются доступны для ручного анализа.
Бот выявляет 12 техник манипуляции, основанных на таксономии SemEval-2020/2023:
loaded_language— эмоционально окрашенная лексикаwhataboutism— вот-эбаутизмappeal_to_fear— апелляция к страхуfalse_dilemma— ложная дилеммаad_hominem— переход на личностиfalse_balance— ложный балансdelegitimization— делегитимизацияvictimhood_framing— позиционирование жертвыappeal_to_authority— апелляция к авторитетуconspiracy_theory— конспирологияcherry_picking— выборочное цитированиеstraw_man— подмена тезиса
В ежедневную сводку попадают только новости, набравшие минимум 7 баллов по всем трём осям (Truth >= 7, Objectivity >= 7, Constructiveness >= 7). Это гарантирует высокое качество отобранных материалов и отсеивает пропаганду.
| Команда | Описание |
|---|---|
/start |
Начать работу с ботом, приветственное сообщение |
/help |
Справка по командам |
/digest |
Получить сводку новостей за последние 24 часа |
/sources |
Список отслеживаемых источников с FIMI-классификацией |
/subscribe |
Подписаться на ежедневную сводку (09:00 UTC) |
/unsubscribe |
Отписаться от ежедневной сводки |
/rating_guide |
Объяснение трёхосевой системы рейтингов |
/health |
Проверить доступность RSS-источников |
Также можно отправить боту ссылку на статью, текст новости (от 100 символов) или пересланное сообщение из Telegram-канала для анализа.
| Источник | Описание |
|---|---|
| Meduza | Ведущее независимое издание (Латвия) |
| Новая газета Европа | Нобелевская премия мира, расследовательская журналистика |
| The Moscow Times | Независимое англо-русское издание |
| Источник | Описание |
|---|---|
| BBC Русская служба | Международные новости от BBC |
| DW (Deutsche Welle) | Немецкое международное вещание |
| Источник | Описание |
|---|---|
| Коммерсантъ | Ведущая частная деловая газета |
| РБК | Крупная бизнес-медиагруппа |
| Интерфакс | Крупнейшее негосударственное информагентство |
| Ведомости | Деловая газета |
| Источник | Описание |
|---|---|
| ТАСС | Государственное информационное агентство России |
| РИА Новости | Государственное информационное агентство |
| Известия | Проправительственная ежедневная газета |
| Российская газета | Официальная правительственная газета |
Всего отслеживается 14 источников. Источники в карантине доступны для ручного анализа, но автоматически исключены из ежедневной сводки.
- Python 3.12+
- Poetry
- Telegram Bot Token (через @BotFather)
- OpenRouter API Key (через openrouter.ai)
git clone https://github.com/BOSSincrypto/news-objectivity-bot.git
cd news-objectivity-bot
poetry install
cp .env.example .envЗапуск:
poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000docker build -t news-objectivity-bot .
docker run -p 8000:8000 --env-file .env news-objectivity-bot| Переменная | Описание | Значение по умолчанию |
|---|---|---|
TELEGRAM_BOT_TOKEN |
Токен Telegram-бота (от @BotFather) | (обязательно) |
OPENROUTER_API_KEY |
API-ключ OpenRouter для AI-анализа | (обязательно) |
OPENROUTER_MODEL |
Модель OpenRouter для анализа новостей | google/gemini-2.5-flash |
OPENROUTER_BASE_URL |
Базовый URL API OpenRouter | https://openrouter.ai/api/v1 |
Пример файла .env:
TELEGRAM_BOT_TOKEN=123456789:your_telegram_bot_token
OPENROUTER_API_KEY=sk-or-your_openrouter_api_key
OPENROUTER_MODEL=google/gemini-2.5-flashСтатический лендинг находится в папке docs/ и деплоится на GitHub Pages через
GitHub Actions (workflow .github/workflows/deploy-pages.yml).
- Live URL: https://bossincrypto.github.io/news-objectivity-bot/
- Деплой запускается автоматически при пуше в
main, если изменились файлы вdocs/или сам workflow.
Бот настроен для деплоя на Render через render.yaml:
- Создайте новый Web Service на Render
- Подключите репозиторий
BOSSincrypto/news-objectivity-bot - Render автоматически обнаружит
render.yaml(runtime: Docker) - Добавьте переменные окружения:
TELEGRAM_BOT_TOKENOPENROUTER_API_KEY
- Деплой запустится автоматически
Health check endpoint: /healthz.
| Endpoint | Метод | Описание |
|---|---|---|
/healthz |
GET | Проверка состояния сервиса |
/sources |
GET | Список всех источников с FIMI-классификацией |
/feed-health |
GET | Статус доступности RSS-лент |
Пример ответа /healthz:
{
"status": "ok",
"telegram_configured": true,
"ai_configured": true,
"subscribers_count": 42,
"sources_count": 14
}Поле ai_configured отражает наличие OPENROUTER_API_KEY.
news-objectivity-bot/
├── app/ # Бот (FastAPI + Telegram)
│ ├── main.py # FastAPI приложение, Telegram handlers, планировщик
│ ├── config.py # Конфигурация, источники, FIMI-классификация, промпты
│ ├── ai_analyzer.py # AI-анализ через OpenRouter (openai SDK)
│ └── rss_parser.py # Парсинг RSS-лент
├── docs/ # Статический лендинг (GitHub Pages)
│ ├── index.html # Двуязычная страница (RU/EN)
│ ├── styles.css # Современная тёмная адаптивная тема
│ └── script.js # Интерактивность, переключатель языка
├── .github/workflows/
│ └── deploy-pages.yml # CI: деплой docs/ на GitHub Pages
├── Dockerfile # Docker-образ бота
├── render.yaml # Конфигурация деплоя на Render
├── pyproject.toml # Зависимости Poetry
├── .env.example # Пример переменных окружения
└── .gitignore
main.py — точка входа:
- FastAPI сервер с CORS middleware
- Telegram bot handlers для всех команд
- Планировщик ежедневной сводки через APScheduler (09:00 UTC)
- Rate limiting (10 запросов/час на пользователя)
ai_analyzer.py — AI-анализ:
- Интеграция с OpenRouter через
openaiSDK (AsyncOpenAI) - Заголовки
HTTP-RefererиX-Title(рекомендация OpenRouter) - Трёхосевая система рейтингов + обнаружение пропаганды
- Fallback-результат при отказе анализа
rss_parser.py — работа с RSS:
- Асинхронный парсинг всех 14 источников
- Фильтрация по времени публикации
- Проверка здоровья лент
config.py — конфигурация:
- Список источников с FIMI-классификацией
- Промпты для анализа и генерации сводки
- Пороговые значения (7/7/7)
- Таксономия пропагандистских техник
| Технология | Назначение |
|---|---|
| Python 3.12 | Основной язык |
| FastAPI | Веб-фреймворк, REST API |
| python-telegram-bot | Telegram Bot API |
| OpenRouter | AI-провайдер (модель google/gemini-2.5-flash по умолчанию) |
| openai SDK | Клиент для OpenRouter (OpenAI-совместимый API) |
| feedparser | Парсинг RSS-лент |
| APScheduler | Планировщик ежедневной сводки |
| httpx | Асинхронный HTTP-клиент |
News Objectivity Bot is a Telegram bot that analyzes the objectivity of news articles using AI. It evaluates each article on three independent axes (Truth, Objectivity, Constructiveness), detects propaganda techniques, and sends a daily digest of high-quality news.
- Three-axis rating system — every news item gets a 1-10 score on Truth (factual accuracy), Objectivity (fact vs opinion separation), and Constructiveness (solution orientation).
- FIMI source classification — sources are classified as independent exile, independent, private, or state-controlled, following the EU's Foreign Information Manipulation and Interference framework.
- Propaganda detection — 12 manipulation techniques are detected, including loaded language, whataboutism, ad hominem, and more.
- 7/7/7 rule — only news scoring at least 7 on all three axes makes it into the daily digest. State-controlled sources are quarantined from the digest.
| Command | Description |
|---|---|
/start |
Start the bot |
/help |
Command reference |
/digest |
Get the last 24-hour digest |
/sources |
List tracked sources with FIMI classification |
/subscribe |
Subscribe to the daily digest (09:00 UTC) |
/unsubscribe |
Unsubscribe from the digest |
/rating_guide |
Explain the rating system |
/health |
Check RSS feed availability |
git clone https://github.com/BOSSincrypto/news-objectivity-bot.git
cd news-objectivity-bot
poetry install
cp .env.example .env # add your tokens
poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000Or with Docker:
docker build -t news-objectivity-bot .
docker run -p 8000:8000 --env-file .env news-objectivity-botRequired environment variables: TELEGRAM_BOT_TOKEN, OPENROUTER_API_KEY,
OPENROUTER_MODEL (default: google/gemini-2.5-flash).
MIT License. See the LICENSE file for details.