Пользователи

Аутентификация

Все методы требуют передачи в запросе GET (Один из видов токена)

  • botToken — токен бота
  • secretKey — секретный ключ

Базовый путь: /v1/bot/user/


API пользователей бота

Авторизация

Все методы — POST с телом JSON.

ПараметрГдеОбязательностьОписание
bot_idтелодаID бота в системе BOT-T (таблица bots_bot)
token или botTokenquery или телода*Токен бота (Bot API token)
secretKeyqueryда*Секретный ключ бота (альтернатива токену)

* Достаточно либо token/botToken, либо secretKey.

Заголовки:

Content-Type: application/json

Базовый URL

https://api.bot-t.com

Формат ответа:

{ "result": true, "data": ... }
{ "result": false, "message": "текст ошибки" }

Всегда проверяйте result === true перед использованием data.

Лимит запросов: 120 запросов в минуту с одного IP. (Cloudflare может ограничить быстрее)


Основные методы для получения пользователей

МетодURLНазначение
indexPOST /v1/bot/user/indexСписок пользователей (с пагинацией и фильтрами)
countPOST /v1/bot/user/countКоличество пользователей по тем же фильтрам
viewPOST /v1/bot/user/viewОдин пользователь по user_id (id из bots_bot_user)
view-by-telegram-idPOST /v1/bot/user/view-by-telegram-idОдин пользователь по Telegram ID
view-by-user-idPOST /v1/bot/user/view-by-user-idОдин пользователь по системному user_id (таблица users)
referralsPOST /v1/bot/user/referralsСписок рефералов пользователя

POST /v1/bot/user/index — список пользователей

Параметры тела

ПолеТипПо умолчаниюОписание
bot_idintegerID бота (обязательно)
limitinteger25Записей на страницу, максимум 500
offsetinteger0Сколько записей пропустить (пагинация)
statusinteger[]Фильтр по статусам (см. таблицу ниже)
sort_idstringDESCСортировка по id: ASC или DESC
sort_telegram_idstringСортировка по Telegram ID
sort_created_timestringСортировка по дате создания
sort_updated_timestringСортировка по дате обновления
sort_balancestringСортировка по балансу
idintegerID записи пользователя бота (bots_bot_user.id)
ref_idintegerID реферера
created_time_startstringНачало периода создания (часовой пояс бота)
created_time_endstringКонец периода создания
updated_time_startstringНачало периода обновления
updated_time_endstringКонец периода обновления
min_balancenumberМинимальный баланс (в рублях/единицах, не в копейках)
max_balancenumberМаксимальный баланс
user_idintegerСистемный ID пользователя (users.id)
typeintegerТип пользователя Telegram
telegram_idintegerTelegram ID

Если указано несколько sort_*, применяется последний переданный параметр сортировки.
По умолчанию сортировка: id DESC.

Статусы пользователя (status)

IDКонстантаОписание
1SYSTEM_ACTIVEАктивный
2SYSTEM_NOT_ACTIVEНеактивный
3SYSTEM_BANЗаблокирован
4SYSTEM_MANAGERМенеджер
5SYSTEM_NOT_VERIFIEDНе верифицирован
6SYSTEM_FIDUCIARYДоверенный

Пример фильтра только активных:

{
  "bot_id": 1,
  "status": [1],
  "limit": 100,
  "offset": 0
}

Структура элемента ответа (BotUserDto)

{
  "id": 123,
  "bot_id": 1,
  "user": {
    "id": 100500,
    "telegram_id": 182352323552,
    "username": "username",
    "first_name": "Иван",
    "last_name": "Иванов",
    "link": "<a href='tg://user?id=182352323552'>Иван</a>",
    "type": "private"
  },
  "ref": null,
  "money": 15000,
  "status": {
    "id": 1,
    "title": "Активный"
  },
  "create_at": 1716288000,
  "created_time": "2024-05-21 12:00:00",
  "update_at": 1716374400,
  "updated_time": "2024-05-22 12:00:00",
  "expectation": null,
  "secret_user_key": "k7f3a9b2c1d4e5f6"
}
ПолеОписание
idID пользователя в контексте бота (bots_bot_user.id) — используйте в view, add-balance и т.д.
user.idСистемный ID (users.id)
user.telegram_idTelegram ID
moneyБаланс в минимальных единицах (копейки). Для отображения: money / 100
refДанные реферера (UserDto) или null

