Метод editMessageReplyMarkup

Метод для редактирования только разметки ответа (reply markup) у сообщений, включая бизнес-сообщения и инлайн-сообщения.

Описание

Используйте этот метод для редактирования только разметки ответа сообщений. При успешном выполнении, если редактируемое сообщение не является инлайн-сообщением, возвращается отредактированное Message, в противном случае возвращается True. Обратите внимание, что бизнес-сообщения, которые не были отправлены ботом и не содержат инлайн-клавиатуру, могут быть отредактированы только в течение 48 часов с момента отправки.

Параметр Тип Обязательный Описание
business_connection_id String Опционально Уникальный идентификатор бизнес-подключения, от имени которого было отправлено редактируемое сообщение
chat_id Integer или String Опционально Обязателен, если не указан inline_message_id. Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername)
message_id Integer Опционально Обязателен, если не указан inline_message_id. Идентификатор редактируемого сообщения
inline_message_id String Опционально Обязателен, если не указаны chat_id и message_id. Идентификатор инлайн-сообщения
reply_markup InlineKeyboardMarkup Опционально JSON-сериализуемый объект для инлайн-клавиатуры.

Примеры

php

<?php

$botToken = 'YOUR_BOT_TOKEN';
$apiUrl = "https://api.telegram.org/bot{$botToken}/editMessageReplyMarkup";

// Пример 1: Изменение reply markup обычного сообщения
$data1 = [
    'chat_id' => 123456789, // ID чата
    'message_id' => 42, // ID сообщения
    'reply_markup' => json_encode([
        'inline_keyboard' => [
            [
                ['text' => 'Новая кнопка 1', 'callback_data' => 'action_1'],
                ['text' => 'Новая кнопка 2', 'callback_data' => 'action_2']
            ],
            [
                ['text' => 'Кнопка 3', 'callback_data' => 'action_3']
            ]
        ]
    ])
];

// Пример 2: Изменение reply markup inline сообщения
$data2 = [
    'inline_message_id' => '1234567890abcdef', // ID inline сообщения
    'reply_markup' => json_encode([
        'inline_keyboard' => [
            [
                ['text' => 'Обновленная inline кнопка', 'callback_data' => 'updated_action']
            ]
        ]
    ])
];

// Пример 3: С бизнес-соединением
$data3 = [
    'business_connection_id' => 'business_conn_123',
    'chat_id' => 123456789,
    'message_id' => 42,
    'reply_markup' => json_encode([
        'inline_keyboard' => [
            [
                ['text' => 'Бизнес кнопка', 'callback_data' => 'business_action']
            ]
        ]
    ])
];

// Функция для отправки запроса
function editMessageReplyMarkup($data) {
    global $apiUrl;
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return json_decode($response, true);
}

// Использование примеров
// $result1 = editMessageReplyMarkup($data1);
// $result2 = editMessageReplyMarkup($data2);
// $result3 = editMessageReplyMarkup($data3);

// Альтернативный вариант с использованием file_get_contents
function editMessageReplyMarkupAlt($data) {
    global $apiUrl;
    
    $options = [
        'http' => [
            'header' => "Content-type: application/x-www-form-urlencoded\r\n",
            'method' => 'POST',
            'content' => http_build_query($data)
        ]
    ];
    
    $context = stream_context_create($options);
    $response = file_get_contents($apiUrl, false, $context);
    
    return json_decode($response, true);
}

// Пример с удалением клавиатуры (пустой reply_markup)
$dataRemove = [
    'chat_id' => 123456789,
    'message_id' => 42,
    'reply_markup' => json_encode(['inline_keyboard' => []]) // Пустой массив удаляет клавиатуру
];

?>

python

import requests

def edit_message_reply_markup(
    token: str,
    chat_id: int = None,
    message_id: int = None,
    inline_message_id: str = None,
    reply_markup: dict = None,
    business_connection_id: str = None
):
    """
    Редактирует только разметку клавиатуры сообщения.
    
    Args:
        token: Токен бота
        chat_id: ID чата (обязателен, если не указан inline_message_id)
        message_id: ID сообщения (обязателен, если не указан inline_message_id)
        inline_message_id: ID inline-сообщения (обязателен, если не указаны chat_id и message_id)
        reply_markup: Новая inline-клавиатура в формате InlineKeyboardMarkup
        business_connection_id: ID бизнес-соединения (для бизнес-сообщений)
    
    Returns:
        Объект Message или True в зависимости от типа сообщения
    """
    url = f"https://api.telegram.org/bot{token}/editMessageReplyMarkup"
    
    params = {}
    
    if business_connection_id:
        params['business_connection_id'] = business_connection_id
    
    if inline_message_id:
        params['inline_message_id'] = inline_message_id
    elif chat_id and message_id:
        params['chat_id'] = chat_id
        params['message_id'] = message_id
    else:
        raise ValueError("Необходимо указать либо inline_message_id, либо chat_id и message_id")
    
    if reply_markup:
        params['reply_markup'] = reply_markup
    
    response = requests.post(url, json=params)
    return response.json()

