
Телеграм-боты на PHP управляются через API, предоставляемое Telegram. Кнопки ускоряют взаимодействие пользователя с ботом, позволяя отправлять команды без ручного ввода текста. Для создания кнопок чаще всего используют InlineKeyboardMarkup для встроенных кнопок и ReplyKeyboardMarkup для обычных клавиатур. Каждая кнопка формируется как массив с обязательными параметрами text и callback_data или url, что обеспечивает гибкость в реакции бота на действия пользователя.
На практике структура кнопки в PHP выглядит как многомерный массив, который конвертируется в JSON перед отправкой через метод sendMessage или editMessageText. Для Inline-кнопок важна точная настройка callback_data длиной не более 64 байт, иначе Telegram отклонит запрос. Reply-кнопки проще в реализации: достаточно указать текст кнопки и опционально включить свойства resize_keyboard и one_time_keyboard для оптимизации интерфейса.
Эффективная разработка кнопок предполагает продуманную иерархию команд. Inline-кнопки удобны для навигации и выполнения конкретных действий без лишнего ввода. Reply-кнопки подходят для выбора опций или подтверждения действий. Практика показывает, что объединение обеих схем повышает удобство пользователей и снижает нагрузку на обработку текстовых команд.
Выбор типа кнопки: inline или reply
При использовании inline-кнопок ключевым элементом является callback_data, которая ограничена 64 байтами. На PHP она формируется в массиве и конвертируется в JSON для метода sendMessage с параметром reply_markup. Inline-кнопки не создают лишних сообщений в чате и позволяют обновлять контент через editMessageText.
Reply-кнопки проще реализовать: создается массив с текстом кнопок и передается в ReplyKeyboardMarkup. Они занимают место стандартной клавиатуры, после выбора могут скрываться через параметр one_time_keyboard. Используйте их, когда необходимо, чтобы пользователь явно отправил ответ, а не просто кликнул.
Выбор зависит от сценария. Если нужна мгновенная обработка действий без засорения чата – inline. Если требуется ввод пользователя через готовые варианты с визуальной клавиатурой – reply. Для комплексных ботов часто комбинируют оба типа, чтобы оптимизировать UX и логику обработки событий.
Установка и настройка библиотеки для работы с Telegram API
Для взаимодействия с Telegram API на PHP рекомендуется использовать библиотеку telegram-bot/api, которая обеспечивает удобный доступ к методам Bot API и поддержку кнопок.
Установку выполняют через Composer. В командной строке проекта выполните:
composer require telegram-bot/api
После установки подключите автозагрузчик Composer в начале скрипта:
require 'vendor/autoload.php';
Создайте экземпляр клиента Telegram, указав токен бота, который вы получили у BotFather:
$telegram = new \TelegramBot\Api\Client('ВАШ_ТОКЕН_БОТА');
Для корректной работы с кнопками используйте классы InlineKeyboardMarkup и Keyboard. Например, для создания инлайн-кнопок:
use TelegramBot\Api\Types\Inline\InlineKeyboardMarkup;
$keyboard = new InlineKeyboardMarkup([[
['text' => 'Кнопка 1', 'callback_data' => 'action_1'],
['text' => 'Кнопка 2', 'callback_data' => 'action_2']
]]);
$telegram->sendMessage($chatId, 'Выберите действие', false, null, null, $keyboard);
Проверяйте версию PHP: библиотека требует минимум PHP 7.4. Рекомендуется включить расширения cURL и json, иначе методы API будут недоступны.
Для отладки запросов используйте метод setLogger, чтобы логировать отправленные и полученные данные:
$telegram->setLogger(new \Monolog\Logger('telegram', [new \Monolog\Handler\StreamHandler('bot.log')]));
После выполнения этих шагов библиотека готова к работе: вы можете создавать кнопки, обрабатывать команды и получать обновления от пользователей без дополнительных настроек сервера.
Создание простой текстовой кнопки с callback_data

