В своем аккаунте на Хабре я опубликовал статью, про массовое создание профилей для антидетект браузера для мультиаккаунтинга, через АПИ. Там написано решение на Python, и я решил продублировать код на Node JS, чтобы увеличить вариативность. Собственно вот этот код:
Вам знакомо чувство легкой неопределенности, когда очередной аккаунт отправляется в бан без видимых причин? Алгоритмы безопасности платформ становятся умнее, анализируя не только IP-адреса, но и сотни микропараметров вашего устройства — так называемый Browser Fingerprint. Даже при полном совпадении аппаратной части у двух пользователей, разница в версиях драйверов генерирует разные математические результаты отрисовки (например, через Canvas API). Качественная изоляция профилей требует не простой блокировки скриптов, а подмены этих данных на уровне ядра. Именно это и делают антидетект браузеры, храня каждый профиль в полностью изолированной песочнице.
#!/usr/bin/env node
/**
* Batch create Octo Browser profiles in Node.js:
* - proxies from proxies.csv
* - optional cookies from cookies.json
* - Octo auto-generates fingerprint from stub
* - Number of profiles via PROFILE_COUNT env (default: number of proxies)
*/
const fs = require('fs');
const path = require('path');
const dotenv = require('dotenv');
const axios = require('axios');
const { parse } = require('csv-parse/sync'); // для csv-parse v5+
// ─────────────── CONFIG ───────────────
dotenv.config();
const API_BASE = 'https://app.octobrowser.net/api/v2/automation';
const REQ_TIMEOUT = 30000; // ms
const PAUSE = 500; // ms
const DEFAULT_FP = { os: 'win', screen: '1920x1080' };
const BASE_DIR = path.resolve(__dirname);
const TOKEN = process.env.OCTO_API_TOKEN;
if (!TOKEN) {
console.error('🛑 Specify OCTO_API_TOKEN in .env');
process.exit(1);
}
const HEADERS = { 'X-Octo-Api-Token': TOKEN };
const PROXY_CSV = path.join(BASE_DIR, process.env.PROXY_FILE || 'proxies.csv');
const COOKIE_JSON = path.join(BASE_DIR, process.env.COOKIE_FILE || 'cookies.json');
const PROFILE_COUNT = Number(process.env.PROFILE_COUNT || '0'); // 0 = use proxies.length
// ─────────────── UTILITIES ───────────────
function loadProxiesSync(file) {
if (!fs.existsSync(file)) {
console.error('🛑 Proxies file not found:', file);
process.exit(1);
}
const csvContent = fs.readFileSync(file, 'utf8');
let records;
try {
records = parse(csvContent, {
columns: true,
skip_empty_lines: true,
trim: true,
delimiter: ','
});
} catch (err) {
console.error('🛑 Error parsing proxies.csv:', err.message);
process.exit(1);
}
if (!records.length) {
console.error('🛑 No proxies loaded');
process.exit(1);
}
// auto-fix поля
for (const row of records) {
if (!row.port || isNaN(Number(row.port))) {
console.error('🛑 Invalid proxy row:', row);
process.exit(1);
}
row.port = Number(row.port);
// login → username (если вдруг не совпадает)
if (row.login && !row.username) {
row.username = row.login;
}
// type (Octo требует строго http/socks5/socks4)
if (!row.type) {
row.type = 'http'; // можно заменить на socks5 если у вас SOCKS-прокси
}
}
return records;
}
function loadCookies(file) {
if (!fs.existsSync(file)) return {};
const data = JSON.parse(fs.readFileSync(file, 'utf8'));
if (typeof data !== 'object' || Array.isArray(data)) {
console.error('🛑 cookies.json must be a JSON object');
process.exit(1);
}
return data;
}
async function apiPost(endpoint, payload) {
const url = `${API_BASE}/${endpoint.replace(/^\//, '')}`;
const response = await axios.post(url, payload, {
headers: HEADERS,
timeout: REQ_TIMEOUT,
validateStatus: status => status < 500, // не выбрасываем по 400/201
});
// 201 - Created, 200 - OK — оба считаем успехом
if (![200, 201].includes(response.status) || !response.data) {
throw new Error(
`HTTP ${response.status} → ${(response.data && response.data.message) || response.statusText}`
);
}
// Ответ Octo: data либо в .data.data, либо в .data
return response.data.data || response.data;
}
// ─────────────── MAIN ───────────────
async function main() {
const proxies = loadProxiesSync(PROXY_CSV);
const cookiesMap = loadCookies(COOKIE_JSON);
const total = PROFILE_COUNT > 0 ? PROFILE_COUNT : proxies.length;
let proxyIdx = 0;
for (let idx = 1; idx <= total; idx++) {
const proxy = proxies[proxyIdx];
proxyIdx = (proxyIdx + 1) % proxies.length;
const title = `BatchProfile_${idx}`;
const cookies = cookiesMap[String(idx - 1)];
const payload = { title, proxy, fingerprint: DEFAULT_FP };
if (cookies) payload.cookies = cookies;
try {
const data = await apiPost('profiles', payload);
console.log(`✅ Profile #${idx} created → UUID ${data.uuid || JSON.stringify(data)}`);
} catch (err) {
if (err.response) {
console.error(`❌ HTTP error for profile #${idx}: HTTP ${err.response.status} → ${err.message}`);
console.error(' Server response:', JSON.stringify(err.response.data, null, 2));
} else {
console.error(`❌ HTTP error for profile #${idx}: ${err.message}`);
}
}
await new Promise(resolve => setTimeout(resolve, PAUSE));
}
}
// ─────────────── ENTRY ───────────────
main().catch(e => {
console.error('🛑 Fatal error:', e.message);
process.exit(1);
});
Этот скрипт уже выложен в моем Гитхаб — антидетект браузер для мультиаккаутинга.
- Подготовка: API антидетект браузера для мультиаккаунтинга и исходные данные для запуска скрипта
- Загрузка переменных окружения
- Чтение и парсинг CSV-файла с прокси
- Загрузка дополнительных cookies (по необходимости)
- Подготовка и отправка API-запросов
- Обработка ответов от API антидетект браузера Octo
- Гибкая работа с лимитами
- Как добиться максимального результата от профилей?
- Архитектурные плюсы
Подготовка: API антидетект браузера для мультиаккаунтинга и исходные данные для запуска скрипта
| Технология | Описание | Принцип работы и значение |
|---|---|---|
| Browser Fingerprint | Совокупность данных браузера | Хеширует параметры системы для трекинга сессий |
| Canvas API | Интерфейс рендеринга графики | Анализирует пиксельный рендер для детекта видеокарты |
| Server / Mobile Proxy | Маршрутизация трафика | Подмена IP-адреса на статический корпоративный или динамический пул провайдера |
| Automation API | Программный интерфейс | Позволяет масштабировать задачи через скрипты без рутины |
Чтобы скрипт мог генерировать профили, потребуется API‑ключ (токен). В антидетект браузере Octo это реализовано не самым удобным образом — токен можно получить только в десктопном приложении (веб‑интерфейс не поддерживает, и это реально не всем нравится). После получения токена — просто скопируйте его, он потребуется для авторизации всех API‑запросов.

