Ручная регистрация аккаунтов — узкое место любой масштабируемой операции. При нужде в 100+ регистрациях в день человеческий труд становится главной статьёй затрат. API виртуальных номеров — это мост от ручного к автоматическому: скрипт получает номер, принимает SMS, парсит код и завершает регистрацию без участия человека.
Архитектура автоматизированной регистрации
Базовый флоу
Каждая автоматическая регистрация проходит следующие шаги:
- Скрипт запрашивает виртуальный номер через API (указывает сервис и страну)
- Сервис возвращает номер и ID активации
- Скрипт вводит номер в форму регистрации целевого сервиса
- Целевой сервис отправляет SMS с OTP-кодом
- Скрипт polling-ом запрашивает входящие SMS через API
- API возвращает код из SMS
- Скрипт вводит код, завершает регистрацию
- Скрипт освобождает номер (или ждёт истечения)
Работа с API turbon: основные эндпоинты
Получение номера
Первый шаг — запрос доступного номера для нужного сервиса и страны:
GET /api/getNumber?api_key=YOUR_KEY&service=telegram&country=ru Ответ: { "status": "success", "id": 12345678, "phone": "79991234567" }Ожидание SMS
После отправки номера на целевой сервис — polling для получения кода:
GET /api/getStatus?api_key=YOUR_KEY&id=12345678 Ответ (ожидание): {"status": "STATUS_WAIT_CODE"} Ответ (код получен): {"status": "STATUS_OK", "code": "12345"}Подтверждение использования
GET /api/setStatus?api_key=YOUR_KEY&id=12345678&status=6 # status=6 — сообщить, что SMS получена и всё OKПримеры реализации
Python: базовый класс для работы с API
import requests import time class TurbonAPI: BASE_URL = "https://turbon.rent/api" def __init__(self, api_key): self.api_key = api_key def get_number(self, service, country="ru"): r = requests.get(f"{self.BASE_URL}/getNumber", params={ "api_key": self.api_key, "service": service, "country": country }) data = r.json() if data["status"] == "success": return data["id"], data["phone"] raise Exception(f"Failed to get number: {data}") def wait_sms(self, activation_id, timeout=120, interval=5): deadline = time.time() + timeout while time.time() < deadline: r = requests.get(f"{self.BASE_URL}/getStatus", params={ "api_key": self.api_key, "id": activation_id }) data = r.json() if data["status"] == "STATUS_OK": return data["code"] if "CANCEL" in data["status"]: raise Exception("Activation cancelled") time.sleep(interval) raise TimeoutError(f"SMS not received in {timeout}s") def confirm(self, activation_id): requests.get(f"{self.BASE_URL}/setStatus", params={ "api_key": self.api_key, "id": activation_id, "status": 6 }) # Использование: turbon = TurbonAPI("your_api_key") act_id, phone = turbon.get_number("telegram") # ... регистрация в Telegram с номером phone ... code = turbon.wait_sms(act_id) # ... ввод кода code ... turbon.confirm(act_id)JavaScript/Node.js: асинхронный вариант
const axios = require('axios'); async function getNumber(apiKey, service, country = 'ru') { const { data } = await axios.get('https://turbon.rent/api/getNumber', { params: { api_key: apiKey, service, country } }); if (data.status !== 'success') throw new Error(data.status); return { id: data.id, phone: data.phone }; } async function waitSms(apiKey, id, timeout = 120000) { const deadline = Date.now() + timeout; while (Date.now() < deadline) { await new Promise(r => setTimeout(r, 5000)); const { data } = await axios.get('https://turbon.rent/api/getStatus', { params: { api_key: apiKey, id } }); if (data.status === 'STATUS_OK') return data.code; if (data.status.includes('CANCEL')) throw new Error('Cancelled'); } throw new Error('Timeout'); }Параллельная регистрация
Паттерн Worker Pool
Для регистрации 100 аккаунтов параллельно используется паттерн worker pool: N воркеров работают одновременно, каждый выполняет полный цикл регистрации. При N=10 время регистрации 100 аккаунтов сокращается в 10 раз.
from concurrent.futures import ThreadPoolExecutor import time def register_account(turbon, service, registrar): act_id, phone = turbon.get_number(service) registrar.start_registration(phone) code = turbon.wait_sms(act_id) account = registrar.complete_registration(code) turbon.confirm(act_id) return account # Параллельный запуск with ThreadPoolExecutor(max_workers=10) as executor: futures = [ executor.submit(register_account, turbon, "telegram", registrar) for _ in range(100) ] accounts = [f.result() for f in futures]Обработка ошибок и retry
Типичные ошибки
ОшибкаПричинаРешение NO_NUMBERSНет доступных номеров для сервиса/страныRetry через 30–60 сек или смена страны STATUS_CANCELSMS не пришла, активация отмененаПолучить новый номер, повторить BANNEDАккаунт API заблокированПроверить баланс и лимиты TimeoutErrorSMS пришла позже таймаутаУвеличить timeout, добавить retryExponential backoff
При ошибках NO_NUMBERS — не бомбардировать API, а делать паузы с возрастающим интервалом: 5с → 10с → 20с → 40с. Это снижает нагрузку и повышает шанс получить номер при высоком спросе.
Интеграция с антидетект-браузером
Playwright или Selenium запускает браузерный профиль → скрипт получает номер через API turbon → вводит номер в форму через автоматизацию браузера → получает код через API → вводит в браузере. Полный цикл без участия человека.
Ключевой момент: между получением номера и вводом SMS-кода должна быть задержка 5–30 секунд (имитация реального пользователя, который «читает SMS»). Без задержки некоторые платформы детектируют автоматизацию.
Best Practices при автоматизации
- Всегда подтверждайте использование номера (status=6) — это помогает улучшать качество пула
- Не запрашивайте номер, пока форма регистрации не готова к вводу — номер может истечь
- Логируйте каждую активацию с результатом — для анализа успешности по сервисам
- Используйте разные страны для разных платформ — снижает паттерны
- Не превышайте разумную скорость запросов к API — соблюдайте rate limits
Заключение
Автоматизация регистрации через API виртуальных номеров — это переход от ручного труда к масштабируемому процессу. 10 строк кода заменяют 10 минут ручной работы оператора. turbon.rent предоставляет API для автоматического получения номеров, приёма SMS и управления активациями — всё необходимое для интеграции в ваши скрипты и пайплайны.