BiNuke Telegram API — руководство интеграции

Документация для разработчиков внешних проектов и сотрудников · 14 октября 2026 · Контракт licensed-multibot-v2, основа Telegram 1.3.2.

1. Как лицензия выбирает бота

Лицензии можно назначить одного или нескольких Telegram-ботов. Для внешнего клиента botid — это реальный Telegram Bot ID, возвращаемый Telegram в getMe.result.id. Внутренний номер строки BiNuke, ID записи webhook и токен для выбора не используются.

У лицензииПоведение
Один выделенный ботВо всех запросах к этому боту botid можно не передавать. Бот выбирается автоматически.
Два или более выделенных ботаБез botid API вернёт error: "bot_id_required" и availableBots. Повторите запрос с полем botid — реальным Telegram ID нужного бота.
Не назначены выделенные ботыНакопители и управление webhook запрещены (dedicated_bot_required). Режимы со стандартным ботом из старого API продолжают работать согласно политике лицензии.
Telegram запрещёнtelegram_forbidden. Даже если в БД остались старые назначения, они не дают доступ.

Никогда не передавайте внутренний ID BiNuke в botid. Не передавайте токен Telegram-бота при обычном чтении или отправке — он нужен только для TGAccountCreate. Ключ лицензии передавайте в POST, не в URL.

2. Формат запросов

Адрес: https://api.binuke.info/api.php (либо свой адрес установленного BiNuke). Метод HTTP — POST, параметр формы json содержит JSON с mode и license. Ответы методов BiNuke — JSON UTF-8. В накопителях и списках ботов Telegram ID возвращаются строками; вложенный ответ самого Telegram (result и TGgetChat.chat) сохраняет типы полей Telegram API.

curl -X POST 'https://api.binuke.info/api.php' \
  --data-urlencode 'json={"mode":"TGAccounts","license":"YOUR_LICENSE"}'

TGAccounts показывает разрешённые боты и их Telegram ID; вызов не требует botid. Метод полезен при запуске внешнего приложения и для построения выбора бота в интерфейсе.

3. Четыре разных идентификатора — не перепутать

Для TGSend используются независимые уровни адресации. Идентификатор проекта/подразделения не равен номеру темы Telegram.

ПолеЧьё это IDОткуда братьВлияет на доставку?
licenseЛицензия внешнего проектаВыдаётся администратором BiNukeПроверяет права
botidРеальный ID Telegram-бота, например 7412345678Из TGAccounts.bots[].botId. Можно не указывать, когда выделен один бот.Да — от имени какого бота отправлять
toID Telegram-чата (личного, группы или супергруппы), например -1001234567890TGChats.items[].chatid либо заранее известный ID TelegramДа — в какой чат отправлять
topicidID темы внутри чата, например 357TGChatTopics.items[].topicid после выбора чата. В Telegram Bot API называется message_thread_id.Да — в какую тему выбранного чата
serviceidВнутренний ID филиала, отдела, клиента или учётной записи в вашем проекте, например 42Определяет само внешнее приложение, не TelegramНет. Только учёт и последующая группировка исходящих по подразделениям

Пример из интернет-магазина: serviceid=42 означает «филиал №42», но Telegram не знает о филиалах. Если филиал пишет в тему «Заказы» (topicid=357) группы to=-1001234567890, нужно передать оба значения в разных полях. Для небольшого сайта serviceid вообще не нужен.

Пример из сервиса бухгалтерских документов: serviceid=7821 может означать внутреннюю учётную запись зарегистрированного клиента сервиса. Это по-прежнему не Telegram-бот, не пользователь Telegram, не чат и не тема. Кому доставить уведомление, определяют botid, to и при необходимости topicid.

4. Все методы Telegram API

modeПараметры помимо mode и licenseНазначение
TGAccounts—Назначенные боты: bots[{botId,name}], count, botIdRequired, canCreate. Без секретов.
TGConnectionStatusbotid?Проверка getMe, текущий статус подключения, политики лицензии.
TGChatsbotid?, page?, limit?Чаты выделенного бота из накопителя.
TGChatInfobotid?, chatidОписание конкретного сохранённого чата.
TGChatTopicsbotid?, chatid, page?, limit?Сохранённые темы выбранного чата (после проверки принадлежности чата боту).
TGUsersbotid?, page?, limit?Пользователи, которых накопитель видел через новые webhook с известным ботом.
TGUserInfobotid?, useridКарточка пользователя из накопителя бота.
TGSendbotid?, to, body?, filename?, fileBase64?, topicid?, serviceid?Отправка текста или файла. topicid адресует тему Telegram; serviceid только классифицирует отправку внутри проекта.
TGOutgoingRecentbotid?, page?, limit?Исходящие сообщения этой лицензии, отправленные конкретным ботом.
TGIncomingRecentbotid?, limit?Последние входящие по указанному боту. Работает с большим старым журналом; не используйте частый опрос.
TGListbotid?Старый формат списка известных чатов. Для нового кода предпочтительнее TGChats.
TGgetChatbotid?, chatidОнлайн-запрос Telegram getChat от имени выделенного бота.
TGWebhookStatusbotid?Прочитать фактический статус webhook без изменения настройки.
TGWebhookEnsurebotid?Явно установить/обновить webhook для выбранного бота через действующий механизм прокси.
TGAccountCreatename, tokenПодключить собственного бота, если лицензии разрешено создание. Другие назначения остаются. botid не нужен.
TGApiInfo, TGApiHelp—Машинный контракт и эта HTML-страница, не требуют лицензии.
TGProxyConfig—Действующий публичный контракт конфигурации webhook-прокси.

