Grid image CAPTCHA menampilkan gambar besar yang dibagi menjadi beberapa sel grid (biasanya 3×3 atau 4×4) dan meminta pengguna memilih sel yang cocok dengan deskripsi. Meski reCAPTCHA menggunakan format ini, banyak situs juga menggunakan custom grid challenge yang bukan bagian dari sistem Google.
Panduan ini mencakup cara solve non-reCAPTCHA grid image challenge menggunakan endpoint method=grid CaptchaAI.
Prasyarat
| Item | Nilai |
|---|---|
| API key CaptchaAI | Dari captchaai.com |
| Gambar grid | Screenshot atau base64 dari grid penuh |
| Bahasa | Python 3.7+ atau Node.js 14+ |
Langkah 1: Ambil gambar grid
Metode A: Screenshot elemen captcha
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/protected-form")
# Screenshot just the captcha container
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
captcha_element.screenshot("captcha_grid.png")
Metode B: Ekstrak gambar dari atribut src
import base64
import requests
captcha_img = driver.find_element(By.CSS_SELECTOR, ".grid-captcha img")
src = captcha_img.get_attribute("src")
if src.startswith("data:image"):
image_b64 = src.split(",")[1]
else:
image_data = requests.get(src).content
image_b64 = base64.b64encode(image_data).decode()
Langkah 2: Kirimkan gambar ke CaptchaAI
Menggunakan unggahan file (Python)
import requests
import time
API_KEY = "YOUR_API_KEY"
with open("captcha_grid.png", "rb") as f:
response = requests.post("https://ocr.captchaai.com/in.php",
data={
"key": API_KEY,
"method": "post",
"recaptcha": 1,
"json": 1
},
files={"file": f}
)
data = response.json()
task_id = data["request"]
print(f"Task: {task_id}")
Menggunakan base64 (Python)
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "post",
"body": image_b64,
"recaptcha": 1,
"json": 1
})
task_id = response.json()["request"]
Node.js
const axios = require('axios');
const fs = require('fs');
async function submitGridCaptcha(imagePath) {
const imageB64 = fs.readFileSync(imagePath).toString('base64');
const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'post',
body: imageB64,
recaptcha: 1,
json: 1
}
});
return data.request;
}
Langkah 3: Poll Solusi
def get_grid_solution(task_id):
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
raise Exception("Timeout")
solution = get_grid_solution(task_id)
print(f"Solution: {solution}")
# Returns click coordinates or cell indices
Langkah 4: Terapkan solusinya
Klik berdasarkan indeks sel
# If solution returns cell indices (e.g., "2,5,6")
selected = [int(i) for i in solution.split(",")]
cells = driver.find_elements(By.CSS_SELECTOR, ".grid-cell")
for idx in selected:
cells[idx - 1].click()
time.sleep(0.2)
driver.find_element(By.CSS_SELECTOR, ".verify-button").click()
Klik berdasarkan koordinat
from selenium.webdriver.common.action_chains import ActionChains
# If solution returns coordinates (e.g., "x=120,y=80;x=250,y=200")
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
actions = ActionChains(driver)
for coord in solution.split(";"):
parts = dict(p.split("=") for p in coord.split(","))
x, y = int(parts["x"]), int(parts["y"])
actions.move_to_element_with_offset(captcha_element, x, y).click()
actions.perform()
Pemecahan Masalah
| Error | Penyebab | Solusi |
|---|---|---|
ERROR_WRONG_FILE_EXTENSION |
Format gambar tidak valid | Gunakan PNG atau JPEG; verifikasi base64 valid |
ERROR_CAPTCHA_UNSOLVABLE |
Gambar terlalu kecil atau buram | Ambil gambar dengan resolusi penuh |
| Sel yang salah dipilih | Ketidakcocokan format solusi | Periksa apakah solusi berupa indeks vs koordinat |
ERROR_TOO_BIG_CAPTCHA_FILESIZE |
Gambar melebihi batas ukuran | Resize di bawah 600KB |
Contoh lengkap yang dapat dijalankan
Butuh proyek kerja lengkap dengan pengaturan lingkungan, polling, percobaan ulang, dan penanganan kesalahan?
Lihat contoh lengkap yang dapat dijalankan di GitHub →
Pertanyaan Umum
Kapan menggunakan grid solve vs token solve?
Gunakan token solve (method=userrecaptcha) untuk reCAPTCHA standar — lebih sederhana dan lebih andal. Gunakan grid solve (method=post dengan recaptcha=1) untuk non-reCAPTCHA grid challenge atau standalone image grid.
Ukuran grid apa yang didukung?
CaptchaAI menangani grid 3×3, 4×4, dan tata letak non-standar. Gambar dianalisis secara keseluruhan, terlepas dari struktur grid-nya.
Seberapa akurat grid solve?
Akurasi tergantung pada kualitas gambar. Gambar beresolusi tinggi dan jernih memberikan hasil terbaik. Waktu solve rata-rata 15–30 detik.
Bisakah saya solve dynamic grid yang tile-nya berubah?
Untuk dynamic reCAPTCHA grid (tile yang diklik diganti), gunakan metode token (method=userrecaptcha). Metode grid hanya solve satu gambar statis.
Panduan Terkait
- Error dan Perbaikan Grid Image CAPTCHA Umum