Как написать текст сообщения для Телеграм чат бота, чтобы его синтаксис распознавался мессенджером и размечался в соответствии с ним?

Мне нужно в одном сообщении дать текст и маркдаун-таблицу. Всё бы ничего, но это должен делать Телеграм чат бот.

Имеется в виду, что бот в качестве реакции на определенные команды или клавиши инлайн клавиатуры должен отправлять в соответствующий чат текстовое сообщение, содержащее маркдаун-таблицу. И текст, и таблица всякий раз одни и те же.

Когда я сам, как пользователь, ввожу в интерфейс Телеграм текст сообщения с таблицей, окружённой ``` с обеих сторон, всё выглядит красиво, мессенджер распознаёт и отображает маркдаун. Однако, передавая это же сообщение при помощи await bot.send_message(message.chat.id, text_with_markdown_table), я раз за разом наблюдаю, как вместо ожидаемой "красоты" в чат приходит обычный неотформатированный текст.

Пробовал оставлять в сообщении только таблицу в окружении ``` - не помогло.

Как пофиксить?


Ответы (2 шт):

Автор решения: GxdTxnz

Не совсем понятна логика работы бота, но постараюсь ответить. Если необходимо вывести просто фиксированную таблицу, то это можно реализовать вот таким образом:

import telebot

TOKEN = ' '

bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['table'])
def send_table(message):
    text_with_markdown_table = """
    ```
    | Заголовок 1 | Заголовок 2 |
    |-------------|-------------|
    | Строка 1    | Строка 1    |
    | Строка 2    | Строка 2    |
    ```
    """
    bot.send_message(message.chat.id, text_with_markdown_table, parse_mode='Markdown')

bot.polling()

Если надо реализовать динамическую таблицу, с указанием количества строк и столбцов, то:

import telebot

TOKEN = ' '

bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['table'])
def send_table(message):
    try:
        _, rows, cols = message.text.split()
        rows = int(rows)
        cols = int(cols)
    except ValueError:
        bot.send_message(message.chat.id, "Некорректный формат команды. Используйте /table <количество строк> <количество столбцов>")
        return
    except Exception as e:
        bot.send_message(message.chat.id, f"Ошибка: {e}")
        return

    headers = "|"
    col_widths = [10] * cols  # Начальная ширина столбцов
    for j in range(cols):
        headers += f" Заголовок {j+1} |"
    headers += "\n"

    # Разделительная строка
    separator = "|"
    for width in col_widths:
        separator += "-" * (width + 2) + "|"
    separator += "\n"

    table_text = "Таблица:\n```\n"
    table_text += headers
    table_text += separator

    for i in range(1, rows + 1):
        table_text += "|"
        for j in range(cols):
            cell_content = f" Строка {i} ".strip()
            col_widths[j] = max(col_widths[j], len(cell_content))  # Обновляем ширину столбца
            table_text += f" {cell_content.ljust(col_widths[j])} |"
        table_text += "\n"

    table_text += "```"

    bot.send_message(message.chat.id, table_text, parse_mode='Markdown')

bot.polling()
→ Ссылка
Автор решения: Георгий

Укажите parse_mode: await bot.send_message(message.chat.id, text_with_markdown_table, parse_mode='MarkdownV2')

→ Ссылка