Служебный TGBack принимает webhook Telegram; внешние проекты его не вызывают. Все методы с пометкой botid? требуют ID только при наличии нескольких выделенных ботов.

5. TGSend — отправка текста, файлов и сообщений в темы

TGSend — универсальный внешний метод отправки. После проверки лицензии BiNuke выбирает Telegram-бота и вызывает один из трёх методов Telegram Bot API: sendMessage, sendPhoto или sendDocument. Исходящая запись сохраняется в binuketg; это журнал проекта, а не таблица Telegram-тем.

ПолеТипОбязательноТочное значение
modeстрокадаTGSend
licenseстрокадаСерийный ключ лицензии BiNuke
botidстрока десятичных цифртолько если несколько ботовРеальный Telegram Bot ID, не внутренний номер BiNuke
toстрокадаTelegram chat_id; один чат может содержать множество тем
bodyстрокадля обычного текстаТекст сообщения; используется parse_mode=HTML; при отправке файла становится подписью (caption)
topicidположительное целое число либо строка с его цифраминетID темы в to. BiNuke передаёт его в Telegram как message_thread_id. Если не указан, параметр темы в Telegram не передаётся.
serviceidцелое числонетВнутреннее подразделение вашего проекта. Приводится к int, по умолчанию 0. Сохраняется в binuketg.serviceid, не передаётся Telegram.
filenameстрокадля файлаНазвание прикрепляемого файла с расширением, например report.pdf или photo.jpg.
fileBase64строкадля файла через JSONСодержимое файла Base64, можно с префиксом data:...;base64,. С filename отправляется как фото для JPG/PNG, иначе как документ.

Имена полей чувствительны к регистру: для внешнего JSON пишите строго topicid, serviceid и botid строчными буквами. Формы topicId, serviceId и botId в запросе не являются их эквивалентами. В ответах список ботов, напротив, использует поле botId — это отдельный публичный контракт ответа.

Особенно важно: поле message_thread_id — это имя аргумента самого Telegram Bot API. Во внешнем запросе к BiNuke используйте поле topicid. Поле serviceid никогда не подставляется в message_thread_id.

5.1. Текст в личный чат: минимальный запрос

{"mode":"TGSend","license":"YOUR_LICENSE","to":"123456789","body":"Ваш заказ принят"}

Этот пример подходит лицензии с одним назначенным ботом. Нет ни темы, ни подразделения. Никакой botid или serviceid добавлять не нужно.

5.2. Отправить текст в конкретную тему супергруппы

{"mode":"TGSend","license":"YOUR_LICENSE","to":"-1001234567890","topicid":"357","body":"Новая заявка в отдел продаж"}

Здесь to — ID самой группы, topicid — ID темы в этой группе. Нельзя использовать только topicid вместо to; также нельзя помещать номер темы в serviceid.

5.3. Два бота, филиал магазина и определённая тема

{"mode":"TGSend","license":"YOUR_LICENSE","botid":"7412345678","to":"-1001234567890","topicid":"357","serviceid":42,"body":"Филиал №42: поступил новый заказ"}

Бот выбирается полем botid; группа — to; тема — topicid; внутренний филиал — serviceid. Каждый параметр выполняет свою задачу.

5.4. Платный сервис документов с аккаунтами клиентов

{"mode":"TGSend","license":"YOUR_LICENSE","to":"123456789","serviceid":7821,"body":"Готов акт сверки за сентябрь"}

В этом примере serviceid=7821 — числовой ID аккаунта в сервисе документов. Сообщение отправляется в личный Telegram-чат и не имеет темы. Если аккаунты во внешнем приложении обозначены UUID или буквенно-цифровой строкой, их необходимо сопоставить с числовыми внутренними ID либо не передавать serviceid: текущий метод приводит его к целому числу.

