Как настроить автоматический фарминг аккаунтов в антидетект браузере через API: практический кейс и полноценный скрипт для автоматического создания профилей

Как настроить автоматический фарминг аккаунтов в антидетект браузере через API: практический кейс и полноценный скрипт для автоматического создания профилей

У меня есть статья, в которой я рассказываю про безопасность в арбитраже трафика - и, как это часто бывает, одно исследование развернулось в целую серию статей, как говориться, чет меня понесло и уже было не остановить. По ходу работы, я собрал два утилитарных скрипта, которые снимают необходимость ручной работы при работе с антидетект-браузером через API. Оба скрипта являются своего рода стартовой точкой для дальнейшей работы и мне кажется, наилучший подход с их использованием - фарминг аккаунтов.

Первый скрипт пачками создаёт профили (с авто-фингерпринтами или вашими подготовленными отпечатками браузера), второй - стартует эти профили из терминала, минуя GUI, и подключается к ним для базовых проверок. Для новичков и "продвинутых новичков" в автоматизации - самое то, чтобы освоить API-подход и нарастить собственные пайплайны. Ну и можно накодить (навайбкодить) что то поверх этой базы. В общем по ходу разберетесь, но скрипты, как по мне получились неплохими.

Зачем вообще автоматизировать создание профилей в антидетект браузере? Фарминг аккаунтов!

Когда у вас десятки и сотни аккаунтов, вручную это выглядит так: "создать профиль → поставить прокси → установить куки → повторить" выгорает время и повышает вероятность ошибки. Тут ошибся с куками, не те отпечатки сунул, тут вообще напутал с проксями, можно беды наделать еще как. А скрипт с вами так не никогда поступит! Массовое создание через скрипт выглядит так:

  • экономит время и нервы;
  • минимизирует риск ошибки из-за человеческого фактора (напортачить можно перед запуском, тут уже никто за вас не сделает настройку);
  • стандартизирует выпуск профилей под нужный стек.

Если у вас 10–15 сущностей - можно все делать и руками. Но как только масштаб растёт, скрипт выигрывает у массового создания в интерфейсе: гибкость выше, логирование прозрачнее, ошибки ловятся раньше.

Контекст мультиаккаунтинга: базовый стек старта фарминга аккаунтов

В мультиаккаунтинге "золотой стандарт" остаётся тем же: антидетект-браузер + резидентные прокси. Первый маскирует десятки характеристик окружения (от Canvas/WebGL до таймзоны и локали) и изолирует профили так, словно это разные устройства. Вторые закрывают вопрос сетевого происхождения. Скрипт написан под Octo Browser (тариф Base с доступом к API), потому что у меня просто был такой тариф, но скрипт для массового создания профилей можно переделать под любой другой антидетект браузер.

Что именно делаем - как работает скрипт для автоматического создания профилей через Антидетект браузер.

Массово создавать профили по API, каждому назначать прокси и, при необходимости, заливать куки. Затем - стартовать эти профили из CLI и прикрепляться к ним через Selenium для проверок/скриптов и в перспективе фармить аккаунты.

Подготовка окружения и данных

Для начала необходимо все подготовить, конкретно мой скрипт требует следующее для старта:

  1. API-токен. В Octo токен выдаётся в десктопном приложении (да, не в вебе). Он потребуется для каждого запросе через заголовок X-Octo-Api-Token.
  2. Прокси-лист. создаем файл proxies.csv. Формат для скрипта удобен такой: type,host,port,login,password Например: HTTP,192.0.2.10,24000,mylogin,mypass Тип прокси обязателен - иначе API вернёт 400 ошибку.
  3. Куки (опционально). cookies.json с маппингом вида:
{ "0": [{ /* cookies для первого профиля */ }], "1": [{ /* cookies для второго профиля */ }] }

4. Нумерация - с нуля, чтобы удобно стыковать с циклом.

.env конфиг

OCTO_API_TOKEN=<токен Octo> PROXY_FILE=proxies.csv COOKIE_FILE=cookies.json PROFILE_COUNT=0 # 0 → столько, сколько строк в прокси-листе

5. Зависимости - ставятся простой командой, вы же понимаете, что сперва вам нужен Python?

pip install requests python-dotenv

Исходники у меня лежат в публичном репозитории - структура минимальная: скрипт, .env.example, proxies.csv, cookies.json. Собственно сам репозиторий - Скрипт для автоматического создания профилей в антидетект браузере.

