Selenium ve CaptchaAI'yi kullanarak CAPTCHA zorluklarını içeren form gönderimlerini otomatikleştirin.
Mücadele
CAPTCHA'lar tarafından korunan web formları otomasyonu engeller. İster iletişim formlarını test ediyor, ister başvuru gönderiyor, ister QA iş akışlarını çalıştırıyor olun, formun gönderiminizi kabul etmesinden önce CAPTCHA'yı çözmeniz gerekir.
Mimarlık
┌────────────┐ ┌──────────────┐ ┌────────────┐ ┌──────────────┐
│ Load Form │────▶│ Fill Fields │────▶│ Detect & │────▶│ Submit Form │
│ (Selenium) │ │ │ │ Solve │ │ │
│ │ │ │ │ CAPTCHA │ │ │
└────────────┘ └──────────────┘ └────────────┘ └──────────────┘
Temel Bileşenler
CAPTCHA Çözücü
import time
import requests
class FormCaptchaSolver:
BASE = "https://ocr.captchaai.com"
def __init__(self, api_key):
self.api_key = api_key
def solve(self, params, initial_wait=10):
params["key"] = self.api_key
params["json"] = 1
resp = requests.post(f"{self.BASE}/in.php", data=params).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
time.sleep(initial_wait)
for _ in range(60):
result = requests.get(
f"{self.BASE}/res.php",
params={"key": self.api_key, "action": "get", "id": task_id, "json": 1},
).json()
if result["request"] == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result["status"] == 1:
return result["request"]
raise Exception(f"Solve error: {result['request']}")
raise TimeoutError("CAPTCHA solve timed out")
CAPTCHA Dedektörü
import re
from selenium.webdriver.common.by import By
class CaptchaDetector:
def __init__(self, driver):
self.driver = driver
def detect(self):
"""Detect CAPTCHA type on current page."""
html = self.driver.page_source
# Turnstile
turnstile = self.driver.find_elements(By.CSS_SELECTOR, ".cf-turnstile, [data-sitekey]")
for el in turnstile:
if "cf-turnstile" in (el.get_attribute("class") or ""):
return "turnstile", el.get_attribute("data-sitekey")
# reCAPTCHA
recaptcha = self.driver.find_elements(By.CSS_SELECTOR, "[data-sitekey]")
if recaptcha:
sitekey = recaptcha[0].get_attribute("data-sitekey")
if "recaptcha" in html.lower():
return "recaptcha_v2", sitekey
# Image CAPTCHA
img = self.driver.find_elements(By.CSS_SELECTOR, "img[src*='captcha'], img.captcha")
if img:
return "image", img[0].get_attribute("src")
return "none", None
Form Otomatikleştirici
import base64
import requests as req
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class FormAutomator:
def __init__(self, api_key):
self.solver = FormCaptchaSolver(api_key)
self.driver = webdriver.Chrome()
self.detector = CaptchaDetector(self.driver)
def fill_field(self, selector, value):
field = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, selector))
)
field.clear()
field.send_keys(value)
def select_option(self, selector, value):
from selenium.webdriver.support.ui import Select
select = Select(self.driver.find_element(By.CSS_SELECTOR, selector))
select.select_by_value(value)
def solve_captcha(self):
captcha_type, data = self.detector.detect()
page_url = self.driver.current_url
if captcha_type == "recaptcha_v2":
token = self.solver.solve({
"method": "userrecaptcha",
"googlekey": data,
"pageurl": page_url,
})
self.driver.execute_script(
f'document.querySelector("[name=g-recaptcha-response]").value = "{token}";'
)
return True
if captcha_type == "turnstile":
token = self.solver.solve({
"method": "turnstile",
"sitekey": data,
"pageurl": page_url,
})
self.driver.execute_script(
f'document.querySelector("[name=cf-turnstile-response]").value = "{token}";'
)
return True
if captcha_type == "image":
img_data = req.get(data).content
img_b64 = base64.b64encode(img_data).decode()
text = self.solver.solve({"method": "base64", "body": img_b64})
captcha_input = self.driver.find_element(
By.CSS_SELECTOR, "input[name*='captcha']"
)
captcha_input.clear()
captcha_input.send_keys(text)
return True
return False # No CAPTCHA detected
def submit_form(self, url, fields, submit_selector="button[type='submit']"):
"""
fields: list of (selector, value) tuples
"""
self.driver.get(url)
for selector, value in fields:
self.fill_field(selector, value)
self.solve_captcha()
submit = self.driver.find_element(By.CSS_SELECTOR, submit_selector)
submit.click()
return self.driver.current_url
def close(self):
self.driver.quit()
Tam Örnek: İletişim Formu
automator = FormAutomator("YOUR_API_KEY")
try:
result_url = automator.submit_form(
url="https://example.com/contact",
fields=[
("#name", "John Doe"),
("#email", "john@example.com"),
("#subject", "Sales inquiry"),
("#message", "I'd like to learn more about your services."),
],
submit_selector="#submit-btn",
)
print(f"Form submitted. Redirected to: {result_url}")
finally:
automator.close()
Birden Fazla Form Türünü İşleme
Giriş Formu
result = automator.submit_form(
url="https://staging.example.com/qa-login",
fields=[
("#username", "testuser"),
("#password", "testpass123"),
],
submit_selector="#login-btn",
)
Kayıt Formu
result = automator.submit_form(
url="https://example.com/register",
fields=[
("#first-name", "Jane"),
("#last-name", "Smith"),
("#email", "jane@example.com"),
("#password", "SecurePass!123"),
("#confirm-password", "SecurePass!123"),
],
submit_selector="#register-btn",
)
CAPTCHA ile Arama Formu
result = automator.submit_form(
url="https://example.com/search",
fields=[
("#query", "python developer"),
("#location", "San Francisco"),
],
submit_selector="#search-btn",
)
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| Jeton reddedildi | Tokenın süresi gönderilmeden önce doldu | CAPTCHA'yı en son çözün, hemen gönderin |
| Alan bulunamadı | Dinamik sayfa yükleme | Açık beklemeler ekle |
| Yanlış CAPTCHA türü algılandı | Çoklu CAPTCHA öğeleri | Algılama sırasını kontrol edin |
| Form gönderildikten sonra yeniden yüklenir | Sunucu tarafı doğrulaması başarısız oldu | Gerekli tüm alanları kontrol edin |
| reCAPTCHA geri araması tetiklenmedi | Geri arama işlevini çağırmanız gerekiyor | Enjeksiyondan sonra grecaptcha.execute() kullanın |
SSS
Formları tarayıcı olmadan gönderebilir miyim?
reCAPTCHA ve Turnstile için CAPTCHA'ları tarayıcı olmadan çözebilir ve HTTP POST aracılığıyla gönderebilirsiniz. Ancak formda JavaScript doğrulaması kullanılıyorsa bir tarayıcıya ihtiyaç vardır.
Birden fazla CAPTCHA içeren formları nasıl yönetirim?
Bazı formlar yalnızca doğrulama başarısız olduktan sonra CAPTCHA gösterir. Her gönderim denemesinden sonra solve_captcha()'yi tekrar çalıştırın.
Peki ya AJAX formları?
AJAX gönderimleri için, XHR isteğini engelleyin ve gizli bir alanı doldurmak yerine CAPTCHA belirtecini istek yüküne ekleyin.
İlgili Kılavuzlar
Herhangi bir formu otomatikleştirin –CAPTCHA'ları CaptchaAI ile çöz.