Telegram Bot API: руководство разработчика

Средний уровень ⏱ 10 мин чтения

Исчерпывающее руководство по Telegram Bot API для разработчиков. Изучите все возможности API, примеры кода и лучшие практики создания ботов.

🎯 Что вы изучите в этом руководстве:

  • Основы работы с 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 Редактирование сообщений

Практические примеры

1
Отправка простого сообщения

Метод 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:

chat_id
Integer/String
ID чата или username канала
Обязательный
text
String
Текст сообщения (до 4096 символов)
Обязательный
parse_mode
String
HTML, Markdown или MarkdownV2
Опциональный
reply_markup
Object
Клавиатура или inline кнопки
Опциональный
2
Создание клавиатур

Обычная клавиатура (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";
// ... отправляем запрос
?>
3
Работа с файлами

Отправка изображений

Используйте метод 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);
}
?>
4
Настройка Webhook

Что такое 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 сек)

🚀 Следующие шаги

Теперь у вас есть все знания для создания мощных Telegram ботов! Если не хотите программировать с нуля, посетите наш каталог готовых ботов (скидка 15% по промокоду GUIDE) — здесь вы найдете решения под любые задачи.