# Пример использования 1: Редактирование клавиатуры обычного сообщения
def example_edit_regular_message():
    TOKEN = "YOUR_BOT_TOKEN"
    CHAT_ID = 123456789
    MESSAGE_ID = 42
    
    # Новая inline-клавиатура
    new_keyboard = {
        "inline_keyboard": [
            [
                {"text": "Новая кнопка 1", "callback_data": "new_button_1"},
                {"text": "Новая кнопка 2", "callback_data": "new_button_2"}
            ],
            [
                {"text": "Удалить клавиатуру", "callback_data": "remove_keyboard"}
            ]
        ]
    }
    
    result = edit_message_reply_markup(
        token=TOKEN,
        chat_id=CHAT_ID,
        message_id=MESSAGE_ID,
        reply_markup=new_keyboard
    )
    
    print(f"Результат: {result}")

# Пример использования 2: Редактирование клавиатуры inline-сообщения
def example_edit_inline_message():
    TOKEN = "YOUR_BOT_TOKEN"
    INLINE_MESSAGE_ID = "1234567890abcdef"
    
    # Удаление клавиатуры (пустая клавиатура)
    empty_keyboard = {
        "inline_keyboard": []
    }
    
    result = edit_message_reply_markup(
        token=TOKEN,
        inline_message_id=INLINE_MESSAGE_ID,
        reply_markup=empty_keyboard
    )
    
    print(f"Результат: {result}")

# Пример использования 3: Редактирование бизнес-сообщения
def example_edit_business_message():
    TOKEN = "YOUR_BOT_TOKEN"
    CHAT_ID = 123456789
    MESSAGE_ID = 42
    BUSINESS_CONNECTION_ID = "business_connection_123"
    
    # Новая клавиатура с одной кнопкой
    simple_keyboard = {
        "inline_keyboard": [
            [
                {"text": "Подтвердить", "callback_data": "confirm"}
            ]
        ]
    }
    
    result = edit_message_reply_markup(
        token=TOKEN,
        chat_id=CHAT_ID,
        message_id=MESSAGE_ID,
        business_connection_id=BUSINESS_CONNECTION_ID,
        reply_markup=simple_keyboard
    )
    
    print(f"Результат: {result}")

# Пример использования с библиотекой python-telegram-bot
def example_with_ptb():
    from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
    from telegram.ext import Application
    
    async def edit_reply_markup_example(update: Update, context):
        # Получаем ID сообщения для редактирования
        message = update.effective_message
        
        # Создаем новую клавиатуру
        keyboard = [
            [InlineKeyboardButton("Обновленная кнопка 1", callback_data="updated_1")],
            [InlineKeyboardButton("Обновленная кнопка 2", callback_data="updated_2")]
        ]
        reply_markup = InlineKeyboardMarkup(keyboard)
        
        # Редактируем клавиатуру сообщения
        await context.bot.edit_message_reply_markup(
            chat_id=message.chat_id,
            message_id=message.message_id,
            reply_markup=reply_markup
        )
    
    # Инициализация бота
    application = Application.builder().token("YOUR_BOT_TOKEN").build()
    # ... добавление обработчиков и запуск бота

История изменений

  • API 2.0. Добавлен метод editMessageReplyMarkup
  • API 4.3. Обновлен метод editMessageReplyMarkup: Боты с правом can_edit_messages могут редактировать сообщения других администраторов без ограничения в 48 часов
  • API 7.5. Обновлен метод editMessageReplyMarkup: Добавлен параметр business_connection_id

Дополнительно

  • Message - Это основной объект, представляющий сообщение в Telegram, который содержит информацию об отправителе, чате, контенте (текст, медиа, служебные данные) и различные метаданные.
  • InlineKeyboardMarkup - Объект для создания встроенной клавиатуры, которая отображается непосредственно в сообщении.
Комментарии