Set calc=1 pada request submit ke in.php, dan CaptchaAI langsung mengembalikan angka hasil perhitungan — bukan teks persamaan yang masih harus Anda parsing sendiri. Satu parameter ini menghapus satu tahap penuh dari pipeline OCR CAPTCHA matematika: tidak perlu regex tambahan, tidak perlu fungsi evaluasi ekspresi di sisi klien untuk kasus normal — cukup baca field request di respons dan pakai langsung sebagai jawaban.
CAPTCHA jenis ini — gambar berisi soal seperti "7 + 3 = ?" atau "15 - 8 = ?" — masih sering muncul di form registrasi lama berbasis PHP, portal B2B, dan tool ticketing internal yang belum migrasi ke reCAPTCHA atau Turnstile. Bagi tim automation dan scraping freelance di Indonesia yang membangun pipeline QA lintas banyak situs, menambah satu parameter ke request yang sudah berjalan jauh lebih murah daripada menulis parser matematika terpisah untuk satu jenis CAPTCHA yang jarang muncul tapi tetap harus ditangani.
Apa Itu Parameter calc dan Kapan Perlu Dipakai
Endpoint in.php CaptchaAI menerima calc sebagai bagian dari request image/OCR biasa, bukan sebagai method terpisah. Nilainya menentukan apakah CaptchaAI mengembalikan teks mentah hasil OCR, atau sudah langsung menghitungkan hasilnya:
| Nilai calc | Perilaku |
|---|---|
0 (default) |
Mengembalikan teks apa adanya (contoh: "3+7") |
1 |
Menghitung hasilnya dan mengembalikannya (contoh: "10") |
Default-nya calc=0 — jadi kalau kode existing Anda sudah mengirim CAPTCHA gambar tanpa parameter ini, Anda hanya mendapat teks persamaan apa adanya dan harus menghitungnya sendiri. Menambahkan calc: 1 di payload submit, seperti pada contoh berikutnya, sudah cukup; tidak ada parameter tambahan yang perlu ditambahkan di sisi res.php saat polling hasil.
Solve CAPTCHA Matematika Dasar dengan calc=1
Fungsi berikut mengirim gambar CAPTCHA (base64) ke in.php dengan calc=1 dan numeric=1, lalu polling res.php sampai task selesai. Alur kirim → simpan task ID → polling → pakai hasil ini sama dengan pola CaptchaAI untuk tipe CAPTCHA lain — bedanya, hasil yang Anda terima di sini sudah berupa angka jadi, bukan token atau teks mentah:
import requests
import base64
import time
import os
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_math_captcha(image_b64):
"""Solve a math CAPTCHA — returns the computed result."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "base64",
"body": image_b64,
"calc": 1, # Compute the math
"numeric": 1, # Result will be a number
"json": 1,
}, timeout=30)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(result.get("request"))
task_id = result["request"]
time.sleep(8)
for _ in range(24):
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
return data["request"]
if data["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(data["request"])
time.sleep(5)
raise TimeoutError("Solve timeout")
# Example: Image shows "3 + 7 = ?"
# With calc=0: Returns "3+7"
# With calc=1: Returns "10"
Perhatikan jeda time.sleep(8) sebelum polling pertama dan time.sleep(5) di antara percobaan berikutnya. CAPTCHA image/OCR — termasuk CAPTCHA matematika — pada CaptchaAI umumnya clear di bawah 0.5 detik dengan tingkat keberhasilan tinggi, tapi loop retry tetap perlu untuk menahan variasi jaringan dan antrean saat volume request sedang tinggi, termasuk dari region yang dipakai banyak tim Indonesia untuk deployment scraping seperti AWS ap-southeast-1 (Singapura) atau GCP asia-southeast2 (Jakarta).
Format Soal CAPTCHA Matematika yang Bisa Ditangani calc
calc=1 menangani operasi aritmatika dasar — penjumlahan, pengurangan, perkalian, pembagian, dan kombinasi keduanya dalam satu soal:
Format Example Result
─────────────────────────────────────────
Addition 3 + 7 = ? 10
Subtraction 15 - 8 = ? 7
Multiplication 4 × 6 = ? 24
Division 20 ÷ 5 = ? 4
Mixed 3 + 4 × 2 = ? 11
Text-based "three plus five" 8
Baris terakhir — soal berbasis teks seperti "tiga tambah lima" — butuh perhatian ekstra. CaptchaAI tetap bisa membacanya, tapi akurasinya lebih baik kalau Anda memberi konteks lewat textinstructions.
Menambahkan textinstructions untuk Soal yang Rumit
Untuk format yang tidak standar — simbol yang jarang dipakai, soal dalam bentuk kalimat, atau layout yang membingungkan OCR — tambahkan textinstructions di payload yang sama:
def solve_text_math_captcha(image_b64, instructions):
"""Solve a math CAPTCHA with custom instructions."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "base64",
"body": image_b64,
"calc": 1,
"textinstructions": instructions,
"json": 1,
}, timeout=30)
return resp.json()
# Example instructions:
# "Solve the math expression and enter the number"
# "What is the result of the equation shown?"
# "Enter the sum of the two numbers"
Instruksi ini tidak mengubah cara calc bekerja — instruksi hanya memberi CaptchaAI konteks tambahan tentang apa yang harus dicari di gambar. Berguna terutama untuk form lokal yang memakai varian CAPTCHA custom, bukan library open-source standar.
Validasi Hasil dan Menangani Kasus Tepi calc=1
Hasil dari calc=1 biasanya berupa angka bulat, tapi soal dengan hasil negatif atau pecahan perlu penanganan tambahan sebelum dikirim ke form. Fungsi validate_math_result membersihkan whitespace dan menormalkan angka desimal yang sebetulnya bilangan bulat, sementara solve_math_with_fallback menyediakan jalur cadangan: kalau hasil dari calc=1 ternyata bukan angka valid, kirim ulang dengan calc=0 dan hitung sendiri ekspresinya lewat safe_eval — yang memfilter karakter di luar digit dan operator dasar sebelum memanggil eval, supaya tidak mengeksekusi input sembarangan:
# edge_cases.py
def validate_math_result(answer):
"""Validate and clean math CAPTCHA result."""
if not answer:
return None
# Remove spaces
answer = answer.strip()
# Handle negative results
if answer.startswith("-"):
try:
return str(int(answer))
except ValueError:
return answer
# Handle decimal results
try:
num = float(answer)
if num == int(num):
return str(int(num))
return str(num)
except ValueError:
return answer
def solve_math_with_fallback(image_b64):
"""Try calc=1, fall back to manual parsing if needed."""
# Try with calc
result = solve_math_captcha(image_b64)
# Validate result is actually a number
try:
float(result)
return result
except (ValueError, TypeError):
pass
# Fallback: solve without calc and compute locally
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "base64",
"body": image_b64,
"calc": 0, # Get the expression text
"json": 1,
}, timeout=30)
# ... poll for result ...
expression = "3+7" # Example OCR result
# Safely evaluate
return str(safe_eval(expression))
def safe_eval(expression):
"""Safely evaluate a simple math expression."""
# Only allow digits and basic operators
import re
cleaned = expression.replace("×", "*").replace("÷", "/").replace("=", "").replace("?", "")
cleaned = cleaned.strip()
if not re.match(r'^[\d\s+\-*/().]+$', cleaned):
raise ValueError(f"Unsafe expression: {expression}")
return eval(cleaned) # Safe because we validated the pattern
Pola fallback ini penting untuk kasus edge-case — misalnya OCR salah membaca operator × sebagai + pada gambar beresolusi rendah. Daripada task langsung gagal, pipeline Anda punya jalur kedua yang tetap menghasilkan jawaban.
Integrasi Penuh: dari Screenshot ke Input Form Otomatis
Menyambungkan solver ke alur Selenium nyata hanya butuh tiga langkah: screenshot elemen CAPTCHA, kirim ke solve_math_captcha, lalu isi hasilnya ke field input dan submit:
# full_flow.py
from selenium import webdriver
from selenium.webdriver.common.by import By
import base64
import os
def solve_math_captcha_on_page(driver, captcha_selector, input_selector, submit_selector):
"""Complete flow: capture math CAPTCHA, solve, enter answer."""
# Capture CAPTCHA image
captcha_el = driver.find_element(By.CSS_SELECTOR, captcha_selector)
image_b64 = captcha_el.screenshot_as_base64
# Solve with calc=1
answer = solve_math_captcha(image_b64)
print(f"Math answer: {answer}")
# Enter the computed result
input_el = driver.find_element(By.CSS_SELECTOR, input_selector)
input_el.clear()
input_el.send_keys(answer)
# Submit
driver.find_element(By.CSS_SELECTOR, submit_selector).click()
# Usage
driver = webdriver.Chrome()
driver.get("https://example.com/form")
solve_math_captcha_on_page(
driver,
captcha_selector="#captcha-image",
input_selector="#captcha-answer",
submit_selector="#submit-btn",
)
Struktur ini sama dengan integrasi tipe CAPTCHA lain di CaptchaAI: kirim task, simpan ID, polling, pakai hasil — di kasus lain berupa token, di sini berupa angka jadi. Kalau pipeline Anda sudah menangani reCAPTCHA v2 atau Cloudflare Turnstile, menambahkan solve CAPTCHA matematika tinggal reuse fungsi polling yang sama dengan endpoint dan parameter yang berbeda.
Mengatasi Error Umum pada calc
| Masalah | Penyebab | Solusi |
|---|---|---|
| Mengembalikan ekspresi, bukan hasil | calc=1 tidak ada |
Tambahkan calc=1 ke request submit |
| Hasil salah | Operator salah terbaca (× vs +) | Tambahkan textinstructions yang menjelaskan format persamaan |
| Mengembalikan desimal untuk persamaan bilangan bulat | Floating point | Konversi ke int: str(int(float(result))) |
ERROR_CAPTCHA_UNSOLVABLE |
Persamaan sangat terdistorsi | Coba preprocessing gambar terlebih dahulu |
Kalau ERROR_CAPTCHA_UNSOLVABLE terus muncul untuk gambar yang menurut Anda jelas, cek dulu resolusi dan kompresi gambar sebelum dikirim — kompresi JPEG agresif sering mendistorsi angka kecil sampai OCR salah baca.
Pertanyaan yang Sering Diajukan
Apakah parameter calc bisa menangani ekspresi matematika yang rumit, seperti ada tanda kurung atau pangkat?
Tidak untuk saat ini. calc=1 menangani aritmatika dasar (+, -, ×, ÷). Untuk ekspresi dengan tanda kurung atau eksponen, kirim dengan calc=0 lalu parsing dan hitung sendiri ekspresinya di sisi klien.
Kalau hasil perhitungannya negatif atau berupa desimal, apa yang dikembalikan CaptchaAI?
CaptchaAI mengembalikan angka negatif apa adanya (misalnya "5 - 8 = ?" menghasilkan "-3"). Untuk hasil desimal dari soal yang seharusnya bilangan bulat, normalisasi dengan str(int(float(result))) sebelum dikirim ke form, seperti pada fungsi validate_math_result di atas.
Berapa lama waktu penyelesaian CAPTCHA matematika lewat endpoint ocr.captchaai.com?
CAPTCHA tipe image/OCR — termasuk CAPTCHA matematika — pada CaptchaAI umumnya clear di bawah 0.5 detik dengan tingkat keberhasilan tinggi. Waktu total di sisi Anda tetap tergantung jeda polling yang Anda set sendiri; contoh kode di atas memakai jeda awal 8 detik lalu 5 detik per percobaan.
Apa bedanya parameter calc dengan numeric, dan apakah keduanya wajib dipakai bersama?
calc mengontrol apakah CaptchaAI menghitung persamaannya; numeric memberi hint bahwa hasil yang diharapkan berupa angka, membantu OCR membaca digit dengan lebih akurat. Keduanya tidak wajib dipakai bersamaan, tapi untuk CAPTCHA matematika kombinasi calc=1 plus numeric=1 — seperti pada contoh kode di atas — memberi hasil paling konsisten.
Apakah saya masih perlu menulis fungsi evaluasi matematika sendiri di sisi klien kalau sudah pakai calc=1?
Untuk kasus normal, tidak — calc=1 sudah cukup. Tapi tetap siapkan fallback seperti safe_eval pada contoh di atas untuk menangani kasus ketika hasil dari calc=1 bukan angka valid; ini jaring pengaman, bukan jalur utama.
Baca Juga
Hentikan parsing manual hasil CAPTCHA matematika — mulai dengan CaptchaAI.