Users

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

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

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

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


Пример: как спарсить всех пользователей

Чтобы получить всех пользователей бота, нужно обходить список по страницам: вызывать index с limit и offset, пока в ответе есть записи. Лимит на одну страницу — не более 500 записей.

Алгоритм

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

Пример

$baseUrl = 'https://your-api.com/v1/bot/user';
$botId = 1;
$limit = 500;
$allUsers = [];
$offset = 0;

do {
    $payload = [
        'bot_id'     => $botId,
        'botToken'   => 'YOUR_BOT_TOKEN',
        'secretKey'  => 'YOUR_SECRET_KEY',
        'limit'      => $limit,
        'offset'     => $offset,
    ];

    $ch = curl_init($baseUrl . '/index');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($payload),
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
        CURLOPT_RETURNTRANSFER => true,
    ]);
    $response = curl_exec($ch);
    curl_close($ch);

    $json = json_decode($response, true);
    if (empty($json['result'])) {
        throw new RuntimeException($json['message'] ?? 'API error');
    }

    $chunk = $json['data'] ?? [];
    $allUsers = array_merge($allUsers, $chunk);
    $offset += $limit;

} while (count($chunk) === $limit);

// $allUsers — массив всех пользователей
import requests

BASE_URL = 'https://your-api.com/v1/bot/user'
BOT_ID = 1
LIMIT = 500

def fetch_all_users():
    session = requests.Session()
    session.headers.update({'Content-Type': 'application/json'})
    
    payload = {
        'bot_id': BOT_ID,
        'botToken': 'YOUR_BOT_TOKEN',
        'secretKey': 'YOUR_SECRET_KEY',
        'limit': LIMIT,
        'offset': 0,
    }
    
    all_users = []
    offset = 0
    
    while True:
        payload['offset'] = offset
        response = session.post(f'{BASE_URL}/index', json=payload)
        response.raise_for_status()
        data = response.json()
        
        if not data.get('result'):
            raise RuntimeError(data.get('message', 'API error'))
        
        chunk = data.get('data') or []
        all_users.extend(chunk)
        
        if len(chunk) < LIMIT:
            break
        offset += LIMIT
    
    return all_users


if __name__ == '__main__':
    users = fetch_all_users()
    print(f'Всего пользователей: {len(users)}')
const BASE_URL = 'https://your-api.com/v1/bot/user';
const BOT_ID = 1;
const LIMIT = 500;

const body = {
    bot_id: BOT_ID,
    botToken: 'YOUR_BOT_TOKEN',
    secretKey: 'YOUR_SECRET_KEY',
    limit: LIMIT,
    offset: 0
};

const allUsers = [];

async function fetchAllUsers() {
    let offset = 0;
    let hasMore = true;

    while (hasMore) {
        body.offset = offset;
        const response = await fetch(`${BASE_URL}/index`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(body)
        });
        const json = await response.json();

        if (!json.result) {
            throw new Error(json.message || 'API error');
        }

        const chunk = json.data || [];
        allUsers.push(...chunk);
        hasMore = chunk.length === LIMIT;
        offset += LIMIT;
    }

    return allUsers;
}

fetchAllUsers().then(users => {
    console.log('Всего пользователей:', users.length);
});

Пример с предварительным count (узнать общее число)

// Сначала получаем количество
const countResponse = await fetch(`${BASE_URL}/count`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
        bot_id: BOT_ID,
        botToken: 'YOUR_BOT_TOKEN',
        secretKey: 'YOUR_SECRET_KEY'
    })
});
const countJson = await countResponse.json();
const total = parseInt(countJson.data, 10);

// Дальше цикл по offset до total (или пока data не пустой)

Важно: сохраняйте одни и те же фильтры в count и в index, иначе число и список могут не совпадать. Между запросами при большом объёме данных можно делать небольшую паузу (например, 100–200 ms), чтобы не перегружать API.


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

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