Пример успешного ответа

{
  "result": true,
  "data": [
    { "id": 123, "bot_id": 1, "user": { "...": "..." }, "money": 0, "status": { "id": 1, "title": "Активный" } }
  ]
}

POST /v1/bot/user/count — количество

Те же фильтры, что у index, но без limit, offset и сортировки.

{
  "result": true,
  "data": "1542"
}

Значение data — строка с числом.


Алгоритм: выгрузить всех пользователей

  1. Вызвать count с нужными фильтрами → получить общее число.
  2. В цикле вызывать index с limit=500 (максимум) и увеличивать offset на limit.
  3. Останавливаться, когда data пустой или offset >= count.

Примеры кода

Замените константы на свои значения:

API_BASE   = https://api.example.com
BOT_ID     = 1
BOT_TOKEN  = 123456789:ABCdefGHI...

PHP

<?php

const API_BASE = 'https://api.example.com';
const BOT_ID = 1;
const BOT_TOKEN = '123456789:ABCdefGHI...';

/**
 * POST-запрос к API пользователей бота.
 */
function botUserRequest(string $action, array $body): array
{
    $url = API_BASE . '/v1/bot/user/' . $action . '?token=' . urlencode(BOT_TOKEN);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
        CURLOPT_POSTFIELDS => json_encode(array_merge(['bot_id' => BOT_ID], $body)),
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    if (!is_array($data) || ($data['result'] ?? false) !== true) {
        throw new RuntimeException($data['message'] ?? 'API error');
    }

    return $data['data'];
}

/** Получить одну страницу пользователей */
function fetchUsersPage(int $limit = 500, int $offset = 0, array $filters = []): array
{
    return botUserRequest('index', array_merge($filters, [
        'limit' => $limit,
        'offset' => $offset,
    ]));
}

/** Выгрузить всех пользователей с пагинацией */
function fetchAllUsers(array $filters = []): array
{
    $limit = 500;
    $offset = 0;
    $all = [];

    do {
        $page = fetchUsersPage($limit, $offset, $filters);
        if (empty($page)) {
            break;
        }
        $all = array_merge($all, $page);
        $offset += $limit;
    } while (count($page) === $limit);

    return $all;
}

// --- Использование ---

// Одна страница (25 пользователей по умолчанию)
$users = fetchUsersPage(25, 0, ['status' => [1]]);

// Все активные пользователи
$allActive = fetchAllUsers(['status' => [1]]);

foreach ($allActive as $botUser) {
    $tgId = $botUser['user']['telegram_id'] ?? null;
    $balance = ($botUser['money'] ?? 0) / 100;
    echo "BotUser #{$botUser['id']}, TG: {$tgId}, balance: {$balance}\n";
}

// Количество
$count = (int) botUserRequest('count', ['status' => [1]]);
echo "Active users: {$count}\n";

// Один пользователь по Telegram ID
$one = botUserRequest('view-by-telegram-id', ['telegram_id' => 182352323552]);

JavaScript (Node.js, fetch)

const API_BASE = 'https://api.example.com';
const BOT_ID = 1;
const BOT_TOKEN = '123456789:ABCdefGHI...';

async function botUserRequest(action, body = {}) {
  const url = `${API_BASE}/v1/bot/user/${action}?token=${encodeURIComponent(BOT_TOKEN)}`;

  const response = await fetch(url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ bot_id: BOT_ID, ...body }),
  });

  const json = await response.json();
  if (!json.result) {
    throw new Error(json.message || 'API error');
  }
  return json.data;
}

async function fetchUsersPage(limit = 500, offset = 0, filters = {}) {
  return botUserRequest('index', { limit, offset, ...filters });
}

async function fetchAllUsers(filters = {}) {
  const limit = 500;
  let offset = 0;
  const all = [];

  while (true) {
    const page = await fetchUsersPage(limit, offset, filters);
    if (!page.length) break;

    all.push(...page);
    offset += limit;

    if (page.length < limit) break;
  }

  return all;
}

// --- Использование ---

