يؤدي تشغيل كل حركة المرور من خلال مفتاح API واحد إلى إنشاء نقطة فشل واحدة. إذا نفد رصيد المفتاح، أو وصل إلى حدود المعدل، أو تم إلغاء تنشيطه، فسيتوقف خط الأنابيب بالكامل. يقوم دوران المفاتيح بتوزيع الحمل عبر مفاتيح متعددة ويوفر تجاوز الفشل تلقائيًا.
دوران دائري
أبسط استراتيجية هي التنقل بين المفاتيح بالتساوي:
بايثون
import itertools
import requests
API_KEYS = [
"KEY_ACCOUNT_1",
"KEY_ACCOUNT_2",
"KEY_ACCOUNT_3",
]
key_cycle = itertools.cycle(API_KEYS)
def get_next_key():
return next(key_cycle)
def solve_captcha(sitekey, page_url):
api_key = get_next_key()
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": "1",
})
data = resp.json()
if data["status"] != 1:
raise Exception(f"[{api_key[:8]}...] {data['request']}")
print(f"Submitted with key {api_key[:8]}...")
return data["request"], api_key
task_id, used_key = solve_captcha("6Le-SITEKEY", "https://example.com")
دوران مرجح مع الوعي بالتوازن
قم بتوجيه المزيد من حركة المرور إلى المفاتيح ذات الأرصدة الأعلى:
import random
import requests
import threading
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
class KeyRotator:
def __init__(self, keys):
self.keys = {k: {"balance": 0, "failures": 0, "disabled": False} for k in keys}
self._lock = threading.Lock()
self.refresh_balances()
def refresh_balances(self):
for key in self.keys:
try:
resp = requests.get(RESULT_URL, params={
"key": key, "action": "getbalance", "json": "1"
}, timeout=10).json()
if resp["status"] == 1:
self.keys[key]["balance"] = float(resp["request"])
self.keys[key]["disabled"] = False
else:
self.keys[key]["disabled"] = True
except Exception:
self.keys[key]["disabled"] = True
def get_key(self):
with self._lock:
available = {
k: v for k, v in self.keys.items()
if not v["disabled"] and v["balance"] > 0.01
}
if not available:
raise Exception("No API keys with balance available")
# Weighted random by balance
keys = list(available.keys())
weights = [available[k]["balance"] for k in keys]
return random.choices(keys, weights=weights, k=1)[0]
def report_failure(self, key, error_code):
with self._lock:
self.keys[key]["failures"] += 1
if error_code in ("ERROR_WRONG_USER_KEY", "ERROR_KEY_DOES_NOT_EXIST",
"ERROR_ZERO_BALANCE", "ERROR_IP_NOT_ALLOWED"):
self.keys[key]["disabled"] = True
print(f"[rotator] Disabled key {key[:8]}...: {error_code}")
def report_success(self, key, cost=0.003):
with self._lock:
self.keys[key]["balance"] -= cost
self.keys[key]["failures"] = 0
rotator = KeyRotator(["KEY_1", "KEY_2", "KEY_3"])
# Usage
api_key = rotator.get_key()
# ... solve captcha ...
rotator.report_success(api_key)
تناوب الفشل
جرب المفتاح التالي عندما يفشل أحد هذه المفاتيح:
بايثون
def solve_with_failover(sitekey, page_url, max_attempts=3):
for attempt in range(max_attempts):
api_key = rotator.get_key()
try:
resp = requests.post(SUBMIT_URL, data={
"key": api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": "1",
}, timeout=15)
data = resp.json()
if data["status"] != 1:
rotator.report_failure(api_key, data["request"])
continue
rotator.report_success(api_key)
return data["request"], api_key
except requests.RequestException:
rotator.report_failure(api_key, "NETWORK_ERROR")
continue
raise Exception(f"All {max_attempts} keys failed")
JavaScript
const axios = require('axios');
class KeyRotator {
constructor(keys) {
this.keys = keys.map(k => ({ key: k, disabled: false, failures: 0 }));
this.index = 0;
}
getKey() {
const available = this.keys.filter(k => !k.disabled);
if (available.length === 0) throw new Error('No API keys available');
const entry = available[this.index % available.length];
this.index++;
return entry.key;
}
disable(key, reason) {
const entry = this.keys.find(k => k.key === key);
if (entry) {
entry.disabled = true;
console.log(`[rotator] Disabled ${key.substring(0, 8)}...: ${reason}`);
}
}
}
const rotator = new KeyRotator(['KEY_1', 'KEY_2', 'KEY_3']);
async function solveWithFailover(sitekey, pageurl, maxAttempts = 3) {
for (let i = 0; i < maxAttempts; i++) {
const apiKey = rotator.getKey();
try {
const resp = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: { key: apiKey, method: 'userrecaptcha', googlekey: sitekey, pageurl, json: 1 }
});
if (resp.data.status !== 1) {
rotator.disable(apiKey, resp.data.request);
continue;
}
return { taskId: resp.data.request, apiKey };
} catch (err) {
rotator.disable(apiKey, 'NETWORK_ERROR');
}
}
throw new Error('All keys failed');
}
تحميل المفاتيح من متغيرات البيئة
لا تقم أبدًا بترميز مفاتيح واجهة برمجة التطبيقات (API) بشكل ثابت. تحميل من البيئة:
import os
API_KEYS = os.environ["CAPTCHAAI_KEYS"].split(",")
# Set: CAPTCHAAI_KEYS=key1,key2,key3
rotator = KeyRotator(API_KEYS)
const API_KEYS = process.env.CAPTCHAAI_KEYS.split(',');
const rotator = new KeyRotator(API_KEYS);
تحديث الرصيد المجدول
بالنسبة للعمليات طويلة الأمد، قم بتحديث الأرصدة بشكل دوري:
import threading
def periodic_refresh(rotator, interval=300):
def refresh():
while True:
rotator.refresh_balances()
for key, info in rotator.keys.items():
print(f" {key[:8]}...: ${info['balance']:.2f} "
f"{'(disabled)' if info['disabled'] else '(active)'}")
threading.Event().wait(interval)
t = threading.Thread(target=refresh, daemon=True)
t.start()
periodic_refresh(rotator, interval=300) # every 5 minutes
استكشاف الأخطاء وإصلاحها
| مشكلة | السبب | إصلاح |
|---|---|---|
| جميع المفاتيح معطلة | الرصيد صفر في جميع الحسابات | إعادة تعبئة الحسابات، تحقق من ERROR_ZERO_BALANCE |
| يستخدم دائما نفس المفتاح | مؤشر جولة روبن لا يتقدم | تحقق من أمان مسارات التنفيذ مع القفل |
| تم تعطيل المفتاح بشكل غير صحيح | يتم التعامل مع الخطأ المؤقت على أنه خطأ دائم | التعطيل فقط على ERROR_WRONG_USER_KEY وERROR_ZERO_BALANCE وERROR_IP_NOT_ALLOWED |
الأسئلة الشائعة
كم عدد مفاتيح API التي يجب أن أستخدمها؟
يوفر مفتاحان تجاوز الفشل الأساسي. ثلاثة مفاتيح أو أكثر تسمح بتوزيع الحمل. بالنسبة للعمليات ذات الحجم الكبير (1000+ حل/day)، فكر في 3-5 مفاتيح.
هل يمكنني استخدام المفاتيح من حسابات CaptchaAI المختلفة؟
نعم. كل مفتاح له رصيده الخاص وحدود المعدل. يعاملهم الدوار بشكل مستقل.
قم بتوسيع نطاق حل اختبار CAPTCHA الخاص بك من خلال التدوير متعدد المفاتيح
احصل على مفتاح API الخاص بك علىcaptchaai.com.