Jika request solve Anda dibalas ERROR_WRONG_GOOGLEKEY, sitekey yang dikirim lewat parameter googlekey tidak cocok dengan yang benar-benar dimuat halaman target. Hampir selalu akar masalahnya ada di langkah ekstraksi sitekey, bukan di API-nya. Perbaikannya cepat: ambil sitekey yang tepat, cocokkan tipe reCAPTCHA-nya, lalu validasi formatnya sebelum kirim.
Poin pentingnya, CaptchaAI memvalidasi pasangan googlekey + pageurl terhadap halaman aslinya. Kalau salah satunya meleset — sitekey basi, key dari iframe pihak ketiga, atau tipe reCAPTCHA keliru dikenali — Anda dapat balasan error ini, bukan token. Jadi sebelum menyalahkan API, telusuri dulu dari mana sitekey itu Anda ambil.
Diagnosis cepat sebelum menyalahkan API
Sebelum menyentuh kode solve, jalankan tiga cek ini berurutan:
- Buka source halaman target dan pastikan sitekey yang Anda kirim benar-benar ada di sana, bukan hasil salin dari dokumentasi atau tab lama.
- Cek tipe reCAPTCHA-nya: apakah halaman memuat
recaptcha/enterprise.js(Enterprise) atau memakaidata-size="invisible"(invisible)? Keduanya butuh parameter tambahan. - Pastikan sitekey diambil dari halaman yang sama dengan
pageurlyang Anda kirim — bukan dari iframe, subdomain, atau CDN.
Sembilan dari sepuluh kasus selesai di langkah pertama. Tabel berikut memetakan sisa penyebabnya.
Tip: kerjakan tiga cek ini secara manual di browser dulu untuk satu URL contoh sebelum menuang logikanya ke worker. Menemukan sitekey yang salah dengan mata jauh lebih cepat daripada men-debug ratusan task yang gagal.
Kenapa error ini muncul
| Penyebab | Cara mengenalinya |
|---|---|
| Sitekey yang diekstraksi salah | Key tidak cocok dengan source halaman |
| Sitekey Enterprise dikirim sebagai standar | Perlu parameter enterprise=1 |
| Mismatch reCAPTCHA invisible | Perlu parameter invisible=1 |
| Sitekey dinamis berubah | Key di-rotate setelah ekstraksi |
| Sitekey dari halaman yang salah | Diambil dari iframe atau domain lain |
| Sitekey lama yang di-hardcode | Key dulu valid, sekarang tidak |
Perhatikan bahwa pageurl juga ikut diperiksa: sitekey yang benar tapi diambil dari halaman yang salah tetap ditolak, karena CaptchaAI mencocokkan keduanya sebagai satu pasangan.
Cara mengambil sitekey yang benar
Metode 1: baca langsung dari source halaman
Untuk reCAPTCHA di HTML awal, fungsi ini mencoba empat pola umum:
import re
import requests
def extract_sitekey(page_url):
"""Extract reCAPTCHA sitekey from page source."""
resp = requests.get(page_url, timeout=15)
html = resp.text
# Pattern 1: data-sitekey attribute
match = re.search(r'data-sitekey="([^"]+)"', html)
if match:
return match.group(1)
# Pattern 2: grecaptcha.render call
match = re.search(r"grecaptcha\.render\([^,]+,\s*\{[^}]*sitekey['\"]?\s*:\s*['\"]([^'\"]+)", html)
if match:
return match.group(1)
# Pattern 3: grecaptcha.execute call
match = re.search(r"grecaptcha\.execute\(['\"]([^'\"]+)", html)
if match:
return match.group(1)
# Pattern 4: reCAPTCHA script src
match = re.search(r"recaptcha/api\.js\?render=([^&\"]+)", html)
if match:
return match.group(1)
return None
sitekey = extract_sitekey("https://staging.example.com/qa-login")
print(f"Sitekey: {sitekey}")
Metode 2: lewat Developer Tools browser
Untuk verifikasi manual, pakai Chrome DevTools:
- Buka halaman target di Chrome
- Tekan F12 lalu buka tab Elements
- Tekan Ctrl+F dan cari
sitekey - Temukan atribut
data-sitekey="..." - Salin nilainya (string alfanumerik 40 karakter)
Metode 3: dari tab Network
- Buka F12 lalu buka tab Network
- Filter dengan kata
recaptcha - Cari request ke
google.com/recaptcha/api2/anchor - Ambil nilai parameter
k=di URL — itulah sitekey-nya
Validasi format sebelum kirim
Pemeriksaan format kecil menghemat solve terbuang. Sitekey valid berupa string alfanumerik plus tanda hubung, bukan kosong atau potongan HTML.
import re
def validate_sitekey(sitekey):
"""Validate sitekey format before API call."""
if not sitekey:
raise ValueError("Sitekey is empty")
# Standard format: 40 alphanumeric + hyphens/underscores
if not re.match(r'^[a-zA-Z0-9_-]{20,60}$', sitekey):
raise ValueError(f"Invalid sitekey format: {sitekey}")
return True
# Use before solving
sitekey = extract_sitekey("https://staging.example.com/qa-login")
validate_sitekey(sitekey)
Kasus khusus: reCAPTCHA Enterprise
Sitekey Enterprise terlihat identik dengan yang standar, tetapi memuat script recaptcha/enterprise.js, bukan recaptcha/api.js. Deteksi itu, lalu tambahkan enterprise=1.
Jangan menebak. Menambahkan
enterprise=1pada sitekey standar sama-sama memicuERROR_WRONG_GOOGLEKEY, jadi kirim flag ini hanya setelah deteksi memastikannya.
import requests
# Standard reCAPTCHA — loads via recaptcha/api.js
# Enterprise reCAPTCHA — loads via recaptcha/enterprise.js
def detect_enterprise(page_url):
"""Detect if page uses reCAPTCHA Enterprise."""
resp = requests.get(page_url, timeout=15)
return "recaptcha/enterprise.js" in resp.text
# Submit with enterprise flag
is_enterprise = detect_enterprise("https://example.com")
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://example.com",
"json": 1,
}
if is_enterprise:
data["enterprise"] = 1
resp = requests.post("https://ocr.captchaai.com/in.php", data=data)
Kasus khusus: reCAPTCHA invisible
Versi invisible tidak menampilkan checkbox sehingga mudah salah kira sebagai v2 biasa. Cari penanda data-size="invisible" atau grecaptcha.execute(, lalu kirim dengan invisible=1.
def detect_invisible(html):
"""Detect invisible reCAPTCHA."""
indicators = [
'data-size="invisible"',
"grecaptcha.execute(",
"recaptcha/api.js?render=",
]
return any(i in html for i in indicators)
# Submit with invisible flag
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://example.com",
"invisible": 1,
"json": 1,
}
Sitekey yang dimuat lewat JavaScript
Sebagian situs menyisipkan sitekey setelah render, jadi requests hanya menangkap HTML kosong. Ini yang sering menjebak worker headless — misalnya skrip price-monitoring di region AWS ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta) yang menarik HTML mentah sebelum reCAPTCHA termuat. Render dulu dengan Selenium, baru ekstrak.
from selenium import webdriver
from selenium.webdriver.common.by import By
def extract_dynamic_sitekey(url):
"""Extract sitekey from JavaScript-rendered page."""
driver = webdriver.Chrome()
driver.get(url)
# Wait for reCAPTCHA to load
import time
time.sleep(3)
# Try data-sitekey attribute
elements = driver.find_elements(By.CSS_SELECTOR, "[data-sitekey]")
if elements:
sitekey = elements[0].get_attribute("data-sitekey")
driver.quit()
return sitekey
# Try iframe src parameter
iframes = driver.find_elements(By.CSS_SELECTOR, "iframe[src*='recaptcha']")
for iframe in iframes:
src = iframe.get_attribute("src")
import re
match = re.search(r'[?&]k=([^&]+)', src)
if match:
driver.quit()
return match.group(1)
driver.quit()
return None
Alur perbaikan dari error ke token
Kalau Anda ingin satu urutan yang bisa langsung diikuti saat error muncul, jalankan lima langkah ini:
- Ekstrak ulang sitekey dari halaman target yang persis sama dengan
pageurlAnda. - Jalankan
validate_sitekeyuntuk menyingkirkan string kosong atau potongan HTML. - Deteksi tipe reCAPTCHA-nya, lalu set
enterprise=1atauinvisible=1bila perlu. - Kirim satu task percobaan dan tunggu token, bukan langsung seluruh batch.
- Jika masih
ERROR_WRONG_GOOGLEKEY, ganti ke ekstraksi berbasis Selenium — halaman kemungkinan me-render sitekey lewat JavaScript.
Tabel diagnosis cepat
| Gejala | Penyebab | Perbaikan |
|---|---|---|
| Key terlihat benar tapi error tetap muncul | Sitekey Enterprise | Tambahkan enterprise=1 |
| Key berubah antar kunjungan | Sitekey dinamis | Ekstrak sitekey baru setiap kali |
| Ada beberapa sitekey di satu halaman | Key yang salah dipilih | Cocokkan key dengan form yang tepat |
| Key berasal dari iframe CDN | Sitekey domain yang salah | Ambil dari halaman utama, bukan iframe |
| Sitekey kosong saat diekstraksi | Di-render lewat JavaScript | Gunakan Selenium untuk mengekstrak |
Kesalahan yang sering bikin error ini balik lagi
Setelah sitekey benar, error yang sama kadang muncul lagi karena hal-hal berikut:
- Menyimpan sitekey sebagai konstanta di kode lalu lupa bahwa situs merotasinya. Ekstrak ulang begitu solve mulai gagal.
- Mengirim
pageurlhasil redirect (misalnya setelah login) alih-alih halaman tempat CAPTCHA benar-benar tampil. - Menambahkan
enterprise=1pada sitekey standar "untuk jaga-jaga" — flag yang salah justru memicu error yang sama, jadi kirim hanya bila Enterprise benar-benar terdeteksi. - Meng-cache sitekey terlalu lama di worker yang berjalan berhari-hari tanpa refresh.
Untuk pipeline scraping berskala besar, patuhi juga UU Pelindungan Data Pribadi (UU 27/2022): ekstrak dan proses hanya data yang memang Anda berhak olah.
Pertanyaan umum
Kenapa sitekey terlihat benar tapi error tetap muncul?
Biasanya tipe reCAPTCHA-nya salah dikenali: halaman memakai Enterprise atau invisible, tetapi request dikirim sebagai standar. Tambahkan enterprise=1 atau invisible=1 sesuai deteksi.
Apakah pageurl yang salah bisa memicu ERROR_WRONG_GOOGLEKEY?
Bisa. Sitekey dan pageurl diperiksa sebagai pasangan. Pastikan pageurl menunjuk ke halaman tempat CAPTCHA tampil, bukan hasil redirect atau subdomain lain.
Bagaimana kalau ada beberapa reCAPTCHA di satu halaman?
Ambil sitekey dari form yang memang ingin diselesaikan, bukan yang pertama ditemukan regex. Cocokkan berdasarkan container atau id form terkait.
Apakah error ini berarti API key CaptchaAI saya bermasalah?
Tidak. ERROR_WRONG_GOOGLEKEY menunjuk ke sitekey atau pageurl, bukan ke API key Anda. Masalah pada API key memunculkan kode error yang berbeda seperti ERROR_KEY_DOES_NOT_EXIST.
Bagaimana memastikan sitekey masih valid sebelum mengirim ribuan task?
Jalankan validate_sitekey di atas sebagai cek murah, lalu solve satu task percobaan lebih dulu. Kalau task itu balik dengan token, baru lepas seluruh batch — cara ini menghemat saldo pada pipeline scraping bervolume tinggi.
Panduan terkait
Ambil sitekey yang tepat sekali jalan — selesaikan dengan CaptchaAI.