Как можно отправить два разных сообщения с клавиатурами в Telegram API одновременно?

Как можно отправить сообщение вместе с inline-клавиатурой и обновить основную клавиатуру после нажатия кнопки на клавиатуре?
  • 11 марта 2024 г. 9:09
Ответы на вопрос 2
1. Для отправки двух разных сообщений с клавиатурами одновременно в Telegram API можно воспользоваться методом sendMessage дважды, указав разные тексты для каждого сообщения и разные клавиатуры для каждого сообщения. Примерно так:

```python
import requests

token = 'YOUR_BOT_TOKEN'

url = f'https://api.telegram.org/bot{token}/sendMessage'

# Отправка первого сообщения с клавиатурой
data1 = {
    'chat_id': 'CHAT_ID',
    'text': 'Первое сообщение',
    'reply_markup': {
        'keyboard': [['Кнопка 1'], ['Кнопка 2']]
    }
}

response1 = requests.post(url, json=data1).json()

# Отправка второго сообщения с другой клавиатурой
data2 = {
    'chat_id': 'CHAT_ID',
    'text': 'Второе сообщение',
    'reply_markup': {
        'keyboard': [['Кнопка 3'], ['Кнопка 4']]
    }
}

response2 = requests.post(url, json=data2).json()
```

2. Для отправки сообщения вместе с inline-клавиатурой и обновления основной клавиатуры после нажатия кнопки на клавиатуре в Telegram API, можно использовать метод editMessageReplyMarkup. Примерно так:

```python
import requests

token = 'YOUR_BOT_TOKEN'
message_id = 'MESSAGE_ID'

url = f'https://api.telegram.org/bot{token}/editMessageReplyMarkup'

# Отправка сообщения с inline-клавиатурой
data = {
    'chat_id': 'CHAT_ID',
    'message_id': message_id,
    'text': 'Сообщение с inline-клавиатурой',
    'reply_markup': {
        'inline_keyboard': [[{'text': 'Кнопка', 'callback_data': 'button_pressed'}]]
    }
}

response = requests.post(url, json=data).json()

# Обновление основной клавиатуры после нажатия кнопки
if response['ok'] == True:
    new_data = {
        'chat_id': 'CHAT_ID',
        'message_id': message_id,
        'reply_markup': {
            'keyboard': [['Новая кнопка 1'], ['Новая кнопка 2']]
        }
    }
    
    requests.post(url, json=new_data)
```

При обновлении клавиатуры после нажатия в Callback Query обработка происходит в вашем обработчике CallBack функции.
Увы, в Telegram нет метода чтобы обновить ReplyKeyboardMarkup без текста. Есть только метод editMessageReplyMarkup для обновления InlineKeyboardMarkup. 

Я думал, что может получиться отправить сообщение с keyboard, а потом вызвать метод editmessagereplymarkup, чтобы в предыдущее сообщение подставить inline_keyboard, но нет. API выдал ошибку "Bad Request: message can't be edited". Листинг запросов:

1. Отправка keyboard + text
curl --location --request GET 'https://api.telegram.org/bot###/sendMessage' \
--header 'Content-Type: application/json' \
--data '{
    "chat_id": "###",
    "text": "Some text",
    "reply_markup": {
        "keyboard": [
            [
                {
                    "text": "Button 1",
                    "request_contact": true
                }
            ]
        ],
        "resize_keyboard": true
    }
}'


2. Попытка отредактировать предыдущее сообщение и вставить inline_keyboard
curl --location --request GET 'https://api.telegram.org/bot###/editMessageReplyMarkup' \
--header 'Content-Type: application/json' \
--data '{
    "chat_id": "###",
    "message_id": 1332,
    "reply_markup": {
        "inline_keyboard": [
            [
                {
                    "text": "Button 2",
                    "callback_data": "foo"
                }
            ]
        ],
    }
}'
Похожие вопросы