Користувачі та чати
Канали
Канал (Channel) — инструмент для вещания сообщений неограниченному числу подписчиков. В отличие от групп, в канале нет участников с правами на отправку: пишут только администраторы, остальные — только читают и реагируют.
Идентификаторы канала
У канала два вида идентификаторов:
- username — публичный @channelname, работает везде, где ожидается
chat_id. - chat_id — внутренний числовой ID, всегда начинается с
-100(например,-1001234567890). Узнать его можно черезgetChatили переслав сообщение из канала боту@userinfobot.
Для Bot API предпочтительнее использовать chat_id: username может смениться, числовой ID — никогда.
Бот в канале
Бот не может «вступить» в канал сам. Его нужно добавить администратором вручную (в клиенте: Channel Info → Administrators → Add Admin). При добавлении выдайте права:
post_messages— отправка сообщений от имени канала.edit_messages— редактирование своих постов.delete_messages— удаление своих постов.manage_chat— изменение названия, фото, описания (опционально).
post_messages любой вызов sendMessage вернёт 400 Forbidden: bot is not a member of the channel.
Отправка постов в канал
Используйте обычный sendMessage с chat_id канала. Посты поддерживают HTML/Markdown, Inline Keyboard, медиа.
$ch = curl_init('https://api.telegram.org/bot' . $token . '/sendMessage');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'chat_id' => '-1001234567890',
'text' => 'Новый пост в канале',
'parse_mode' => 'HTML',
'disable_web_page_preview' => true,
], JSON_UNESCAPED_UNICODE),
]);
$res = curl_exec($ch);
if ($res === false) {
throw new RuntimeException('cURL error: ' . curl_error($ch));
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($res, true);
if (!$data['ok']) {
throw new RuntimeException('API error: ' . ($data['description'] ?? 'unknown'));
}
// $data['result'] содержит Message с message_id нового поста
Получение информации о канале
Метод getChat возвращает объект Chat с полями: title, username, description, member_count (количество подписчиков), linked_chat_id (ID группы обсуждения, если есть).
// getChat example
$ch = curl_init('https://api.telegram.org/bot' . $token . '/getChat');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(['chat_id' => '-1001234567890']),
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
if ($res['ok']) {
echo "Subscribers: " . ($res['result']['member_count'] ?? 'unknown');
}
Группа обсуждения (Discussion Group)
Канал может иметь привязанную группу для комментариев. Включается в настройках канала: Discussion → Create/Link Group. У такой группы chat.type == supergroup, а у канала появляется поле linked_chat_id. Когда подписчик пишет комментарий, Telegram создаёт сообщение в группе обсуждения с message_thread_id, указывающим на топик, привязанный к посту канала. Бот в группе обсуждения получает обычные message апдейты.
Важные отличия от групп
- Нет
new_chat_members/left_chat_member— подписчики не генерируют апдейты. - Нет
callback_queryот постов канала (кнопки работают, но апдейты приходят боту в личку, если пользователь нажал кнопку сurlилиcallback_data— работает как в личке). message.chat.type == channelдля постов канала.- История сообщений доступна всем подписчикам сразу после подписки.
Дальше: HTTP-клиент на PHP