Перейти к содержанию

Отправка сообщений⚓︎

Для отправки сообщения боту необходимо знать chat_id чата (личный, групповой, канал).

Как получить chat_id?⚓︎

Личные чаты (на двоих, P2P)⚓︎

Для получения chat_id личного чата можно использовать метод bot.create_personal_chat(user_id) Если личный чат с пользователем ещё не создан, сервер создаст его. Если чат уже существует, сервер вернёт существующий chat_id.

chat = await bot.create_personal_chat(user_id="john_doe@video.example.com")

await bot.send_message(
    chat_id=chat.chat_id,
    text="Hello!",
)

Групповые чаты и каналы⚓︎

С групповыми чатами и каналами нужно быть осторожнее. Методы создания групповых чатов и каналов каждый раз создают новый чат:

chat = await bot.create_group_chat(title="Support")
channel = await bot.create_channel(title="News")

Если вызвать такой метод повторно с тем же названием, будет создан ещё один чат или канал с таким же title. Поэтому после создания группового чата или канала лучше сохранить его chat_id в базе данных, файле конфигурации или другом постоянном хранилище.

А что делать, если чат уже существует? Как получить chat_id?

Поиск существующего чата⚓︎

Список доступных чатов можно получить методом bot.get_chats():

response = await bot.get_chats(count=10, page=1)

Метод возвращает GetChatsResponse с параметром list в котором хранится список чатов. Вы можете найти нужный чат, например по названию, и получить его chat_id:

response = await bot.get_chats(count=100, page=1)

chat = next(
    (chat for chat in response.list if chat.title == "Support"),
    None,
)

if chat is not None:
    print(chat.chat_id)
response = await bot.get_chats(count=100, page=1)
chat = None

for item in response.list:
    if item.title == "Support":
        chat = item
        break

if chat is not None:
    print(chat.chat_id)

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

Получение chat_id через входящее сообщение⚓︎

Ещё один простой способ — написать сообщение в нужный чат и обработать его ботом. В обработчике можно вывести message.chat_id:

from trueconf import Router
from trueconf.types import Message

router = Router()


@router.message()
async def print_chat_id(message: Message):
    print(message.chat_id)

Этот способ удобен для групповых чатов и каналов: достаточно добавить бота в нужный чат, отправить сообщение и посмотреть chat_id в консоли.

Текстовые сообщения⚓︎

Для отправки текстового сообщения используйте метод bot.send_message(...):

await bot.send_message(
    chat_id="chat_id",
    text="Hello!",
)

Если сообщение отправляется из обработчика входящего сообщения, можно использовать shortcut-методы объекта Message, например message.answer(...) или message.reply(...). Они автоматически используют message.chat_id, поэтому его не нужно передавать вручную. Подробнее см. раздел Шорткаты.

Ответ на сообщение⚓︎

Если нужно отправить ответ на конкретное сообщение, передайте идентификатор исходного сообщения в параметр reply_message_id:

await bot.send_message(
    chat_id="chat_id",
    text="This is a reply",
    reply_message_id="message_id",
)

Такой способ позволяет отправлять обычные сообщения и ответы через единый API.

Пересылка сообщений⚓︎

Для пересылки уже существующего сообщения используйте bot.forward_message(...):

await bot.forward_message(
    chat_id="target_chat_id",
    message_id="source_message_id",
)

Где:

  • chat_id — идентификатор чата, куда нужно переслать сообщение;
  • message_id — идентификатор сообщения, которое нужно переслать.

Форматирование текста⚓︎

Сообщения можно отправлять как обычный текст, HTML или Markdown, передавая parse_mode:

from trueconf.enums import ParseMode

await bot.send_message(
    chat_id="chat_id",
    text="<b>Important</b>",
    parse_mode=ParseMode.HTML,
)

Для удобного построения форматированного текста в библиотеке есть модуль trueconf.utils.formatting. Он позволяет не писать HTML или Markdown вручную, а собирать сообщение из классов:

from trueconf.enums import ParseMode
from trueconf.utils.formatting import (
    Bold,
    Italic,
    Link,
    Mention,
    Text,
)

content = Text(
    Bold("Important"),
    " message for ",
    Mention("John Doe", user_id="john_doe@video.example.com"),
    "\n",
    Link("Open website", url="https://trueconf.com"),
)

await bot.send_message(
    chat_id="chat_id",
    text=content.as_html(),
    parse_mode=ParseMode.HTML,
)

Модуль поддерживает:

Ограничения длины сообщения⚓︎

TrueConf Server ограничивает длину текстового сообщения до 4096 символов.

Если сообщение превышает лимит, рекомендуется использовать helper-функцию safe_split_text(...), которая безопасно разбивает длинный текст с учётом HTML/Markdown-разметки:

from trueconf.utils import safe_split_text

chunks = safe_split_text(long_text)

for chunk in chunks:
    await bot.send_message(
        chat_id="chat_id",
        text=chunk,
        parse_mode=ParseMode.HTML,
    )

Подробнее об ограничениях см. в разделе Ограничения.

Shortcut-методы

В обработчиках сообщений часто удобнее использовать message.answer(...), message.reply(...) и другие shortcut-методы вместо прямого вызова bot.send_message(...). Подробнее см. раздел Шорткаты.

Отправка файлов

Этот раздел посвящён текстовым сообщениям. Для отправки документов, изображений, видео, голосовых сообщений и других вложений см. раздел Работа с файлами.