🎯 Что вы изучите в этом руководстве:
- Основы работы с Telegram Bot API
- Отправка различных типов сообщений
- Создание интерактивных клавиатур
- Работа с файлами и медиаконтентом
- Настройка webhook для реального времени
- Обработка ошибок и лучшие практики
💡 Нужен готовый бот без программирования?
В нашем каталоге готовых ботов (скидка 15% по промокоду GUIDE) вы найдете решения под любые задачи. Практически любого бота можно запустить и настроить за 60 секунд без знания программирования!
Введение в Telegram Bot API
Telegram Bot API — это HTTP-интерфейс для создания ботов Telegram. API позволяет отправлять сообщения, получать обновления, работать с файлами и многое другое.
Базовый URL и токен
Все запросы к API выполняются по адресу:
https://api.telegram.org/bot<TOKEN>/<METHOD>
Где:
<TOKEN>
— токен вашего бота от BotFather<METHOD>
— название метода API
Основные методы API
📨 Отправка сообщений
sendMessage
Отправка текстовых сообщений
sendPhoto
Отправка изображений
sendDocument
Отправка файлов
sendVideo
Отправка видео
sendAudio
Отправка аудио
sendLocation
Отправка геолокации
📥 Получение данных
getUpdates
Получение обновлений (polling)
getMe
Информация о боте
getFile
Получение информации о файле
getChatMember
Информация об участнике чата
⚙️ Управление
setWebhook
Установка webhook
deleteWebhook
Удаление webhook
setMyCommands
Установка команд
editMessageText
Редактирование сообщений
Практические примеры
Метод sendMessage
Основной метод для отправки текстовых сообщений.
PHP
<?php
$token = 'YOUR_BOT_TOKEN';
$chat_id = 'USER_CHAT_ID';
$text = 'Привет! Это сообщение от бота.';
$url = "https://api.telegram.org/bot{$token}/sendMessage";
$data = [
'chat_id' => $chat_id,
'text' => $text,
'parse_mode' => 'HTML'
];
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
?>
Python
import requests
token = 'YOUR_BOT_TOKEN'
chat_id = 'USER_CHAT_ID'
text = 'Привет! Это сообщение от бота.'
url = f'https://api.telegram.org/bot{token}/sendMessage'
data = {
'chat_id': chat_id,
'text': text,
'parse_mode': 'HTML'
}
response = requests.post(url, data=data)
print(response.json())
Node.js
const axios = require('axios');
const token = 'YOUR_BOT_TOKEN';
const chatId = 'USER_CHAT_ID';
const text = 'Привет! Это сообщение от бота.';
const url = `https://api.telegram.org/bot${token}/sendMessage`;
const data = {
chat_id: chatId,
text: text,
parse_mode: 'HTML'
};
axios.post(url, data)
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
Параметры sendMessage:
Обычная клавиатура (ReplyKeyboardMarkup)
Клавиатура, которая заменяет стандартную клавиатуру пользователя.
Пример с обычной клавиатурой
<?php
$keyboard = [
[
['text' => '🏠 Главная'],
['text' => '📊 Статистика']
],
[
['text' => '⚙️ Настройки'],
['text' => '📞 Поддержка']
],
[
['text' => '📍 Отправить геолокацию', 'request_location' => true]
]
];
$reply_markup = [
'keyboard' => $keyboard,
'resize_keyboard' => true,
'one_time_keyboard' => false
];
$data = [
'chat_id' => $chat_id,
'text' => 'Выберите действие:',
'reply_markup' => json_encode($reply_markup)
];
?>
Inline клавиатура (InlineKeyboardMarkup)
Кнопки, которые отображаются под сообщением и не заменяют клавиатуру.
Пример с inline клавиатурой
<?php
$inline_keyboard = [
[
['text' => '✅ Да', 'callback_data' => 'yes'],
['text' => '❌ Нет', 'callback_data' => 'no']
],
[
['text' => '🌐 Открыть сайт', 'url' => 'https://botmix.pro']
],
[
['text' => '📱 Поделиться', 'switch_inline_query' => 'Посмотрите на этого бота!']
]
];
$reply_markup = [
'inline_keyboard' => $inline_keyboard
];
$data = [
'chat_id' => $chat_id,
'text' => 'Вам понравился этот бот?',
'reply_markup' => json_encode($reply_markup)
];
?>
Обработка callback запросов
Для обработки нажатий на inline кнопки используйте answerCallbackQuery:
<?php
// Получаем callback query из webhook
$callback_query = $update['callback_query'];
$callback_data = $callback_query['data'];
$callback_query_id = $callback_query['id'];
// Обрабатываем нажатие
if ($callback_data === 'yes') {
$response_text = 'Спасибо за положительный отзыв!';
} else if ($callback_data === 'no') {
$response_text = 'Мы учтем ваше мнение и улучшим бота.';
}
// Отвечаем на callback query
$answer_data = [
'callback_query_id' => $callback_query_id,
'text' => $response_text,
'show_alert' => false
];
$answer_url = "https://api.telegram.org/bot{$token}/answerCallbackQuery";
// ... отправляем запрос
?>
Отправка изображений
Используйте метод sendPhoto для отправки изображений.
Отправка фото по URL
<?php
$data = [
'chat_id' => $chat_id,
'photo' => 'https://example.com/image.jpg',
'caption' => 'Описание изображения',
'parse_mode' => 'HTML'
];
$url = "https://api.telegram.org/bot{$token}/sendPhoto";
// ... отправляем запрос
?>
Отправка локального файла
<?php
$photo_path = '/path/to/local/image.jpg';
$post_fields = [
'chat_id' => $chat_id,
'caption' => 'Локальное изображение',
'photo' => new CURLFile($photo_path)
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.telegram.org/bot{$token}/sendPhoto");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
?>
Получение файлов от пользователей
Когда пользователь отправляет файл, используйте getFile для получения информации:
<?php
// Получаем file_id из обновления
$file_id = $update['message']['photo'][0]['file_id']; // для фото
// или
$file_id = $update['message']['document']['file_id']; // для документов
// Получаем информацию о файле
$file_info_url = "https://api.telegram.org/bot{$token}/getFile?file_id={$file_id}";
$file_info = json_decode(file_get_contents($file_info_url), true);
if ($file_info['ok']) {
$file_path = $file_info['result']['file_path'];
$file_url = "https://api.telegram.org/file/bot{$token}/{$file_path}";
// Скачиваем файл
$file_content = file_get_contents($file_url);
file_put_contents('downloaded_file.jpg', $file_content);
}
?>
Что такое Webhook?
Webhook — это способ получения обновлений в реальном времени. Вместо периодических запросов к API (polling), Telegram отправляет обновления на ваш сервер сразу при их появлении.
Установка Webhook
<?php
$webhook_url = 'https://yoursite.com/webhook.php';
$url = "https://api.telegram.org/bot{$token}/setWebhook";
$data = [
'url' => $webhook_url,
'max_connections' => 100,
'allowed_updates' => ['message', 'callback_query']
];
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
?>
Обработка Webhook запросов
Создайте файл webhook.php для обработки входящих обновлений:
<?php
// webhook.php
$token = 'YOUR_BOT_TOKEN';
// Получаем данные от Telegram
$input = file_get_contents('php://input');
$update = json_decode($input, true);
// Логируем для отладки
file_put_contents('log.txt', date('Y-m-d H:i:s') . " - " . $input . "\n", FILE_APPEND);
// Обрабатываем сообщение
if (isset($update['message'])) {
$message = $update['message'];
$chat_id = $message['chat']['id'];
$text = $message['text'] ?? '';
// Простая обработка команд
switch ($text) {
case '/start':
sendMessage($chat_id, 'Добро пожаловать! Отправьте /help для списка команд.');
break;
case '/help':
$help_text = "Доступные команды:\n/start - Начать работу\n/help - Справка\n/info - Информация о боте";
sendMessage($chat_id, $help_text);
break;
default:
sendMessage($chat_id, "Вы написали: " . $text);
}
}
// Обрабатываем callback query
if (isset($update['callback_query'])) {
$callback_query = $update['callback_query'];
$callback_data = $callback_query['data'];
$callback_query_id = $callback_query['id'];
$chat_id = $callback_query['message']['chat']['id'];
// Отвечаем на callback
answerCallbackQuery($callback_query_id, 'Обработано!');
sendMessage($chat_id, "Вы нажали: " . $callback_data);
}
function sendMessage($chat_id, $text) {
global $token;
$url = "https://api.telegram.org/bot{$token}/sendMessage";
$data = [
'chat_id' => $chat_id,
'text' => $text
];
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$context = stream_context_create($options);
return file_get_contents($url, false, $context);
}
function answerCallbackQuery($callback_query_id, $text) {
global $token;
$url = "https://api.telegram.org/bot{$token}/answerCallbackQuery";
$data = [
'callback_query_id' => $callback_query_id,
'text' => $text
];
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$context = stream_context_create($options);
return file_get_contents($url, false, $context);
}
?>
💡 Требования к Webhook:
- HTTPS обязательно (не HTTP)
- Валидный SSL сертификат
- Порт 80, 88, 443 или 8443
- Ответ сервера должен быть 200 OK
- Время ответа не более 60 секунд
Продвинутые возможности
🎨 Форматирование текста
Используйте HTML или Markdown для форматирования сообщений:
HTML форматирование
$text = "<b>Жирный текст</b>\n";
$text .= "<i>Курсив</i>\n";
$text .= "<u>Подчеркнутый</u>\n";
$text .= "<s>Зачеркнутый</s>\n";
$text .= "<code>Моноширинный</code>\n";
$text .= "<pre>Блок кода</pre>\n";
$text .= "<a href='https://botmix.pro'>Ссылка</a>";
📊 Отправка опросов
Создавайте интерактивные опросы с помощью sendPoll:
$data = [
'chat_id' => $chat_id,
'question' => 'Какой язык программирования вы предпочитаете?',
'options' => json_encode(['PHP', 'Python', 'JavaScript', 'C#']),
'is_anonymous' => false,
'type' => 'regular',
'allows_multiple_answers' => false
];
👥 Работа с группами
Управление участниками групп и каналов:
// Получить информацию об участнике
$member_info = [
'chat_id' => $group_chat_id,
'user_id' => $user_id
];
// Забанить пользователя
$ban_data = [
'chat_id' => $group_chat_id,
'user_id' => $user_id,
'until_date' => time() + 3600 // на 1 час
];
Обработка ошибок и лучшие практики
🛡️ Обработка ошибок
<?php
function sendTelegramRequest($method, $data) {
global $token;
$url = "https://api.telegram.org/bot{$token}/{$method}";
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data),
'timeout' => 10
]
];
$context = stream_context_create($options);
$result = @file_get_contents($url, false, $context);
if ($result === false) {
error_log("Ошибка соединения с Telegram API");
return false;
}
$response = json_decode($result, true);
if (!$response['ok']) {
error_log("Telegram API Error: " . $response['description']);
return false;
}
return $response['result'];
}
?>
⚡ Ограничения API
- Личные чаты: до 30 сообщений в секунду
- Группы: до 20 сообщений в минуту
- Размер сообщения: до 4096 символов
- Размер файла: до 50 МБ
- Размер фото: до 10 МБ
🔒 Безопасность
- Никогда не публикуйте токен бота
- Валидируйте все входящие данные
- Используйте HTTPS для webhook
- Ограничивайте доступ к webhook URL
- Логируйте подозрительную активность
Полезные библиотеки
PHP
- TelegramBot/Api - популярная PHP библиотека
- Longman/TelegramBot - многофункциональная библиотека
- Nutgram - современная PHP framework для ботов
Python
- python-telegram-bot - официальная библиотека
- aiogram - асинхронная библиотека
- telebot (pyTelegramBotAPI) - простая библиотека
Node.js
- node-telegram-bot-api - популярная библиотека
- telegraf - современный фреймворк
- telegram-bot-api - простая библиотека
🔧 Решение частых проблем
❓ Бот не отвечает на сообщения
Решения:
- Проверьте правильность токена
- Убедитесь, что webhook настроен корректно
- Проверьте логи сервера на ошибки
- Используйте /deleteWebhook и настройте заново
❓ Ошибка "Forbidden: bot was blocked by the user"
Решение: Пользователь заблокировал бота. Обрабатывайте эту ошибку и исключайте таких пользователей из рассылок.
❓ Сообщения приходят с задержкой
Решения:
- Оптимизируйте код обработки webhook
- Используйте очереди для тяжелых операций
- Убедитесь, что сервер отвечает быстро (< 5 сек)