Die wichtigste Regel zuerst: Übergeben Sie CaptchaAI genau den User-Agent, mit dem Ihr Client die Zielseite lädt – und halten Sie diesen String aktuell. Läuft der Browser unter einem anderen oder veralteten User-Agent als der Solver, entsteht eine widersprüchliche Anfrage, die reCAPTCHA und Cloudflare Turnstile schärfer prüfen. Wer Browser und Solver auf denselben, gepflegten User-Agent bringt, erhält konsistentere Lösungen und stabilere Sitzungen.
Dieser Leitfaden zeigt in Python und Selenium, wie Sie einen aktuellen User-Agent-Pool aufbauen, ihn pro Sitzung konsistent halten und sauber an CaptchaAI durchreichen.
Warum der User-Agent über die CAPTCHA-Abfrage entscheidet
reCAPTCHA v2, reCAPTCHA v3 und Cloudflare Turnstile bewerten den User-Agent als eines von vielen Signalen. Der String allein entscheidet nichts – aber im Zusammenspiel mit IP-Reputation, Header-Reihenfolge und Verhalten kann ein auffälliger User-Agent den Ausschlag geben, ob eine Abfrage leicht oder schwer ausfällt. Die häufigsten Fehler und ihre Folgen:
| Symptom | Folge |
|---|---|
Standard-Python-UA (python-requests/2.31) |
wird sofort als automatisierter Client eingestuft |
| veralteter Chrome-UA (v90) | gilt als verdächtig, härtere Abfrage |
| UA wechselt mitten in der Sitzung | Sitzung wird ungültig |
| UA passt nicht zu den Browser-Funktionen | Erkennungslogik schlägt an |
Der rote Faden: Ein User-Agent muss aktuell, in sich stimmig und über die gesamte Sitzung stabil sein. Genau das bilden die folgenden Bausteine ab.
Einen aktuellen User-Agent-Pool pflegen
Legen Sie eine kleine Liste realer, aktueller Browser-Strings an – jeweils für Chrome und Firefox auf Windows, macOS und Linux. Ziehen Sie daraus zufällig, statt einen einzigen hartcodierten String für alles zu verwenden:
import random
# Updated Chrome UAs (keep current)
CHROME_UAS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
]
FIREFOX_UAS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0",
]
def get_random_ua(browser="chrome"):
"""Get a random modern user-agent."""
if browser == "firefox":
return random.choice(FIREFOX_UAS)
return random.choice(CHROME_UAS)
Prüfen Sie diese Liste alle ein bis zwei Monate. Chrome und Firefox veröffentlichen im Wochentakt neue Hauptversionen; ein User-Agent, der zwei Jahre alt ist, entspricht keiner real installierten Browser-Basis mehr und fällt dadurch auf.
Denselben User-Agent über die gesamte Sitzung halten
Ein häufiger Fehler ist, bei jeder einzelnen Anfrage neu zu würfeln. Reale Nutzer wechseln ihren Browser nicht zwischen zwei Seitenaufrufen. Wählen Sie den User-Agent einmal pro Sitzung und verwenden Sie ihn für alle Requests in dieser Sitzung:
import requests
class ConsistentSession:
"""Session that maintains consistent fingerprint."""
def __init__(self, user_agent=None):
self.session = requests.Session()
self.user_agent = user_agent or get_random_ua()
self.session.headers.update({
"User-Agent": self.user_agent,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
})
def get(self, url, **kwargs):
return self.session.get(url, **kwargs)
def post(self, url, **kwargs):
return self.session.post(url, **kwargs)
# Same UA for all requests in this session
session = ConsistentSession()
session.get("https://example.com/page1")
session.post("https://example.com/form")
Die Rotation gehört auf die Sitzungsebene: ein neuer User-Agent pro neuer Sitzung oder pro Konto, nie innerhalb einer laufenden Sitzung. So bleibt jede Sitzung in sich stimmig, ohne dass über viele Sitzungen hinweg ein einziges wiedererkennbares Muster entsteht.
Den User-Agent an CaptchaAI übergeben
Der entscheidende Schritt für die Lösungsqualität: Der User-Agent, den Sie an CaptchaAI schicken, muss derselbe sein, mit dem Sie die Seite laden. Bei reCAPTCHA übergeben Sie ihn über den Parameter userAgent:
def solve_with_matching_ua(api_key, sitekey, pageurl, user_agent):
"""Send matching user-agent to CaptchaAI."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"userAgent": user_agent, # Match your browser's UA
"json": 1,
}, timeout=30)
return resp.json()
# Use the same UA everywhere
ua = get_random_ua()
session = ConsistentSession(user_agent=ua)
# Browse with this UA
session.get("https://example.com")
# Solve CAPTCHA with same UA
solve_with_matching_ua("YOUR_API_KEY", "SITEKEY", "https://example.com", ua)
Stimmen Client-UA und Solver-UA überein, passt das zurückgegebene Token g-recaptcha-response zum Kontext, in dem Sie es anschließend absenden. Weichen beide voneinander ab, riskieren Sie ein Token, das im Zielformular schwächer bewertet wird. Dieselbe Regel gilt für Cloudflare Turnstile: Der User-Agent, mit dem Sie die Seite laden, gehört auch in den Solver-Aufruf.
Den User-Agent in Selenium setzen
Arbeiten Sie mit einem echten Browser statt mit reinen HTTP-Requests, setzen Sie den User-Agent direkt in den Chrome-Optionen und prüfen anschließend, ob er tatsächlich greift:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def create_driver_with_ua(user_agent):
"""Create Selenium driver with specific user-agent."""
options = Options()
options.add_argument(f"user-agent={user_agent}")
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
# Verify UA is set correctly
actual_ua = driver.execute_script("return navigator.userAgent")
assert user_agent in actual_ua, f"UA mismatch: {actual_ua}"
return driver
# Use same UA for browser and API
ua = get_random_ua()
driver = create_driver_with_ua(ua)
# ... mit CaptchaAI unter demselben User-Agent lösen ...
Auch hier gilt die Kernregel: Derselbe ua steuert den Browser und geht an den Solver. Setzen Sie den User-Agent bei einem Headless-Browser explizit – der Standard-Headless-String verrät sich sonst oft selbst.
Vollständige Header für realistische HTTP-Anfragen
Der User-Agent ist nur ein Header von vielen. Ein realer Chrome sendet zusätzlich Accept, Accept-Language, die Sec-Fetch-*-Familie und – ab Chrome – die Client-Hints sec-ch-ua. Fehlen diese oder passen sie nicht zur angegebenen Chrome-Version, wirkt die Anfrage inkonsistent:
def get_realistic_headers(user_agent=None):
"""Build headers that match a real browser."""
ua = user_agent or get_random_ua()
headers = {
"User-Agent": ua,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Cache-Control": "max-age=0",
}
# Add Chrome-specific headers
if "Chrome" in ua:
headers["sec-ch-ua"] = '"Chromium";v="125", "Google Chrome";v="125", "Not.A/Brand";v="24"'
headers["sec-ch-ua-mobile"] = "?0"
headers["sec-ch-ua-platform"] = '"Windows"'
return headers
Achten Sie darauf, dass die Versionsnummer in sec-ch-ua (hier 125) zur Chrome-Version im User-Agent passt. Ein User-Agent mit Chrome 125 und Client-Hints mit Version 118 ist genau die Art Widerspruch, die auffällt.
Skalierung: ein User-Agent pro Thread
Wer viele Sitzungen parallel fährt, sollte pro gleichzeitiger Sitzung einen eigenen, konsistenten User-Agent führen. Das passt gut zum Abrechnungsmodell von CaptchaAI: Der Dienst rechnet pro Thread ab, nicht pro Lösung. Der Einstiegstarif BASIC kostet ab 15 $/Monat und umfasst 5 Threads mit unbegrenzten Lösungen pro Thread; größere Tarife bis VIP-3 (7.500 $/Monat, 5.000 Threads) skalieren dieselbe Logik. Ein Thread entspricht dabei einer laufenden Abfrage – und pro laufender Sitzung tragen Sie sinnvollerweise einen stabilen User-Agent. So bleibt die Zuordnung „eine Sitzung, ein User-Agent, ein Thread" sauber.
DACH-Hinweis: Bei Scraping- und Automatisierungsprojekten in Deutschland, Österreich und der Schweiz gelten IP-Adressen nach DSGVO als personenbezogene Daten. Prüfen Sie unabhängig von der technischen Umsetzung Ihre Rechtsgrundlage und die verarbeiteten Datenflüsse. Testen Sie Workflows möglichst in eigenen oder ausdrücklich freigegebenen Umgebungen – etwa auf einem Hetzner- oder netcup-Server.
Häufige Fragen
Warum sollte ich CaptchaAI genau denselben User-Agent übergeben, den mein Client nutzt?
Weil das zurückgegebene Token zum Kontext passen muss, in dem Sie es absenden. Ein Solver-UA, der vom Browser-UA abweicht, erzeugt eine widersprüchliche Anfrage und kann die Lösungsqualität senken. Ein einheitlicher String über Browser, HTTP-Client und API hält die Sitzung stimmig.
Reicht ein aktueller User-Agent, um CAPTCHAs zuverlässig zu lösen?
Nein. Der User-Agent ist ein Signal von vielen – IP-Reputation, vollständige Header und das Anfrageverhalten zählen ebenso. Ein gepflegter User-Agent ist die Grundlage, ersetzt aber weder saubere Header (Sec-Fetch-*, Client-Hints) noch eine seriöse IP.
Sollte ich den User-Agent bei jeder Anfrage neu wechseln?
Nein. Wählen Sie ihn einmal pro Sitzung und behalten ihn bei; reale Nutzer wechseln den Browser nicht zwischen zwei Seitenaufrufen. Rotieren Sie nur über verschiedene Sitzungen oder Konten hinweg, damit kein einzelnes wiedererkennbares Muster entsteht.
Muss ich beim Scraping in Deutschland rechtlich etwas beachten?
Ja. IP-Adressen gelten nach DSGVO als personenbezogene Daten, und § 6 UWG verlangt bei vergleichenden Aussagen belastbare Fakten. Klären Sie Ihre Rechtsgrundlage, beschränken Sie sich auf eigene oder freigegebene Zielsysteme und dokumentieren Sie, welche Daten Sie verarbeiten.
Weiterführende Anleitungen
Bauen Sie robustere Automatisierung – starten Sie mit CaptchaAI.