Следим за Telegram по-деловому

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Приветствую!
Сегодня будем писать бота для хранения истории личных сообщений

Безусловно, идея не уникальная: часть людей уже использует неофициальные клиенты, другая – юзерботов (например, на pyrogram)

Тогда что здесь?

Официальный бизнес-режим бота, не нарушающий TOS, работающий 24/7 и за который не сносят аккаунты (!)

Ближе к делу

Вот что мы получим по итогу
Вот что мы получим по итогу

Создание бота (Для новичков)

  1. Зайдите в бота @BotFather

  2. Напишите /newbot и как-нибудь обзовите бота, например "Уведомления"

  3. Придумайте ему @юзернейм, подходят только латинские буквы, цифры и нижнее подчеркивание, обязательно напишите "bot" в конце

  4. Бот готов – скопируйте и сохраните токен

  5. Настройте бота:

    1. Напишите /mybots и выберите своего бота

    2. Edit Bot -> Edit Botpic -> Отправьте аватарку для бота

    3. Back to Bot -> Bot Settings -> Business Mode -> Turn On

Написание бота

Стек: python 3.12, aiogram, redis, docker
(Ссылка на GitHub репозиторий внизу статьи)

Для начала придумываем файловую структуру, что-то типа:

.
├── main.py              # Запуск бота
├── pyproject.toml       # Управление зависимостями Poetry
├── Dockerfile           # Инструкции для сборки Docker образа
├── docker-compose.yml   # Конфигурация Docker контейнеров (бот + redis)
├── .env                 # Переменные окружения (токен, настройки)
└── src/
    ├── bot.py           # Основная логика бота, хендлеры
    ├── keyboards.py     # Клавиатуры и коллбэки
    └── settings.py      # Pydantic парсер .env файла

Теперь нужно установить библиотеки:

poetry add aiogram pydantic pydantic_settings loguru redis

pyproject.toml должен получится таким:

[tool.poetry]
name = "business-bot"
version = "0.1.0"
description = ""
authors = []
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"
aiogram = "^3.13.1"
loguru = "^0.7.2"
redis = "^5.2.0"
pydantic = "^2.9.2"
pydantic-settings = "^2.6.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Далее прописываем конфиг в settings.py, используя pydantic_settings, который парсит .env:

  • REDIS_HOST, REDIS_PORT, REDIS_PASSWORD по умолчанию устанавливаются в docker-compose.yml, но они нужны, если Вы будете запускать бота вне контейнера, используя локальный/облачный редис

from typing import Optional

from pydantic import SecretStr
from pydantic_settings import BaseSettings, SettingsConfigDict


class Environment(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")


class Redis(Environment):
    REDIS_HOST: str = "localhost"
    REDIS_PORT: int = 6379
    REDIS_PASSWORD: Optional[SecretStr] = None


class Bot(Environment):
    TOKEN: SecretStr = SecretStr("7285627548:FaGPjgAJFU8G524HE38hubGrgTcQcrpmbyc")


class Settings(Bot, Redis):
    USER_ID: int = 0


settings = Settings()

И соответственно настраиваем .env файл:

  • Токен бота ранее доставали из Bot Father

  • Свой ID можно получить с помощью @getmyid_bot

TOKEN="7285627548:FaGPjgAJFU8G524HE38hubGrgTcQcrpmbyc"
USER_ID=123456789

Прописываем переменные проекта в bot.py:

from aiogram import Bot, Dispatcher
from redis.asyncio import Redis

from .settings import settings

bot = Bot(token=settings.TOKEN.get_secret_value())
dp = Dispatcher()

redis = Redis(
    host=settings.REDIS_HOST,
    port=settings.REDIS_PORT,
    password=(
        settings.REDIS_PASSWORD.get_secret_value() 
        if settings.REDIS_PASSWORD else None
    ),
)

и используем их в main.py для запуска:

from loguru import logger
from src.bot import dp, bot

if __name__ == "__main__":
    logger.info("Starting...")
    dp.run_polling(
        bot,
        allowed_updates=[
            "callback_query",
            "business_message",
            "edited_business_message",
            "deleted_business_messages",
        ],
    )

Важно! aiogram по умолчанию слушает только следующие хэндлеры: message, callback_query, errors. Остальные он автоматически не парсит и их нужно добавлять вручную через allowed_updates.

В файле bot.py сохраняем все новые сообщения в Redis с авто-удалением через 3 недели:

EX_TIME = 60 * 60 * 24 * 21


async def set_message(message: types.Message):
    await redis.set(
        f"{message.chat.id}:{message.message_id}",
        message.model_dump_json(),
        ex=EX_TIME,
    )


@dp.business_message()
async def message(message: types.Message):
    await set_message(message)

Теперь нужно как-то красиво сообщать об изменении статуса сообщений. Лучшим вариантом я считаю добавление inline клавиатуры, так не будет редактироваться исходное сообщение.
Первой кнопкой будет статус сообщения – ✏️ или

Источник: https://habr.com/ru/articles/870868/


Интересные статьи

Интересные статьи

Привет, Хабр! С вами снова Иван Клюев, и напомню — я занимаюсь организацией и продвижением хакатонов в РФ с 2018 года (наш сайт Хакатоны.рус). В ноябре мы участвовали в организации необычного во всех ...
Создадим прототип SPA в Bitrix без использования популярных JS фреймворков и библиотек, все будет сделано средставами Bitrix.И самое главное без потери серверного рендеринга и SEO страниц.ПогналиВсего...
Добавляем функционал быстрых ответов на любом тарифе Битрикс24Как добавить одну из самых полезных функций для чатов открытых линий для любого коммерческого тарифа? Все очень просто, нужно лишь..... ...
Всем привет. Текст состоит из двух частей:1. Небольшая шпаргалка по параметрам настроек по умолчанию;2. Текст о том, почему вообще существование такой шпаргалки может кому-то понадобится.
Зимой 2012-го коллега предложил мне, С++ программисту с пятилетним стажем, написать первое приложение под Android. Ещё через год я начал руководить небольшой командой мобильных разработчиков, и с...