Đăng ký tài khoản thủ công là điểm nghẽn của mọi hoạt động cần mở rộng quy mô. Khi cần hơn 100 lượt đăng ký mỗi ngày, sức lao động của con người trở thành khoản chi phí lớn nhất. API số điện thoại ảo là cầu nối từ thủ công sang tự động: script lấy số, nhận SMS, phân tích mã và hoàn tất đăng ký mà không cần con người can thiệp.
Kiến trúc của quy trình đăng ký tự động
Luồng cơ bản
Mỗi lượt đăng ký tự động đi qua các bước sau:
- Script yêu cầu một số điện thoại ảo qua API (chỉ định dịch vụ và quốc gia)
- Dịch vụ trả về số điện thoại và ID kích hoạt
- Script nhập số vào biểu mẫu đăng ký của dịch vụ đích
- Dịch vụ đích gửi SMS chứa mã OTP
- Script dùng polling để liên tục truy vấn SMS đến qua API
- API trả về mã trong SMS
- Script nhập mã và hoàn tất đăng ký
- Script giải phóng số (hoặc chờ số hết hạn)
Làm việc với API turbon: các endpoint chính
Lấy số
Bước đầu tiên là yêu cầu một số khả dụng cho dịch vụ và quốc gia cần dùng:
GET /api/getNumber?api_key=YOUR_KEY&service=telegram&country=ru Phản hồi: { "status": "success", "id": 12345678, "phone": "79991234567" }Chờ SMS
Sau khi gửi số đến dịch vụ đích, hãy dùng polling để nhận mã:
GET /api/getStatus?api_key=YOUR_KEY&id=12345678 Phản hồi (đang chờ): {"status": "STATUS_WAIT_CODE"} Phản hồi (đã nhận mã): {"status": "STATUS_OK", "code": "12345"}Xác nhận đã sử dụng
GET /api/setStatus?api_key=YOUR_KEY&id=12345678&status=6 # status=6 — báo rằng đã nhận được SMS và mọi thứ đều OKVí dụ triển khai
Python: lớp cơ bản để làm việc với 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 }) # Cách dùng: turbon = TurbonAPI("your_api_key") act_id, phone = turbon.get_number("telegram") # ... đăng ký Telegram với số phone ... code = turbon.wait_sms(act_id) # ... nhập mã code ... turbon.confirm(act_id)JavaScript/Node.js: phiên bản bất đồng bộ
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'); }Đăng ký song song
Mẫu Worker Pool
Để đăng ký 100 tài khoản song song, bạn dùng mẫu worker pool: N worker chạy cùng lúc, mỗi worker thực hiện trọn vẹn một chu trình đăng ký. Với N=10, thời gian đăng ký 100 tài khoản giảm đi 10 lần.
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 # Chạy song song 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]Xử lý lỗi và retry
Các lỗi thường gặp
LỗiNguyên nhânCách xử lý NO_NUMBERSKhông có số khả dụng cho dịch vụ/quốc gia nàyThử lại sau 30–60 giây hoặc đổi quốc gia STATUS_CANCELSMS không đến, kích hoạt bị hủyLấy số mới và thực hiện lại BANNEDTài khoản API bị khóaKiểm tra số dư và hạn mức TimeoutErrorSMS đến muộn hơn thời gian chờ tối đaTăng timeout, thêm retryExponential backoff
Khi gặp lỗi NO_NUMBERS, đừng liên tục gửi dồn dập yêu cầu đến API mà hãy tạm dừng với khoảng nghỉ tăng dần: 5 giây → 10 giây → 20 giây → 40 giây. Cách này giảm tải và tăng cơ hội lấy được số khi nhu cầu cao.
Tích hợp với trình duyệt antidetect
Playwright hoặc Selenium khởi chạy một hồ sơ trình duyệt → script lấy số qua API turbon → nhập số vào biểu mẫu thông qua tự động hóa trình duyệt → nhận mã qua API → nhập vào trình duyệt. Toàn bộ chu trình diễn ra mà không cần con người can thiệp.
Điểm mấu chốt: giữa lúc lấy số và lúc nhập mã SMS cần có độ trễ 5–30 giây (mô phỏng người dùng thật đang «đọc SMS»). Nếu không có độ trễ, một số nền tảng sẽ phát hiện ra việc tự động hóa.
Các thực hành tốt nhất khi tự động hóa
- Luôn xác nhận việc đã sử dụng số (status=6) — điều này giúp cải thiện chất lượng kho số
- Đừng yêu cầu số khi biểu mẫu đăng ký chưa sẵn sàng để nhập — số có thể hết hạn
- Ghi log từng lượt kích hoạt cùng kết quả — để phân tích tỷ lệ thành công theo từng dịch vụ
- Dùng các quốc gia khác nhau cho các nền tảng khác nhau — giúp giảm các mẫu lặp lại
- Không gửi yêu cầu đến API với tốc độ quá mức hợp lý — hãy tuân thủ rate limit
Kết luận
Tự động hóa đăng ký qua API số điện thoại ảo là bước chuyển từ lao động thủ công sang một quy trình có thể mở rộng. 10 dòng mã thay thế được 10 phút làm việc thủ công của nhân viên vận hành. turbon.rent cung cấp API để tự động lấy số, nhận SMS và quản lý các lượt kích hoạt — tất cả những gì cần thiết để tích hợp vào script và pipeline của bạn.