Telegram бот: показывать меню только некоторым пользователям
Написал своего бота Telegram, добавил ему меню с помощью BotFather через команду /setcommands. Но мне нужно, чтобы это меню отображалось только для некоторых пользователей. С кнопками такое сделать получалось, просто проверяю id пользователя и отправляя соответствующий ответ. Есть ли возможно отправлять таким же образом меню? Пытался найти в документации, но не смог. В reply_markup можно отправлять либо inlineKeyboard, либо просто keyboard, либо removeKeyboard. Но насчёт меню ничего не нашёл. Подскажите, пожалуйста.
Спасибо за советы, но я имел в виду вот такое меню, которое открывается снизу кнопкой. Вот, например, у BotFather. Список команд это ещё называется, вроде. Наверное, я неправильно поставил вопрос, извините.
Ответы (2 шт):
Да, вы можете динамически создавать меню для определенных пользователей в Telegram. Для этого вам нужно использовать inlineKeyboard и просто проверять идентификатор пользователя в вашем коде.
Например, у вас есть команда "/menu", которая должна показывать меню только для определенных пользователей. Вы можете использовать следующий код, чтобы отправить inlineKeyboard только пользователям с определенным идентификатором:
import telegram
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
# здесь ваш список пользователей, для которых нужно показывать меню
users_with_menu = [123456, 789012]
def show_menu(update, context):
user_id = update.effective_user.id
if user_id in users_with_menu:
keyboard = [
[
InlineKeyboardButton("Кнопка 1", callback_data='button1'),
InlineKeyboardButton("Кнопка 2", callback_data='button2')
]
]
reply_markup = InlineKeyboardMarkup(keyboard)
context.bot.send_message(chat_id=update.effective_chat.id, text="Выберите пункт меню:", reply_markup=reply_markup)
else:
context.bot.send_message(chat_id=update.effective_chat.id, text="У вас нет доступа к меню.")
В этом примере мы проверяем идентификатор пользователя и отправляем только тем, у кого есть доступ к меню. При нажатии на кнопки, вы можете обрабатывать их в inline-обработчике, указанном в вашем боте.
Для отправки меню только определенным пользователям вам нужно отправлять команду меню в качестве обычного сообщения с использованием InlineKeyboard. Вы можете определить соответствующую разметку клавиатуры, а затем отправить ее в ответ на сообщение пользователя с помощью метода send_message бота.
Пример кода на PHP для отправки меню только для определенных пользователей может выглядеть так:
<?php
include __DIR__ . '/vendor/autoload.php';
$telegram = new \TelegramBot\Api\Client('YOUR_BOT_TOKEN');
// здесь ваш список пользователей, для которых нужно показывать меню
$users_with_menu = [123456, 789012];
// обработчик команды /start
$telegram->onCommand('start', function ($message) use ($telegram) {
// отправляем сообщение приветствия
$telegram->sendMessage($message->getChat()->getId(), 'Здравствуйте!');
});
// обработчик команды /menu
$telegram->onCommand('menu', function ($message) use ($telegram, $users_with_menu) {
$user_id = $message->getChat()->getId();
if (in_array($user_id, $users_with_menu)) {
$keyboard = new \TelegramBot\Api\Types\Inline\InlineKeyboardMarkup(
[
[
new \TelegramBot\Api\Types\Inline\InlineKeyboardButton('Кнопка 1', '', 'button1'),
new \TelegramBot\Api\Types\Inline\InlineKeyboardButton('Кнопка 2', '', 'button2')
]
]
);
$telegram->sendMessage($message->getChat()->getId(), 'Выберите пункт меню:', null, false, null, $keyboard);
} else {
$telegram->sendMessage($message->getChat()->getId(), 'У вас нет доступа к меню.');
}
});
$telegram->run();
В этом примере мы проверяем идентификатор пользователя и отправляем только тем, у кого есть доступ к меню. При нажатии на кнопки, вы можете обрабатывать их в inline-обработчике, указанном в вашем боте.
Надеюсь, это поможет вам решить вашу проблему.
