دروس API

دوران مفتاح CaptchaAI API: إدارة المفاتيح المتعددة

يؤدي تشغيل كل حركة المرور من خلال مفتاح 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.


أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.