(async () => {
  // Одна страница
  const page = await fetchUsersPage(100, 0, { status: [1] });
  console.log(`Loaded ${page.length} users`);

  // Все активные
  const users = await fetchAllUsers({ status: [1] });
  for (const u of users) {
    const tgId = u.user?.telegram_id;
    const balance = (u.money ?? 0) / 100;
    console.log(`#${u.id} TG:${tgId} balance:${balance}`);
  }

  // Количество
  const count = parseInt(await botUserRequest('count', { status: [1] }), 10);
  console.log('Total active:', count);
})();

Python 3

import requests

API_BASE = 'https://api.example.com'
BOT_ID = 1
BOT_TOKEN = '123456789:ABCdefGHI...'


def bot_user_request(action: str, body: dict = None) -> dict:
    url = f'{API_BASE}/v1/bot/user/{action}'
    params = {'token': BOT_TOKEN}
    payload = {'bot_id': BOT_ID, **(body or {})}

    response = requests.post(
        url,
        params=params,
        json=payload,
        headers={'Content-Type': 'application/json'},
        timeout=30,
    )
    response.raise_for_status()
    data = response.json()

    if not data.get('result'):
        raise RuntimeError(data.get('message', 'API error'))

    return data['data']


def fetch_users_page(limit: int = 500, offset: int = 0, **filters) -> list:
    return bot_user_request('index', {'limit': limit, 'offset': offset, **filters})


def fetch_all_users(**filters) -> list:
    limit = 500
    offset = 0
    all_users = []

    while True:
        page = fetch_users_page(limit=limit, offset=offset, **filters)
        if not page:
            break
        all_users.extend(page)
        offset += limit
        if len(page) < limit:
            break

    return all_users


if __name__ == '__main__':
    # Одна страница
    page = fetch_users_page(limit=100, offset=0, status=[1])
    print(f'Loaded {len(page)} users')

    # Все активные пользователи
    users = fetch_all_users(status=[1])
    for u in users:
        tg_id = (u.get('user') or {}).get('telegram_id')
        balance = (u.get('money') or 0) / 100
        print(f"#{u['id']} TG:{tg_id} balance:{balance}")

    # Количество
    count = int(bot_user_request('count', {'status': [1]}))
    print('Total active:', count)

    # По Telegram ID
    one = bot_user_request('view-by-telegram-id', {'telegram_id': 182352323552})
    print(one)

Примеры фильтрации

Пользователи с балансом от 100 до 1000 руб.

{
  "bot_id": 1,
  "min_balance": 100,
  "max_balance": 1000,
  "limit": 500,
  "offset": 0
}

Зарегистрированные за период

{
  "bot_id": 1,
  "created_time_start": "2024-01-01 00:00:00",
  "created_time_end": "2024-12-31 23:59:59",
  "sort_created_time": "ASC"
}

Конкретный Telegram ID

{
  "bot_id": 1,
  "telegram_id": 182352323552
}

Типичные ошибки

СообщениеПричина
bot_id not foundНе передан bot_id в теле
token not foundНет token/botToken и нет secretKey
token is not validНеверный токен
secretKey is not validНеверный secretKey
tariff have been premiumДля бота нужен премиум-тариф
sortAmount should be ASC or DESCНеверное значение параметра сортировки

Дополнительные методы (кратко)

МетодОписание
add-balanceНачислить баланс (user_id, sum, comment)
subtract-balanceСписать баланс
banЗабанить / разбанить
deleteУдалить пользователя
set-refНазначить реферера (id, ref_id)
zero-balanceОбнулить баланс
zero-refСбросить реферера
chats-channels-listСписок чатов и каналов бота

Полная спецификация OpenAPI: /docs/swagger.yaml или Swagger UI на вашем API-хосте.


Важные замечания

  1. user_id в разных методах означает разное:

    • в index (фильтр) — системный ID (users.id);
    • в view, add-balance, referrals — ID записи бота (bots_bot_user.id).
  2. Баланс: в фильтрах min_balance/max_balance передаётся в рублях (дробное число), в ответе money — в копейках.

  3. Даты фильтров интерпретируются в часовом поясе бота.

  4. Пагинация: при выгрузке больших баз используйте limit=500 и не превышайте лимит 120 req/min.

  5. Авторизация через secretKey: передайте ключ в query вместо токена:
    POST /v1/bot/user/index?secretKey=YOUR_SECRET_KEY


Формат ответов

  • Успех: { "result": true, "data": <данные> }
  • Ошибка: { "result": false, "message": "<текст ошибки>" } (или аналог через ApiHelper::errorNew())