Вступает в группу или подписывается на канал. После вступления новые сообщения чата приходят в ленту уведомлениями; то, что было до вступления, читайте через getChatHistory.
| Запрос | POST /waInstance{idInstance}/joinChat/{apiTokenInstance} |
| Тело | JSON |
| Каналы | Telegram, MAX |
Параметры
Передайте link или chatId:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
link |
string | одно из двух | ник, публичная ссылка или приглашение — те же форматы, что у getChatPreview |
chatId |
string | одно из двух | id чата из searchChats или превью |
Пример запроса
Подписаться на публичный канал по ссылке:
curl
curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/joinChat/$GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"link": "https://t.me/robo_school"}'
Python
import os
import requests
BASE = f"{os.environ['GRATIO_URL']}/waInstance{os.environ['GRATIO_ID']}"
TOKEN = os.environ["GRATIO_TOKEN"]
url = f"{BASE}/joinChat/{TOKEN}"
payload = {"link": "https://t.me/robo_school"}
response = requests.post(url, json=payload, timeout=60)
print(response.status_code, response.json())
Node.js
const { GRATIO_URL, GRATIO_ID, GRATIO_TOKEN } = process.env;
const base = `${GRATIO_URL}/waInstance${GRATIO_ID}`;
const url = `${base}/joinChat/${GRATIO_TOKEN}`;
const payload = { link: "https://t.me/robo_school" };
const response = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
console.log(response.status, await response.json());
PHP
<?php
$base = getenv('GRATIO_URL') . '/waInstance' . getenv('GRATIO_ID');
$url = $base . '/joinChat/' . getenv('GRATIO_TOKEN');
$payload = ['link' => 'https://t.me/robo_school'];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$response = json_decode(curl_exec($ch), true);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), PHP_EOL;
print_r($response);
Пример ответа
Ответ 200 OK:
{"status": "joined", "chatId": "-1001987654321"}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
status |
string | итог — см. таблицу ниже |
chatId |
string или null | id чата. null — Telegram не раскрыл адрес: заявка по приглашению ещё ждёт админа |
status |
Что значит |
|---|---|
joined |
аккаунт в чате, сообщения пойдут в ленту |
requested |
заявка ушла админу; после одобрения — см. «Особенности каналов» |
already |
аккаунт уже в чате. Запроса на вступление нет, лимит вступлений не тратится |
Ещё примеры
По приглашению
Ссылка t.me/+код открывает и закрытые группы:
curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/joinChat/$GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"link": "https://t.me/+AbCdEfGhIjKlMnOp"}'
По id из поиска
curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/joinChat/$GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"chatId": "-1001987654321"}'
Ошибки
| Код | code |
Когда | Что делать |
|---|---|---|---|
400 |
validation |
нет ни link, ни chatId |
добавить поле |
400 |
bad_link |
ссылка или ник не этой площадки | проверить ссылку |
400 |
not_found |
чата нет или он закрыт | — |
400 |
not_a_chat |
по ссылке человек или бот | — |
400 |
invite_required |
в эту группу вступают только по приглашению | попросить ссылку у админа |
400 |
invite_invalid |
приглашение недействительно или отозвано | попросить новую ссылку |
400 |
private |
Telegram: чат закрыт или аккаунт в нём заблокирован | — |
400 |
chat_full |
в чате нет мест | — |
400 |
chats_too_much |
Telegram: аккаунт уже в 500 каналах и супергруппах (с Premium — в 1000) | выйти из ненужных через leaveGroup |
400 |
not_authorized |
канал не на связи | проверить getStateInstance |
402 |
payment_required |
канал на паузе за неоплату | продлить канал в кабинете |
429 |
too_frequent |
вступление чаще раза в минуту, больше 20 в час или 40 в сутки | повторить после Retry-After |
469 |
rate_limited |
площадка попросила паузу | повторить после Retry-After |
501 |
not_supported |
WhatsApp или почта | — |
Перед серией вступлений проверьте getJoinLimits: nextJoinInSeconds скажет, когда можно следующее.
Особенности каналов
- Telegram. Обычную группу без ника по адресу не найти — только по приглашению: иначе
invite_required. Заявку одобрили — придёт groupEventparticipantJoinedByLinkсself: true. - MAX. Вступление по заявке бывает только у каналов: закрытый канал отвечает
requested, после одобрения его посты пойдут в ленту. В закрытую группу входят по приглашению — тогда придётgroupEventparticipantJoinedByLinkсself: true. Заявка, которая уже ждёт, — сноваrequestedбез расхода лимита. После отклонения заявки подать её снова MAX не даёт.
Что дальше
- getChatHistory — прочитать то, что было до вступления.
- leaveGroup — выйти или отписаться.
- Поиск и вступление: правила и лимиты — лимиты и отказы.
