Users & chats

Channels

Канал (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