Google Apps Script cho phép bạn tự động hóa các tác vụ bên trong Google Trang tính, Tài liệu và các sản phẩm Workspace khác. Khi quy trình làm việc trong bảng tính của bạn liên quan đến hình ảnh CAPTCHA – những thách thức OCR từ nguồn dữ liệu, hình ảnh xác minh hoặc CAPTCHA dựa trên văn bản –CaptchaAIcó thể giải quyết chúng trực tiếp từ Apps Script bằng UrlFetchApp.
Hướng dẫn này cho biết cách xây dựng chức năng tùy chỉnh trong Google Trang tính gửi hình ảnh CAPTCHA tới CaptchaAI và trả về văn bản đã giải quyết.
Kịch bản thế giới thực
Bạn có một Trang tính Google có các URL trỏ đến hình ảnh CAPTCHA cần được giải quyết. Thay vì giải quyết chúng theo cách thủ công, bạn viết một hàm Apps Script:
- Tìm nạp từng hình ảnh CAPTCHA từ URL
- Chuyển đổi nó thành base64
- Gửi nó tới CaptchaAI
- Trả lại văn bản đã giải quyết vào ô bảng tính
Bước 1: Thiết lập dự án Apps Script
Trong Trang tính Google của bạn:
- Đi tới Tiện ích mở rộng → Tập lệnh ứng dụng
- Tạo một tệp tập lệnh mới có tên
captchaai.gs
Bước 2: Viết Bộ giải 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
}
Bước 3: Định cấu hình lưu trữ khóa API
Lưu trữ khóa API của bạn một cách an toàn trong Thuộc tính tập lệnh:
- Trong trình chỉnh sửa Apps Script, hãy nhấp vào Cài đặt dự án (biểu tượng bánh răng)
- Cuộn đến Thuộc tính tập lệnh
- Nhấp vào Thêm thuộc tính tập lệnh
- Thuộc tính:
CAPTCHAAI_KEY, Giá trị: khóa API CaptchaAI của bạn - Lưu
Bước 4: Sử dụng trong Google Trang tính
Là một chức năng tùy chỉnh
Trong bất kỳ ô nào, hãy sử dụng công thức:
=SOLVE_CAPTCHA("https://example.com/captcha-image.jpg")
Hoặc đối với dữ liệu base64 đã có trong một ô:
=SOLVE_CAPTCHA_BASE64(A2)
Xử lý hàng loạt bằng một menu
Để xử lý nhiều CAPTCHA, hãy thêm menu tùy chỉnh xử lý một cột URL hình ảnh:
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
);
}
Bước 5: Bố cục bảng tính
| Cột A (URL hình ảnh) | Cột B (Kết quả) | Cột C (Giải quyết tại) |
|---|---|---|
| https://example.com/captcha1.jpg | ABC123 | 2026-04-04 10:15:00 |
| https://example.com/captcha2.jpg | XYZ789 | 2026-04-04 10:15:12 |
| https://example.com/captcha3.jpg | Giải quyết... |
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
TypeError: Cannot read property 'getProperty' |
Thuộc tính tập lệnh chưa được đặt | Thêm CAPTCHAAI_KEY trong Cài đặt dự án |
Exception: Address unavailable |
URL hình ảnh bị chặn hoặc không hợp lệ | Xác minh URL hình ảnh có thể truy cập được từ máy chủ của Google |
Hàm tùy chỉnh trả về Loading... mãi mãi |
Hết thời gian thực thi Apps Script (30 giây đối với các chức năng tùy chỉnh) | Thay vào đó, hãy sử dụng cách tiếp cận menu hàng loạt - các chức năng menu có giới hạn 6 phút |
ERROR_ZERO_BALANCE |
Tài khoản không có tín dụng | Nạp tiền vào số dư CaptchaAI của bạn |
Đã vượt quá hạn ngạch UrlFetchApp |
Quá nhiều lệnh gọi API | Thêm Utilities.sleep() giữa các cuộc gọi; xử lý theo lô nhỏ hơn |
Câu hỏi thường gặp
Giới hạn thực thi Apps Script là gì?
Chức năng tùy chỉnh: 30 giây. Chức năng kích hoạt menu: 6 phút. Trình kích hoạt theo thời gian: 6 phút (hoặc 30 phút đối với Google Workspace). Lập kế hoạch kích thước lô cho phù hợp.
Tôi có thể giải reCAPTCHA v2 từ Apps Script không?
Có, nhưng bạn cần có khóa trang và URL trang. Sử dụng method=userrecaptcha thay vì method=base64 và chuyển các tham số googlekey và pageurl.
Làm cách nào để xử lý giới hạn tỷ lệ?
Thêm Utilities.sleep(1000) giữa các yêu cầu giải quyết. CaptchaAI không có giới hạn tốc độ nghiêm ngặt nhưng UrlFetchApp của Apps Script có hạn ngạch hàng ngày (20.000 cuộc gọi cho người tiêu dùng, 100.000 cho Workspace).
Tôi có thể lên lịch giải quyết hàng loạt không?
Vâng. Sử dụng Trình kích hoạt (Chỉnh sửa -> Trình kích hoạt) của Apps Script để chạy solveColumnCaptchas theo lịch trình (hàng giờ, hàng ngày, v.v.).
Các bước tiếp theo
Tự động giải quyết CAPTCHA từ Google Trang tính của bạn —lấy khóa API CaptchaAI của bạnvà thêm tập lệnh vào bảng tính của bạn.
Hướng dẫn liên quan:
- Zapier + CaptchaAI: Giải CAPTCHA không cần mã
- Giải quyết CAPTCHA hình ảnh hàng loạt: Xử lý 1.000 hình ảnh
- Tạo (Integromat) + CaptchaAI