Бот написан Ruby On Rails с учетом best practices и SOLID принципов.
Этот бот принимает от пользователя набор телеграм каналов, которые пользователю интересны. Следит за ними, и выдает пользователю ТОЛЬКО важную информацию из каналов. Без рекламы. Без шелухи.
Полный список функциональных возможностей доступен в документации.
Таким образом:
- Пользователь получает контент без шелухи.
- Создается социальная сеть через которую продвигаются интересные каналы на схожую тематику.
Все переменные окружения имеют префикс NO_FLUFF_.
| Переменная | Описание | Обязательная | Пример |
|---|---|---|---|
NO_FLUFF_TELEGRAM_BOT_TOKEN |
API токен Telegram бота от @BotFather | ✅ | 1234567890:ABCdefGHIjklMNOpqrsTUVwxyz |
NO_FLUFF_TELEGRAM_BOT_USERNAME |
Username бота (без @) | ✅ | bez_sheluhi_bot |
| Переменная | Описание | Обязательная | Пример |
|---|---|---|---|
NO_FLUFF_OPENAI_API_KEY |
API ключ OpenAI | ❌ | sk-... |
NO_FLUFF_DEEPSEEK_API_KEY |
API ключ DeepSeek | ❌* | sk-... |
NO_FLUFF_LLM_DEFAULT_MODEL |
Модель по умолчанию для LLM | ❌ | deepseek-chat (по умолчанию) |
*Требуется хотя бы один из AI провайдеров (OpenAI или DeepSeek)
Настройки количества процессов для разных типов очередей. Подробнее в документации по фоновым задачам.
| Переменная | Описание | По умолчанию |
|---|---|---|
REALTIME_CONCURRENCY |
Количество процессов для срочных задач (realtime очередь) | 2 |
DIGEST_CONCURRENCY |
Количество процессов для дайджестов (digest, default очереди) | 3 |
CONTENT_CONCURRENCY |
Количество процессов для обработки контента (content, channels очереди) | 2 |
BACKGROUND_CONCURRENCY |
Количество процессов для фоновых задач (ai, low_priority очереди) | 1 |
| Переменная | Описание | Обязательная | Пример |
|---|---|---|---|
TELEGRAM_API_ID |
API ID приложения от my.telegram.org | ✅ | 12345678 |
TELEGRAM_API_HASH |
API Hash приложения от my.telegram.org | ✅ abcdef1234567890abcdef1234567890abcdef12345678 |
|
SESSION_ENCRYPTION_KEY |
Ключ для шифрования Telegram сессий (32 hex символа) | ✅ | 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2 |
- Зайти на my.telegram.org
- Войти с вашим Telegram аккаунтом
- Создать новое приложение (нажмите "Create new application")
- Выбрать тип "Bot"
- Заполнить форму:
- App title: "Без Шелухи Follower User Bot"
- Short name:
bez_sheluhi_follower - Description: "Follower user for Без Шелухи bot channel monitoring"
- Получить
api_id(цифры) иapi_hash(символы) - Добавить в
.env.localфайл
# Способ 1: OpenSSL (рекомендуется)
openssl rand -hex 32
# Результат: 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2
# Способ 2: Rails консоль
rails console
irb> require 'securerandom'
irb> SecureRandom.hex(32)
# Результат: 9f8e7d6c5b4a3210fedcba9876543210fedcba9876543210Важно: Используйте уникальный ключ для каждого environment (development, staging, production).
Система позволяет автоматически вступать в Telegram каналы через follower users (пользователей-ботов).
# Через Rails консоль
follower_user = FollowerUser.create!(
phone_number: "+1234567890"
)
# Через rake task
rails follower_users:create[+1234567890]# Инициировать отправку verification code
result = follower_user.start_authorization!
# => { success: true, phone_code_hash: "abc123..." }
# Статус авторизации
status = follower_user.authorization_status
# => { in_progress: true, expires_at: 2025-01-31 12:30:00, phone_code_hash: "abc123..." }# Ввести код из Telegram приложения
result = follower_user.confirm_authorization!("12345")
# => { success: true, user: #<FollowerUser id: 1 auth_status: :authorized> }
# После успешной авторизации:
# - Статус меняется на :authorized
# - Сессия сохраняется в зашифрованном виде
# - Пользователь автоматически назначается на доступные каналы# Проверить статус
follower_user.authorized? # => true
follower_user.can_join_channel? # => true
# Отозвать авторизацию
follower_user.revoke_authorization!
# => true (удаляет сессию и назначение с каналов)
# Получить статистику
FollowerUser.authorized.count # => 1
FollowerUser.next_available # => #<FollowerUser ...>- API credentials шифруются через Rails
encrypts - Session данные хранятся в зашифрованном виде
- Phone numbers уникальны и индексированы
- Rate limiting через ApplicationConfig
| Параметр | Описание | По умолчанию |
|---|---|---|
daily_joins_limit |
Максимум вступлений в день | 50 |
max_channels |
Максимум каналов на пользователя | 400 |
health_score |
Оценка состояния пользователя | 100.0 |
workload_score |
Загруженность пользователя | 0.0 |
# Создать нового пользователя
user = FollowerUser.create!(phone_number: "+1234567890")
# Начать авторизацию
auth_result = user.start_authorization!
puts "Enter code: #{auth_result[:phone_code_hash]}"
# Подтвердить (для демо)
user.confirm_authorization!("12345")
# Проверить каналы пользователя
user.channels.count # => 0 (назначаются автоматически)
# Создать тестовый канал и назначить
channel = Channel.create!(telegram_id: 12345, username: "test_channel")
channel.assign_to_follower_user(user)Примечание: Для демонстрации можно использовать код 12345 или любой 6-значный номер.
| Переменная | Описание | Обязательная | Пример |
|---|---|---|---|
DATABASE_URL |
URL подключения к PostgreSQL | ✅ | postgresql://user:pass@localhost/nofluff |
RAILS_ENV |
Окружение Rails | ❌ | production |