Integrasi

Google Apps Script + CaptchaAI: Otomatisasi CAPTCHA di Spreadsheet

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:

  1. Mengambil setiap image CAPTCHA dari URL
  2. Mengonversinya ke base64
  3. Mengirimkannya ke CaptchaAI
  4. Mengembalikan teks hasil solve ke sel spreadsheet

Langkah 1: Siapkan Proyek Apps Script

Di Google Spreadsheet Anda:

  1. Buka ExtensionsApps Script
  2. 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:

  1. Di editor Apps Script, klik Project Settings (ikon gear)
  2. Scroll ke Script Properties
  3. Klik Add script property
  4. Property: CAPTCHAAI_KEY, Value: API key CaptchaAI Anda
  5. 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.

Komentar dinonaktifkan untuk artikel ini.