Что ещё понадобится:
- Список прокси-серверов. Прокси можно купить на любом сервисе, где удобно брать выгрузку пакетом. Формат CSV‑файла такой:
type,host,port,username,password, где:- type: http/https или socks5 (строго обязательно! Антидетект браузер Octo не примет строку без типа)
- host: IP или домен прокси
- port: порт
- username: логин прокси
- password: пароль
Пример строки:http,192.0.2.10,24000,mylogin,mypass
Каждая строка — отдельный прокси. Если не указать тип, API антидетект браузера Octo вернет ошибку 400.
- Cookie-файлы (опционально). Если нужно сразу импортировать
cookies(например, чтобы обойти повторный вход), создайте файлcookies.json. Это обычный JSON-объект:- Ключ — порядковый номер профиля (с нуля)
- Значение — массив куки для этого профиля (со всеми стандартными полями: name, value, domain, path, expiry и т.д.). Пример:
{
"0": [ { "name": "...", "value": "...", "domain": "...", ... } ],
"1": [ { "name": "...", "value": "...", "domain": "...", ... } ]
}

Если файл с куки не нужен — просто не создавайте его, скрипт проигнорирует этот шаг.
Переменные окружения
Создайте файл .env в папке со скриптом. Пример:
OCTO_API_TOKEN=<ваш токен>
PROXY_FILE=proxies.csv # имя файла с прокси, если не дефолтное
COOKIE_FILE=cookies.json # имя файла с куки (если используется)
PROFILE_COUNT=0 # сколько профилей создать (0 -- по числу прокси)
Если PROFILE_COUNT больше числа прокси — прокси начнут повторяться по кругу.
Node.js‑окружение
Скрипт написан на Node.js, так что понадобится установленный Node.js (поддерживается любая современная версия, лучше LTS). Не забудьте поставить зависимости (один раз):
npm install dotenv axios csv-parse
- Больше ничего не требуется — запуск происходит командой node имя_файла.js.
Как работает скрипт для массовой генерации профилей в антидетект браузере для мультиаккаунтинга
Загрузка переменных окружения
Скрипт читает конфигурацию из файла .env, включая API-токен антидетект браузера Octo и другие параметры. Это позволяет хранить чувствительные данные вне кода и легко управлять развертыванием скрипта на разных машинах.
Чтение и парсинг CSV-файла с прокси
Основные параметры для создания профилей — прокси-серверы, которые загружаются из файла proxies.csv. Для парсинга используется синхронная функция из пакета csv-parse/sync, что гарантирует совместимость со всеми популярными форматами CSV.
Скрипт автоматически обрабатывает возможные варианты заголовков (например, login или username) и гарантирует наличие всех обязательных полей, включая тип прокси (type: http, socks5, socks4). Если каких-то данных не хватает — они автоматически добавляются или выводится понятная ошибка.
Выбор протокола маршрутизации критически влияет на уровень доверия со стороны антифрод-систем.
🖥️
Обеспечивают высокую пропускную способность и стабильное соединение. Однако, эти адреса принадлежат дата-центрам. При парсинге жесткие алгоритмы защиты (например, у Aviasales или крупных соцсетей) быстро вычисляют и блокируют такие IP-адреса. Для менее строгих площадок это по-прежнему отличное и экономичное решение.
Существует мнение, что создание собственной фермы маршрутизаторов на базе 4G-модемов экономически выгоднее аренды. Этот контраргумент справедлив для долгосрочных проектов с большим потреблением трафика. Но нужно учитывать затраты времени на обслуживание (сбои модемов, зависания USB-хабов, написание своих скриптов ротации). Для небольших команд аренда готовых решений часто эффективнее.
Загрузка дополнительных cookies (по необходимости)
Если в директории есть файл cookies.json, скрипт подтягивает набор cookies для каждого создаваемого профиля. Это удобно для переноса сессий, авторизаций или индивидуальных параметров браузера.
Подготовка и отправка API-запросов
Для каждого прокси-адреса формируется отдельный payload — это набор данных, описывающий профиль:
- title — уникальное название профиля (например,
BatchProfile_1) - proxy — параметры выбранного прокси (
host, port, username, password, type) - fingerprint — заготовленные параметры окружения (например, ОС, разрешение экрана)
- cookies — индивидуальные cookies, если заданы
Запрос отправляется методом POST на эндпоинт /profiles официального API Octo Browser. Для HTTP-запросов используется axios, с явным управлением тайм-аутами и заголовками.
Обработка ответов от API антидетект браузера Octo
Скрипт поддерживает оба типа успешных ответов:
- 201 Created
- 200 OK
Однако, так как антидетект браузер Octo отдает 201 ответ, то его в целом достаточно. Но если понадобиться переработать скрипт для другого антика, он также поддерживает и 200 ответ.
В случае успеха в консоль выводится UUID созданного профиля. Если антидетект браузер Octo возвращает ошибку (например, невалидные параметры, превышение лимита и пр.), скрипт не завершает работу аварийно, а выводит подробное сообщение об ошибке и продолжает обработку остальных профилей.

