Google Apps Script memungkinkan Anda mengotomatiskan tugas di dalam Google Spreadsheet, Docs, dan produk Workspace lainnya. Ketika alur kerja spreadsheet Anda melibatkan image CAPTCHA — challenge OCR dari sumber data, gambar verifikasi, atau CAPTCHA berbasis teks — CaptchaAI dapat menyelesaikannya langsung dari Apps Script menggunakan UrlFetchApp.
Panduan ini menunjukkan cara membuat custom function di Google Spreadsheet yang mengirim image CAPTCHA ke CaptchaAI dan mengembalikan teks yang telah di-solve.
Skenario Nyata
Anda memiliki Google Sheet berisi URL yang mengarah ke image CAPTCHA yang perlu di-solve. Daripada menyelesaikannya secara manual, Anda menulis Apps Script function yang:
- Mengambil setiap image CAPTCHA dari URL
- Mengonversinya ke base64
- Mengirimkannya ke CaptchaAI
- Mengembalikan teks hasil solve ke sel spreadsheet
Langkah 1: Siapkan Proyek Apps Script
Di Google Spreadsheet Anda:
- Buka Extensions → Apps Script
- Buat file script baru bernama
captchaai.gs
Langkah 2: Tulis Solver CaptchaAI
// captchaai.gs
// Store your API key in Script Properties for security
// File → Project Properties → Script Properties → Add: CAPTCHAAI_KEY
function getApiKey() {
return PropertiesService.getScriptProperties().getProperty('CAPTCHAAI_KEY');
}
/**
* Solve an image CAPTCHA from a URL.
* @param {string} imageUrl URL of the CAPTCHA image to solve.
* @return {string} The solved CAPTCHA text.
* @customfunction
*/
function SOLVE_CAPTCHA(imageUrl) {
if (!imageUrl) return 'No URL provided';
try {
// Fetch the image and convert to base64
var imageResponse = UrlFetchApp.fetch(imageUrl);
var imageBlob = imageResponse.getBlob();
var base64Image = Utilities.base64Encode(imageBlob.getBytes());
// Submit to CaptchaAI
var taskId = submitCaptcha(base64Image);
if (!taskId) return 'Submit failed';
// Poll for result
var result = pollForResult(taskId);
return result || 'Solve failed';
} catch (e) {
return 'Error: ' + e.message;
}
}
/**
* Solve an image CAPTCHA from base64 text in a cell.
* @param {string} base64Image Base64-encoded CAPTCHA image.
* @return {string} The solved CAPTCHA text.
* @customfunction
*/
function SOLVE_CAPTCHA_BASE64(base64Image) {
if (!base64Image) return 'No image data';
try {
var taskId = submitCaptcha(base64Image);
if (!taskId) return 'Submit failed';
var result = pollForResult(taskId);
return result || 'Solve failed';
} catch (e) {
return 'Error: ' + e.message;
}
}
function submitCaptcha(base64Image) {
var apiKey = getApiKey();
var payload = {
'key': apiKey,
'method': 'base64',
'body': base64Image,
'json': '1'
};
var options = {
'method': 'post',
'payload': payload,
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(
'https://ocr.captchaai.com/in.php', options
);
var result = JSON.parse(response.getContentText());
if (result.status === 1) {
return result.request;
}
Logger.log('Submit error: ' + result.request);
return null;
}
function pollForResult(taskId) {
var apiKey = getApiKey();
var maxAttempts = 20;
// Initial wait
Utilities.sleep(5000);
for (var i = 0; i < maxAttempts; i++) {
var url = 'https://ocr.captchaai.com/res.php'
+ '?key=' + apiKey
+ '&action=get'
+ '&id=' + taskId
+ '&json=1';
var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
var result = JSON.parse(response.getContentText());
if (result.status === 1) {
return result.request;
}
if (result.request !== 'CAPCHA_NOT_READY') {
Logger.log('Solve error: ' + result.request);
return null;
}
Utilities.sleep(5000);
}
return null; // Timeout
}
Langkah 3: Konfigurasi Penyimpanan API Key
Simpan API key Anda dengan aman di Script Properties:
- Di editor Apps Script, klik Project Settings (ikon gear)
- Scroll ke Script Properties
- Klik Add script property
- Property:
CAPTCHAAI_KEY, Value: API key CaptchaAI Anda - Simpan
Langkah 4: Gunakan di Google Spreadsheet
Sebagai Custom Function
Di sel mana pun, gunakan formula:
=SOLVE_CAPTCHA("https://example.com/captcha-image.jpg")
Atau untuk data base64 yang sudah ada di dalam sel:
=SOLVE_CAPTCHA_BASE64(A2)
Batch Processing dengan Menu
Untuk memproses beberapa CAPTCHA, tambahkan custom menu yang memproses kolom URL gambar:
function onOpen() {
SpreadsheetApp.getUi().createMenu('CaptchaAI')
.addItem('Solve Column A CAPTCHAs', 'solveColumnCaptchas')
.addItem('Check Balance', 'checkBalance')
.addToUi();
}
function solveColumnCaptchas() {
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();
var urls = sheet.getRange('A2:A' + lastRow).getValues();
for (var i = 0; i < urls.length; i++) {
if (!urls[i][0]) continue;
var row = i + 2;
var existingResult = sheet.getRange('B' + row).getValue();
if (existingResult) continue; // Skip already solved
sheet.getRange('B' + row).setValue('Solving...');
SpreadsheetApp.flush();
var result = SOLVE_CAPTCHA(urls[i][0]);
sheet.getRange('B' + row).setValue(result);
sheet.getRange('C' + row).setValue(new Date()); // Timestamp
// Avoid hitting Apps Script quotas
Utilities.sleep(1000);
}
SpreadsheetApp.getUi().alert('Batch solving complete!');
}
function checkBalance() {
var apiKey = getApiKey();
var url = 'https://ocr.captchaai.com/res.php'
+ '?key=' + apiKey
+ '&action=getbalance'
+ '&json=1';
var response = UrlFetchApp.fetch(url);
var result = JSON.parse(response.getContentText());
SpreadsheetApp.getUi().alert(
'CaptchaAI Balance: $' + result.request
);
}
Langkah 5: Layout Spreadsheet
| Kolom A (URL Gambar) | Kolom B (Hasil) | Kolom C (Waktu Solve) |
|---|---|---|
| https://example.com/captcha1.jpg | ABC123 | 04-04-2026 10:15:00 |
| https://example.com/captcha2.jpg | XYZ789 | 04-04-2026 10:15:12 |
| https://example.com/captcha3.jpg | Solving... |
Pemecahan Masalah
| Masalah | Penyebab | Solusi |
|---|---|---|
TypeError: Cannot read property 'getProperty' |
Script Properties belum disetel | Tambahkan CAPTCHAAI_KEY di Project Settings |
Exception: Address unavailable |
URL gambar diblokir atau tidak valid | Pastikan URL gambar dapat diakses dari server Google |
Custom function mengembalikan Loading... selamanya |
Timeout eksekusi Apps Script (30 detik untuk custom function) | Gunakan pendekatan menu batch — menu function memiliki limit 6 menit |
ERROR_ZERO_BALANCE |
Akun tidak memiliki kredit | Top up saldo CaptchaAI Anda |
Kuota UrlFetchApp terlampaui |
Terlalu banyak API call | Tambahkan Utilities.sleep() antar panggilan; proses dalam batch lebih kecil |
Pertanyaan Umum
Berapa batas eksekusi Apps Script?
Custom function: 30 detik. Fungsi yang dipicu menu: 6 menit. Time-based trigger: 6 menit (atau 30 menit untuk Google Workspace). Rencanakan ukuran batch yang sesuai.
Bisakah saya solve reCAPTCHA v2 dari Apps Script?
Ya, tapi Anda harus memiliki sitekey dan page URL. Gunakan method=userrecaptcha alih-alih method=base64 dan sertakan parameter googlekey dan pageurl.
Bagaimana cara menangani rate limit?
Tambahkan Utilities.sleep(1000) di antara request solve. CaptchaAI tidak memiliki rate limit yang ketat, namun UrlFetchApp Apps Script memiliki kuota harian (20.000 panggilan untuk konsumen, 100.000 untuk Workspace).
Bisakah saya menjadwalkan batch solving?
Ya. Gunakan Triggers Apps Script (Edit → Triggers) untuk menjalankan solveColumnCaptchas sesuai jadwal (setiap jam, setiap hari, dll.).
Langkah Selanjutnya
Otomatiskan solve CAPTCHA dari Google Spreadsheet Anda — dapatkan API key CaptchaAI Anda dan tambahkan script ke spreadsheet Anda.
- Batch Image CAPTCHA Solving: Memproses 1.000 Gambar
- Make (Integromat) + CaptchaAI