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
Tự Động Hóa CAPTCHA với Node.js: Hướng Dẫn Tích Hợp Toàn Diện

Cài Đặt

terminal
npm install axios puppeteer

TypeScript 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(`Ln th ${attempt} tht bi: ${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.