Скрипт №1: пакетное создание профилей через API

Ниже - рабочий пример с переименованными сущностями и аккуратной обработкой лимитов (но я все же рекомендую воспользоваться моим репозиторием, для надежности):

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ octo_profiles_batch.py -- массовое создание профилей Octo по API. • Прокси читаются из PROXY_FILE (CSV с заголовком) • Куки подтягиваются из COOKIE_FILE (опционально) • Фингерпринт минимумом: ОС + экран (остальное генерит Octo) • PROFILE_COUNT=0 → создать по числу прокси; иначе -- по заданному количеству """ import os, sys, csv, json, time, itertools from pathlib import Path from typing import Any, Dict, List import requests from dotenv import load_dotenv API_ROOT = "https://app.octobrowser.net/api/v2/automation" TIMEOUT_S = 30 FP_PRESET = {"os": "win", "screen": "1920x1080"} BASE = Path(__file__).parent.resolve() load_dotenv() TOKEN = os.getenv("OCTO_API_TOKEN") or sys.exit("🛑 Нет OCTO_API_TOKEN в .env") HEADERS = {"X-Octo-Api-Token": TOKEN} PROXY_FILE = BASE / os.getenv("PROXY_FILE", "proxies.csv") COOKIE_FILE = BASE / os.getenv("COOKIE_FILE", "cookies.json") PROFILE_COUNT = int(os.getenv("PROFILE_COUNT", "0")) def sniff_delimiter(path: Path) -> csv.Dialect: sample = path.read_text(encoding="utf-8")[:1024] return csv.Sniffer().sniff(sample, delimiters=",;\t ") def read_proxies(path: Path) -> List[Dict[str, Any]]: if not path.exists(): sys.exit(f"🛑 Не найден файл прокси: {path}") dialect = sniff_delimiter(path) rows: List[Dict[str, Any]] = [] with path.open(encoding="utf-8", newline="") as f: reader = csv.DictReader(f, dialect=dialect) for raw in reader: row = {k.strip(): (v.strip() if v else v) for k, v in raw.items() if k} if not row.get("port") or not row.get("type"): sys.exit(f"🛑 Неполная строка прокси: {raw}") row["port"] = str(row["port"]) rows.append(row) if not rows: sys.exit("🛑 Пустой список прокси") return rows def read_cookies(path: Path) -> Dict[str, List[Dict[str, Any]]]: if not path.exists(): return {} data = json.loads(path.read_text(encoding="utf-8")) if not isinstance(data, dict): sys.exit("🛑 cookies.json должен быть JSON-объектом") return data def post_json(endpoint: str, payload: Dict[str, Any]) -> Dict[str, Any]: url = f"{API_ROOT}/{endpoint.lstrip('/')}" r = requests.post(url, json=payload, headers=HEADERS, timeout=TIMEOUT_S) r.raise_for_status() respect_limits(r) return r.json().get("data", {}) def respect_limits(resp: requests.Response) -> None: rpm_left = int(resp.headers.get("x-ratelimit-remaining", 0)) rph_left = int(resp.headers.get("x-ratelimit-remaining-hour", 0)) print(f"[quota] rpm={rpm_left} rph={rph_left}") if rpm_left < 10: time.sleep(60) if rph_left < 10: time.sleep(3600) def main() -> None: proxies = read_proxies(PROXY_FILE) cookies_map = read_cookies(COOKIE_FILE) total = PROFILE_COUNT if PROFILE_COUNT > 0 else len(proxies) cycle = itertools.cycle(proxies) for i in range(1, total + 1): proxy = next(cycle) title = f"Batch_{i:04d}" payload: Dict[str, Any] = {"title": title, "proxy": proxy, "fingerprint": FP_PRESET} if str(i - 1) in cookies_map: payload["cookies"] = cookies_map[str(i - 1)] try: data = post_json("profiles", payload) print(f"✅ #{i} → {data.get('uuid')}") except requests.HTTPError as e: print(f"❌ HTTP {e.response.status_code} на профиле #{i}") print(e.response.text) if __name__ == "__main__": main()
Как настроить автоматический фарминг аккаунтов в антидетект браузере через API: практический кейс и полноценный скрипт для автоматического создания профилей

Что тут важного

  • Минимальный fingerprint. Достаточно os и screen, остальное Octo "дорисует" консистентно - это ускоряет потоковую генерацию.
  • Итерация прокси по кругу. Если профилей больше, чем строк в списке - itertools.cycle раздаст их циклически (осознавайте риски повторного использования IP).
  • Квоты API. Заголовки X-RateLimit-* нужны чтобы не ловить 429.
  • Отчётность. На выходе получаем понятные логи и UUID каждого созданного профиля.

Скрипт №2: запуск профилей из CLI и проверка сети

Дальше - минимальный исполняемый пример, который стартует профиль через Local API Octo, коннектится к нему Selenium-ом (через порт удаленной отладки) и проверяет внешний IP.

Этот скрипт я сделал прям быстро, и его можно править под себя (как в принципе и предыдущий скрипт).

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ octo_profiles_run.py -- старт профилей Octo по UUID, подключение через Selenium, проверка IP. """ import os, sys, argparse, requests from dotenv import load_dotenv from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC load_dotenv() PORT = os.getenv("OCTO_LOCAL_PORT", "58888") API_TOKEN = os.getenv("OCTO_API_TOKEN") or sys.exit("⛔️ Нет OCTO_API_TOKEN") BASE = f"http://127.0.0.1:{PORT}" HEADERS = {"X-Octo-Api-Token": API_TOKEN, "Content-Type": "application/json"} TO = 15 # seconds def start(uid: str) -> int: resp = requests.post( f"{BASE}/api/profiles/start", json={"uuid": uid, "headless": False, "debug_port": True}, headers=HEADERS, timeout=TO ) if resp.status_code == 400: print(f"⛔️ 400 Bad Request: {resp.text}") resp.raise_for_status() port = resp.json().get("debug_port") if not port: raise ValueError("Нет debug_port в ответе API") print(f"▶️ {uid} запущен, порт {port}") return int(port) def attach(port: int) -> webdriver.Chrome: opts = Options() opts.add_experimental_option("debuggerAddress", f"127.0.0.1:{port}") return webdriver.Chrome(options=opts) def whoami(driver: webdriver.Chrome) -> str: driver.get("https://httpbin.org/ip") pre = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.TAG_NAME, "pre"))) return pre.text.strip() def main(uids): for uid in uids: driver = None try: port = start(uid) driver = attach(port) print(" IP:", whoami(driver)) except requests.RequestException as e: print(f"⛔️ API-ошибка {uid}: {e}") except Exception as e: print(f"⛔️ Сбой {uid}: {e}") finally: if driver: driver.quit() if __name__ == "__main__": ap = argparse.ArgumentParser(description="Стартует профили Octo и печатает внешний IP.") ap.add_argument("uids", nargs="+", metavar="UUID") args = ap.parse_args() main(args.uids)