5.5. Файл PDF в тему: Base64 + filename

{"mode":"TGSend","license":"YOUR_LICENSE","to":"-1001234567890","topicid":"357","serviceid":7821,"filename":"invoice-2026-10.pdf","fileBase64":"JVBERi0xLjQKLi4u","body":"Счёт за октябрь"}

Строка Base64 здесь сокращена исключительно для иллюстрации — её нельзя использовать как настоящий PDF. В реальном запросе подставьте полное Base64 содержимое файла. Для .jpg/.jpeg/.png код использует Telegram sendPhoto, для других расширений — sendDocument; topicid работает в обоих случаях.

5.6. То же через cURL, в формате, который принимает BiNuke

curl -X POST 'https://api.binuke.info/api.php' \
  --data-urlencode 'json={"mode":"TGSend","license":"YOUR_LICENSE","to":"-1001234567890","topicid":"357","body":"Тест в тему"}'

Важно для интегратора: код api.php получает JSON из POST-поля формы json, а не напрямую из raw body с Content-Type: application/json. Не рассчитывайте, что отправка только сырого JSON без формы сработает.

5.7. Формат успешного ответа и контроль ошибок

{"error":"","botId":"7412345678","result":{"ok":true,"result":{"message_id":123,"chat":{"id":-1001234567890},"message_thread_id":357}}}

Схематический пример: Telegram сам определяет возвращаемые поля result.result. Внешнее приложение должно проверять и error === "" (BiNuke), и result.ok === true (Telegram). Если тема не существует, бот не участник группы или у него нет прав, Telegram может вернуть result.ok:false с описанием — при этом error BiNuke может оставаться пустым.

{"error":"invalid_topicid"}

Ошибка invalid_topicid означает, что переданный topicid не является положительным целым числом. Ошибка предотвращает непреднамеренную отправку сообщения в общую ленту при неверном ID темы. Не передавайте ноль: для отправки без конкретной темы просто опустите поле.

5.8. Как найти тему и подтвердить адрес доставки

  1. Выполните TGAccounts, чтобы выбрать разрешённого бота (или используйте автоматический выбор при одном боте).
  2. Выполните TGChats для получения chatid группы.
  3. Выполните TGChatTopics с тем же chatid. Возьмите items[].topicid нужной темы.
  4. Выполните TGSend: to = chatid, topicid = items[].topicid, при необходимости botid и serviceid.
  5. Проверьте result.ok в ответе и получение тестового сообщения в нужной теме.

Список TGChatTopics — это локально сохранённые темы, а не универсальный онлайн-перечень всех тем Telegram. Если тема не попала в накопитель, отсутствие её в списке не доказывает, что её нет в Telegram: ID можно получить из события message.message_thread_id или через интерфейс администратора при создании темы. Отправка по известному topicid не требует предварительной записи темы в этот накопитель.

6. Примеры ответов и работы с несколькими ботами

Получить доступные боты

{"error":"","bots":[{"botId":"7412345678","name":"Новости"},{"botId":"7523456789","name":"Поддержка"}],"count":2,"botIdRequired":true,"canCreate":false}

Запрос списка чатов без ID при двух ботах

{"error":"bot_id_required","availableBots":[{"botId":"7412345678","name":"Новости"},{"botId":"7523456789","name":"Поддержка"}]}

Повторный запрос с Telegram ID

curl -X POST 'https://api.binuke.info/api.php' \
  --data-urlencode 'json={"mode":"TGChats","license":"YOUR_LICENSE","botid":"7523456789","page":1,"limit":50}'
{"error":"","botId":"7523456789","items":[{"chatid":"-1001234567890","name":"Группа поддержки","added":1791912000}],"page":1,"limit":50,"hasMore":false}

Один бот — тот же запрос без botid

{"mode":"TGUsers","license":"YOUR_LICENSE","page":1,"limit":50}

Отправить сообщение от имени выбранного бота

{"mode":"TGSend","license":"YOUR_LICENSE","botid":"7412345678","to":"123456789","body":"Привет!"}

Если выбрана чужая учётная запись, метод вернёт bot_not_allowed. В ответе нет внутренних ID BiNuke, токенов и конфигураций пересылок. Сервер всегда проверяет права лицензии до обращения к данным или Telegram.

7. Готовые сценарии интеграции и ограничения

7.1. Старт проекта с одним ботом

{"mode":"TGAccounts","license":"YOUR_LICENSE"}
{"mode":"TGChats","license":"YOUR_LICENSE","page":1,"limit":50}
{"mode":"TGUsers","license":"YOUR_LICENSE","page":1,"limit":50}

Это три отдельных POST-запроса в поле json. Один назначенный бот выбирается автоматически.

7.2. Список тем и пример его структуры