Гибкая работа с лимитами
Количество создаваемых профилей задаётся переменной окружения PROFILE_COUNT — можно создать ровно столько профилей, сколько нужно, независимо от числа прокси в файле. Если не задано — будет создано столько профилей, сколько строк в прокси-файле.
Как добиться максимального результата от профилей?
Оптимизация рабочих процессов требует внедрения программных скриптов и строгой сегментации сессий. Автоматизация снижает риск человеческой ошибки при управлении сотнями аккаунтов.
Использование Python Automation API (или Node.js аналогов вроде Playwright/Puppeteer) переводит управление аккаунтами на новый уровень эффективности. Программные библиотеки позволяют писать скрипты для автоматического прогрева профилей, сбора данных или публикации контента. Корректно написанный скрипт способен эмулировать паттерны поведения реального человека, делая паузы при чтении текста и случайным образом перемещая курсор.
- Детект мыши Многие антифрод-системы детектируют автоматизацию по неестественно ровным траекториям движения курсора, генерируемым базовыми библиотеками автоматизации. Рандомизация обязательна.
- Шрифты Подмена шрифтов происходит путем добавления невидимых символов в системные библиотеки, а не их полным удалением.
- WebGL Использование WebGL noise-модулей может снижать производительность рендеринга страниц на слабых процессорах.
Архитектурные плюсы
- Скрипт можно запускать как в локальной среде, так и на сервере, без дополнительной настройки.
- Всё логирование адаптировано под массовую эксплуатацию: ошибки видны сразу, успешные UUID выводятся без лишнего шума.
- Код легко масштабируется и расширяется под любые задачи, связанные с массовым управлением профилями браузера.
«Не пытайтесь скрыть все параметры устройства. Выделяющийся пустой профиль вызывает у алгоритмов больше подозрений, чем профиль со стандартными настройками популярной видеокарты. Тестирование прокси-серверов перед запуском масштабных кампаний экономит десятки часов на восстановление заблокированных аккаунтов. Маршрутизация — это фундамент изоляции.»
Если нужно за пару минут развернуть массовое создание профилей в Octo Browser — это идеальное решение. Вы сможете автоматизировать рутину и начать работу с профилями на уровне API, без ручных кликов и монотонной настройки.