Как это работает, по шагам

  • Конфиг. Берём локальный порт API (OCTO_LOCAL_PORT, по умолчанию 58888) и тот же токен.
  • Старт профиля. POST на /api/profiles/start с флагом debug_port: true - в ответ получаем порт удалённой отладки.
  • Подключение. Создаём Chrome с debuggerAddress=127.0.0.1:<port> - Selenium цепляется к уже запущенному профилю Octo.
  • Проверка сети. Открываем https://httpbin.org/ip, читаем IP из <pre>.
  • Завершение. Даже при исключениях драйвер аккуратно закрывается.

Примечание. Для автоподбора совместимого chromedriver удобно поставить webdriver-manager, либо заранее держать драйвер из Chrome for Testing в PATH.

Что дальше можно навесить на эту основу

Эта пара скриптов - скелет для своих задач: проставление тегов при создании, запись UUID в БД, сценарии прогрева/фарминга после старта профилей, отчётность по прокси и сессиям. Если планируете массовые операции на веб-стороне, учитывайте детект автоматизации: базовый Selenium иногда палится антифрод-движками, так что undetected-chromedriver и дополнительные патчи - хорошая идея.

API-подход к антидетект-профилям позволяет перевести рутину в код и высвободить ресурсы на эксперименты. В связке "Octo + резидентные прокси" выпуск сотен профилей перестает быть проектом на полдня и превращается в повторяемую операцию с прозрачной телеметрией. Основа готова - дальше вопрос только в том, какие процессы вы хотите автоматизировать первыми.

Начать дискуссию