Для создания кнопки с callback_data в Telegram боте на PHP используется метод InlineKeyboardButton. Основной параметр – text для отображаемого текста кнопки и callback_data для уникального идентификатора события.
Пример создания кнопки: ['text' => 'Нажми меня', 'callback_data' => 'button_click']. Этот массив добавляется в клавиатуру в формате inline_keyboard, которая представляет собой массив массивов кнопок.
Создание клавиатуры для одной кнопки выглядит так: $keyboard = ['inline_keyboard' => [[['text' => 'Нажми меня', 'callback_data' => 'button_click']]]];
Для отправки клавиатуры с сообщением используется метод sendMessage, где клавиатура передается в параметре reply_markup в JSON-формате: 'reply_markup' => json_encode($keyboard).
Важно, чтобы значение callback_data не превышало 64 байта. Рекомендуется использовать короткие уникальные идентификаторы и избегать длинных описаний, чтобы гарантировать корректную обработку на стороне бота.
Обработка нажатия кнопки осуществляется через CallbackQuery. В обработчике проверяется $callback_query['data'] и выполняются соответствующие действия, например, отправка нового сообщения или обновление существующего.
Пример обработки нажатия:
if ($callback_query['data'] === 'button_click') { sendMessage($chat_id, 'Кнопка нажата'); }
Такой подход позволяет создавать компактные, управляемые кнопки без изменения текста сообщения, что особенно удобно для интерактивных меню и опросов.
Добавление кнопки с URL для перехода на внешний ресурс
Для создания кнопки, которая открывает внешний сайт, в Telegram-боте на PHP используется метод InlineKeyboardButton с параметром url. Такая кнопка позволяет пользователю переходить по ссылке без необходимости отправки сообщения боту.
Пример структуры кнопки с URL:
$keyboard = [
'inline_keyboard' => [
[
['text' => 'Перейти на сайт', 'url' => 'https://example.com']
]
]
];
$data = [
'chat_id' => $chat_id,
'text' => 'Нажмите на кнопку для перехода:',
'reply_markup' => json_encode($keyboard)
];
file_get_contents("https://api.telegram.org/bot$token/sendMessage?" . http_build_query($data));
Рекомендации при работе с кнопками URL:
- Используйте протокол
httpsдля безопасного соединения. - Сокращайте длинные URL через надежные сервисы, чтобы кнопка оставалась аккуратной.
- Текст кнопки должен быть лаконичным, до 30 символов, чтобы не нарушать оформление интерфейса.
- Если требуется несколько кнопок, создавайте массивы внутри
inline_keyboard, чтобы кнопки располагались в ряд или столбец. - Проверяйте корректность ссылки перед публикацией, чтобы избежать ошибок при переходе.
Для динамических URL можно использовать переменные PHP:
$link = 'https://example.com/page?id=' . $user_id;
$keyboard = [
'inline_keyboard' => [
[['text' => 'Перейти на страницу', 'url' => $link]]
]
];
Таким образом, кнопка с URL интегрируется напрямую в интерфейс бота, обеспечивая быстрый доступ к внешним ресурсам без дополнительных действий со стороны пользователя.
Формирование клавиатуры с несколькими кнопками
Для создания клавиатуры с несколькими кнопками в Telegram Bot API используется метод reply_markup с объектом InlineKeyboardMarkup или ReplyKeyboardMarkup. В PHP это реализуется через массивы и последующее кодирование в JSON.
Пример клавиатуры с тремя кнопками в один ряд:
$keyboard = [
'inline_keyboard' => [
[
['text' => 'Кнопка 1', 'callback_data' => 'btn1'],
['text' => 'Кнопка 2', 'callback_data' => 'btn2'],
['text' => 'Кнопка 3', 'callback_data' => 'btn3']
]
]
];
$replyMarkup = json_encode($keyboard);
Для клавиатуры с несколькими рядами кнопок массив строится по принципу: каждый внутренний массив – отдельный ряд.
| Ряд | Кнопки |
|---|---|
| Первый | Кнопка 1, Кнопка 2 |
| Второй | Кнопка 3, Кнопка 4, Кнопка 5 |
Пример кода для двух рядов:
$keyboard = [
'inline_keyboard' => [
[
['text' => 'Кнопка 1', 'callback_data' => 'btn1'],
['text' => 'Кнопка 2', 'callback_data' => 'btn2']
],
[
['text' => 'Кнопка 3', 'callback_data' => 'btn3'],
['text' => 'Кнопка 4', 'callback_data' => 'btn4'],
['text' => 'Кнопка 5', 'callback_data' => 'btn5']
]
]
];
$replyMarkup = json_encode($keyboard);
Важно учитывать: кнопки в одном ряду должны иметь одинаковую высоту, иначе Telegram автоматически подстроит их, что может нарушить дизайн. Для ReplyKeyboardMarkup можно использовать параметр resize_keyboard для оптимального размера и one_time_keyboard для автоматического скрытия после нажатия.
Эффективный подход – заранее формировать массив кнопок через цикл, особенно если кнопок больше пяти или их количество динамическое. Это снижает вероятность ошибок в JSON и упрощает поддержку кода.
Обработка нажатий кнопок через webhook
Webhook получает обновления от Telegram в формате JSON. Для кнопок важно различать два типа: inline-кнопки и кнопки ReplyKeyboard. Inline-кнопки отправляют callback_query, а ReplyKeyboard – обычное сообщение с текстом кнопки.
Пример структуры callback_query:
{
"update_id": 123456789,
"callback_query": {
"id": "123abc",
"from": { "id": 987654321, "first_name": "Иван" },
"message": { "message_id": 1, "chat": { "id": 987654321 } },
"data": "action_1"
}
}
Для обработки:
- Получите входящий JSON:
$update = json_decode(file_get_contents('php://input'), true); - Проверьте наличие
callback_query:if(isset($update['callback_query'])) - Извлеките данные кнопки:
$data = $update['callback_query']['data']; - Определите действие через
switchили массив соответствий$actions[$data]. - Отправьте ответ на callback:
answerCallbackQuery, чтобы убрать «часики» у пользователя.
Пример ответа на callback:
$callback_id = $update['callback_query']['id'];
file_get_contents("https://api.telegram.org/bot$token/answerCallbackQuery?callback_query_id=$callback_id&text=Готово!");
Для ReplyKeyboard:
- Получайте текст сообщения через
$text = $update['message']['text']; - Сравнивайте с ожидаемыми кнопками
- Вызывайте соответствующие функции обработки
Рекомендации:
- Не используйте
sleep()для задержки ответов – Telegram ограничивает время webhook до 5 секунд. - Для сложных сценариев используйте очередь задач: сохраняйте нажатие кнопки в базу, а обработку выполняйте асинхронно.
- Всегда отправляйте
answerCallbackQuery, даже если действие не требует уведомления, чтобы интерфейс пользователя не зависал. - Используйте строгую проверку данных кнопок, чтобы исключить неожиданные значения из
callback_data.
Динамическое изменение кнопок в зависимости от действий пользователя
Для динамического изменения кнопок в Telegram-боте на PHP используется редактирование клавиатуры с помощью метода editMessageReplyMarkup API Telegram. Основная логика заключается в отслеживании действий пользователя через обновления (update) и формировании новой разметки кнопок на основе текущего состояния сессии.
Пример структуры состояния пользователя можно хранить в массиве или базе данных, например: $userState[$chatId] = 'step1'. В зависимости от значения состояния формируются разные кнопки. Например, на первом шаге предлагаются кнопки ['Да', 'Нет'], на втором – ['Продолжить', 'Назад'].
Создание кнопок реализуется через массив reply_markup с объектом inline_keyboard:
$keyboard = ['inline_keyboard' => [[['text' => 'Да', 'callback_data' => 'yes'], ['text' => 'Нет', 'callback_data' => 'no']]]];
После обработки нажатия кнопки отправляется новый массив кнопок с помощью editMessageReplyMarkup:
file_get_contents("https://api.telegram.org/bot$token/editMessageReplyMarkup?chat_id=$chatId&message_id=$messageId&reply_markup=" . urlencode(json_encode($keyboard)));
Важно использовать уникальные callback_data для каждой кнопки, чтобы корректно идентифицировать действие пользователя. Для сложных сценариев рекомендуется разделять логику генерации клавиатуры на функции, например: function getKeyboard($state), что упрощает поддержку и добавление новых шагов.
Оптимизация работы с динамическими кнопками достигается через проверку состояния перед отправкой изменений. Если текущее состояние совпадает с уже отображаемым набором кнопок, вызов editMessageReplyMarkup можно пропустить, чтобы снизить количество API-запросов.
Для больших сценариев полезно применять многоуровневые меню, где каждая кнопка ведет к новой подменю. Это создается путем замены inline_keyboard на соответствующий массив кнопок в функции обработки callback_query.
Отладка и тестирование кнопок на локальном сервере
Для тестирования кнопок Telegram-бота на локальном сервере используйте ngrok или аналогичные инструменты для создания публичного HTTPS-туннеля. Это необходимо, так как Telegram требует защищённого соединения для webhook.
После установки ngrok выполните команду ngrok http 80 для проброса локального порта. Полученный публичный URL используйте в setWebhook при регистрации бота через API.
При создании кнопок важно проверять правильность структуры массива reply_markup. Например, Inline-кнопки должны содержать ключ callback_data, а Reply-кнопки – массив массивов с текстом кнопок.
Для локальной отладки рекомендуем вести логирование запросов Telegram. В PHP это можно сделать через file_put_contents('log.txt', json_encode($_POST).PHP_EOL, FILE_APPEND); – это позволяет отслеживать все события и нажатия кнопок в реальном времени.
Проверяйте корректность URL, используемых в Inline-кнопках, и убедитесь, что обработчик callback_data возвращает правильный JSON с answerCallbackQuery, чтобы кнопка отображалась как активная.
Используйте Postman или cURL для имитации запросов Telegram, чтобы протестировать обработку кнопок без отправки сообщений в реальном чате. Это ускоряет выявление ошибок в логике обработки callback_data.
Не забывайте о таймаутах: локальный сервер может быть медленнее, чем продакшн, поэтому устанавливайте set_time_limit(30) для скриптов обработки кнопок, чтобы избежать непредвиденных прерываний.
Вопрос-ответ:
Как создать простую кнопку с текстом в телеграм-боте на PHP?
Для создания кнопки с текстом используется объект типа InlineKeyboardButton или KeyboardButton. В PHP чаще применяют массив, который передается через метод sendMessage вместе с параметром reply_markup. Пример: создается массив кнопок [[‘text’ => ‘Нажми меня’]] и оборачивается в массив с ключом ‘inline_keyboard’ или ‘keyboard’, после чего сериализуется в JSON и отправляется боту.
Можно ли сделать кнопку, которая отправляет ссылку пользователю?
Да, для этого создается InlineKeyboardButton с параметром ‘url’. В массиве кнопки указывается текст, который увидит пользователь, и ссылка. Когда пользователь нажимает на такую кнопку, открывается указанная веб-страница, а не отправляется сообщение боту. Это удобно для перехода на сайт или документ.
Как реагировать на нажатие кнопки в телеграм-боте на PHP?
Нажатие кнопки обрабатывается через callback_query. Бот получает объект с данными о нажатой кнопке, включая callback_data. В PHP это обычно делается через обработку входящего JSON, где проверяется наличие ‘callback_query’. После этого можно отправить ответ пользователю методом answerCallbackQuery и при необходимости изменить текст сообщения или клавиатуру.
В чем отличие обычной клавиатуры от встроенной (inline) клавиатуры?
Обычная клавиатура (ReplyKeyboardMarkup) заменяет стандартную клавиатуру пользователя на набор кнопок, которые отправляют текстовые сообщения боту. Встроенная клавиатура (InlineKeyboardMarkup) отображается прямо под сообщением и позволяет использовать callback_data или ссылки. Inline-кнопки удобнее для интерактивных сценариев, так как они не захламляют основной чат и позволяют обновлять сообщение без нового текста от пользователя.
Можно ли создавать несколько рядов кнопок и управлять их расположением?
Да, клавиатура в Telegram строится из массива массивов. Каждый внутренний массив представляет ряд кнопок. Например, [[‘text’=>’Кнопка 1’], [‘text’=>’Кнопка 2’]] создаст одну кнопку в первом ряду и одну во втором. Можно добавлять несколько кнопок в одном ряду, формируя горизонтальное расположение, или разделять их на ряды для вертикального порядка. Это дает гибкость в интерфейсе.
Какие типы кнопок можно использовать в Telegram-боте на PHP?
В Telegram-боте есть несколько видов кнопок. Основные из них — это inline-кнопки и кнопки клавиатуры. Inline-кнопки отображаются прямо под сообщением и могут отправлять данные обратно боту при нажатии. Кнопки клавиатуры заменяют стандартную клавиатуру пользователя и позволяют отправлять заранее определённые команды. Для их создания в PHP обычно формируют массивы с необходимыми параметрами и передают их в метод sendMessage через параметр «reply_markup».
Как обработать нажатие кнопки пользователем в PHP-боте?
Для обработки нажатия inline-кнопки необходимо настроить обработку callback-запросов. При нажатии кнопки бот получает объект с полем «callback_query», в котором содержится идентификатор пользователя и данные, указанные в кнопке. В PHP это можно обработать с помощью проверки массива, полученного из запроса, и вызова нужной функции в зависимости от переданных данных. После этого можно отправить уведомление пользователю или изменить сообщение, используя методы answerCallbackQuery и editMessageText.
