Quay Lại BlogHướng Dẫn
Tự Động Hóa CAPTCHA với Node.js: Hướng Dẫn Tích Hợp Toàn Diện
Xây dựng giải CAPTCHA mạnh mẽ cho ứng dụng Node.js với TypeScript, mẫu async/await và tích hợp Puppeteer.
Đội ngũ reGOTCHA18 tháng 12, 20257 phút đọc
Cài Đặt
terminal
npm install axios puppeteerTypeScript CAPTCHA Client
example.ts
import axios from 'axios';
interface TaskResponse {
errorId: number;
taskId?: string;
errorDescription?: string;
}
interface ResultResponse {
status: 'processing' | 'ready';
solution?: { gRecaptchaResponse: string };
errorId?: number;
errorDescription?: string;
}
class CaptchaSolver {
private apiKey: string;
private baseUrl = 'https://api.regotcha.com';
constructor(apiKey: string) {
this.apiKey = apiKey;
}
async solve(
websiteUrl: string,
websiteKey: string,
action: string = 'submit',
timeout: number = 120000
): Promise<string> {
// Tạo task
const { data: taskData } = await axios.post<TaskResponse>(
`${this.baseUrl}/createTask`,
{
clientKey: this.apiKey,
task: {
type: 'ReCaptchaV3EnterpriseTaskProxyless',
websiteURL: websiteUrl,
websiteKey: websiteKey,
pageAction: action,
},
}
);
if (taskData.errorId) {
throw new Error(taskData.errorDescription || 'Tạo task thất bại');
}
const taskId = taskData.taskId!;
const startTime = Date.now();
// Polling kết quả
while (Date.now() - startTime < timeout) {
const { data: result } = await axios.post<ResultResponse>(
`${this.baseUrl}/getTaskResult`,
{ clientKey: this.apiKey, taskId }
);
if (result.status === 'ready') {
return result.solution!.gRecaptchaResponse;
}
if (result.errorId) {
throw new Error(result.errorDescription || 'Giải thất bại');
}
await new Promise((r) => setTimeout(r, 2000));
}
throw new Error('Timeout chờ giải CAPTCHA');
}
}
export { CaptchaSolver };Tích Hợp Puppeteer
example.ts
import puppeteer from 'puppeteer';
import { CaptchaSolver } from './captcha-solver';
async function automateLogin() {
const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
const solver = new CaptchaSolver(process.env.REGOTCHA_API_KEY!);
await page.goto('https://example.com/login');
// Lấy site key từ trang
const siteKey = await page.evaluate(() => {
const script = document.querySelector('script[src*="recaptcha"]');
return script?.getAttribute('src')?.match(/render=([^&]+)/)?.[1];
});
if (!siteKey) throw new Error('Không tìm thấy site key');
// Giải CAPTCHA
const token = await solver.solve(
page.url(),
siteKey,
'login'
);
// Inject token
await page.evaluate((t) => {
const input = document.querySelector('[name="g-recaptcha-response"]');
if (input) (input as HTMLInputElement).value = t;
}, token);
// Submit form
await page.click('button[type="submit"]');
await page.waitForNavigation();
console.log('Đăng nhập thành công!');
await browser.close();
}
automateLogin().catch(console.error);Mẫu Xử Lý Lỗi
example.ts
import { CaptchaSolver } from './captcha-solver';
async function solveWithRetry(
solver: CaptchaSolver,
url: string,
key: string,
action: string,
maxRetries: number = 3
): Promise<string> {
let lastError: Error | null = null;
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await solver.solve(url, key, action);
} catch (error) {
lastError = error as Error;
console.log(`Lần thử ${attempt} thất bại: ${lastError.message}`);
if (attempt < maxRetries) {
await new Promise((r) => setTimeout(r, 2000 * attempt));
}
}
}
throw lastError;
}Phương Pháp Tốt: Luôn xử lý thời gian inject token cẩn thận - một số trang xác thực token ngay lập tức, trong khi các trang khác chỉ kiểm tra khi submit form.
Node.jsTypeScriptPuppeteerHướng dẫn
Sẵn sàng giải quyết CAPTCHA theo quy mô?
Bắt đầu với 50 tín dụng miễn phí. Không cần thẻ tín dụng.