Telegram бот: показывать меню только некоторым пользователям

Рейтинг: 0Ответов: 2Опубликовано: 07.03.2023

Написал своего бота Telegram, добавил ему меню с помощью BotFather через команду /setcommands. Но мне нужно, чтобы это меню отображалось только для некоторых пользователей. С кнопками такое сделать получалось, просто проверяю id пользователя и отправляя соответствующий ответ. Есть ли возможно отправлять таким же образом меню? Пытался найти в документации, но не смог. В reply_markup можно отправлять либо inlineKeyboard, либо просто keyboard, либо removeKeyboard. Но насчёт меню ничего не нашёл. Подскажите, пожалуйста.

Спасибо за советы, но я имел в виду вот такое меню, которое открывается снизу кнопкой. Вот, например, у BotFather. Список команд это ещё называется, вроде. Наверное, я неправильно поставил вопрос, извините.

введите сюда описание изображения

Ответы

▲ 0

Да, вы можете динамически создавать меню для определенных пользователей в 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-обработчике, указанном в вашем боте.

▲ 0

Для отправки меню только определенным пользователям вам нужно отправлять команду меню в качестве обычного сообщения с использованием 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-обработчике, указанном в вашем боте.

Надеюсь, это поможет вам решить вашу проблему.