Запрос:
{"mode":"TGChatTopics","license":"YOUR_LICENSE","chatid":"-1001234567890","page":1,"limit":50}

Типовой ответ:
{"error":"","chatid":"-1001234567890","items":[{"topicid":"357","name":"Заказы"},{"topicid":"401","name":"Бухгалтерия"}],"page":1,"limit":50,"hasMore":false}

chatid обозначает группу, topicid — тему. Если у лицензии больше одного бота, добавьте реальный botid к запросу TGChatTopics, как и к TGSend.

7.3. Пользователи, которые писали боту

TGUsers и TGUserInfo читают новый накопитель binuketgusers, который пополняется только будущими входящими событиями с установленным ботом. Это не список всех подписчиков Telegram и не результат обхода миллиона старых webhook-записей. userid — Telegram ID пользователя; serviceid — ID аккаунта вашей системы, они не заменяют друг друга.

7.4. История исходящих и serviceid

TGOutgoingRecent возвращает исходящие этой лицензии через выбранного бота, в том числе serviceid каждой записи. Он не является фильтром доставки и не предоставляет отдельного API «получить все сообщения филиала X»: для такого отчёта внешний проект может фильтровать полученные записи сам либо понадобится отдельный серверный метод. В текущем ответе TGOutgoingRecent нет отдельного поля topicid; подтверждение фактической темы можно получать из ответа отправки Telegram, если он её возвращает.

7.5. Чаты, темы и права доступа

Бот должен иметь доступ к нужному чату; для публикации в теме Telegram должен разрешать отправку. Внешний botid нельзя подменить внутренним ID или произвольным ID другого бота. Если бот один — botid опускается; если несколько — API вернёт bot_id_required. Вся адресация to/topicid относится к выбранному боту.

7.6. Какие операции читать безопасно, а какие изменяют состояние

TGAccounts, TGChats, TGChatInfo, TGChatTopics, TGUsers, TGUserInfo, TGOutgoingRecent и TGWebhookStatus только читают сведения. TGSend отправляет сообщение; TGWebhookEnsure меняет webhook; TGAccountCreate подключает бота — эти операции не следует вызывать ради проверки документации. TGIncomingRecent читает большой исторический журнал и не предназначен для частого опроса.

7.7. Технические оговорки

8. Основные ошибки

errorЗначение / действие
bot_id_requiredРазрешено несколько ботов; выберите botId из availableBots.
bot_not_allowedПереданный Telegram ID не разрешён этой лицензии.
invalid_topicidНеверный ID темы в TGSend; передайте положительное целое topicid или полностью опустите поле.
invalid_botidПоле botid не является корректной строкой десятичных цифр Telegram Bot ID.
dedicated_bot_requiredВыделенный бот не назначен; накопители и webhook не доступны стандартной лицензии.
telegram_forbiddenTelegram полностью отключён в лицензии.
bot_identity_unavailableДля назначенного бота нельзя установить реальный Telegram ID из настроек; проверьте его токен/настройку в админке.
bot_identity_conflictДве внутренних записи одного и того же Telegram-бота назначены одной лицензии.
personal_bot_creation_not_allowedСоздание собственного бота не разрешено администратором.
run_telegram_install_firstНе выполнен установочный скрипт с таблицей дополнительных назначений.

9. Для сотрудников BiNuke

Привязки редактируются в административном разделе BiNukeTGLicenses: можно назначить несколько существующих ботов и отдельно включить «Разрешить TGAccountCreate». Старое поле binukelicens.tgaccid сохраняется для основного бота; дополнительные назначения хранятся в binuketglicensebots. Реальный Bot ID хранится в binuketgaccounts.telegramid (VARCHAR), а для старых записей определяется из числового префикса токена.

При самостоятельном подключении через TGAccountCreate вызывается Telegram getMe, проверяется идентичность токена, сохраняется назначение лицензии и запускается штатная установка webhook. Ранее назначенные боты не снимаются. Изменение выданных прав выполняет только администратор; лицензия не может назначить себе чужого бота по его ID.

Никакой обработки старых webhook: накопитель binuketgusers продолжает собирать только новые события с установленным ID бота. Исторический миллионный журнал не перечитывается и не пересвязывается. Для отправленных сообщений сохраняется ограничение по проекту и боту.

Контракт отправки в темы: topicid → Telegram message_thread_id. Контракт внутренних подразделений: serviceid → binuketg.serviceid. Не путать при поддержке внешних разработчиков.

Это спецификация релиза; после развёртывания необходимо провести проверку на рабочей MySQL и на тестовых ботах Telegram. Реальный вызов TGWebhookEnsure изменяет webhook. Ссылку на справку можно передавать разработчикам без лицензий и токенов.