Integrations

Airtable + CaptchaAI: Giải quyết CAPTCHA được kích hoạt cơ sở dữ liệu

Airtable là một nền tảng cơ sở dữ liệu linh hoạt được sử dụng để quản lý dự án, thu thập dữ liệu và tự động hóa quy trình làm việc. Khi quy trình làm việc Airtable của bạn cần tương tác với các dịch vụ được bảo vệ CAPTCHA — gửi biểu mẫu, xử lý URL hoặc tự động nhập dữ liệu —CaptchaAIcó thể giải quyết CAPTCHA trực tiếp từ Airtable bằng cách sử dụng các tiện ích mở rộng Tự động hóa và Tập lệnh.

Hướng dẫn này chỉ ra cách thiết lập Tự động hóa Airtable kích hoạt giải CAPTCHA thông qua CaptchaAI khi bản ghi mới được tạo hoặc cập nhật.

Kịch bản thế giới thực

Bạn theo dõi các URL mục tiêu trong bảng Airtable. Mỗi URL có một CAPTCHA cần được giải quyết trước khi có thể trích xuất dữ liệu. Khi một URL mới được thêm vào:

  1. Tự động hóa Airtable phát hiện bản ghi mới
  2. Tập lệnh gửi tham số CAPTCHA tới CaptchaAI
  3. CaptchaAI trả lại mã thông báo đã giải quyết
  4. Mã thông báo được lưu lại vào bản ghi Airtable

Cấu trúc bảng

Tạo một bảng Airtable có tên Nhiệm vụ CAPTCHA với các trường sau:

Tên trường loại Mục đích
URL URL URL trang mục tiêu
Khóa trang web Văn bản một dòng khóa trang web reCAPTCHA
Trạng thái Chọn một lần đang chờ giải quyết, giải quyết, giải quyết, thất bại
Mã thông báo Văn bản dài Đã giải quyết mã thông báo CAPTCHA
Giải quyết tại Ngày/time Dấu thời gian giải quyết
Lỗi Văn bản một dòng Thông báo lỗi nếu thất bại

Bước 1: Tạo Tự động hóa

Trong Airtable:

  1. Đi tới tab Tự động hóa
  2. Nhấp vào Tạo tự động hóa
  3. Đặt tên cho nó là: "Giải CAPTCHA trên bản ghi mới"

Trình kích hoạt

Chọn Khi bản ghi khớp với điều kiện:

  • Bảng: Nhiệm vụ CAPTCHA
  • Tình trạng: Trạng thái "đang chờ xử lý"

Điều này kích hoạt bất cứ khi nào một bản ghi được đặt thành "đang chờ xử lý" - bao gồm cả bản ghi mới và các bản ghi được giải quyết lại.

Bước 2: Thêm hành động tập lệnh

Thêm một hành động -> Chạy tập lệnh:

// Airtable Automation Script — Solve CAPTCHA via CaptchaAI

// Input configuration (set in the left panel):
// - recordId: Record ID from trigger
// - sitekey: Sitekey field from trigger
// - pageurl: URL field from trigger
const config = input.config();
const recordId = config.recordId;
const sitekey = config.sitekey;
const pageurl = config.pageurl;

const API_KEY = 'YOUR_API_KEY'; // Use input.config() for security

// Update status to "solving"
const table = base.getTable('CAPTCHA Tasks');
await table.updateRecordAsync(recordId, {
  'Status': { name: 'solving' },
});

try {
  // Step 1: Submit task to CaptchaAI
  const submitUrl = `https://ocr.captchaai.com/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${encodeURIComponent(sitekey)}&pageurl=${encodeURIComponent(pageurl)}&json=1`;

  const submitResponse = await fetch(submitUrl);
  const submitResult = await submitResponse.json();

  if (submitResult.status !== 1) {
    throw new Error(`Submit failed: ${submitResult.request}`);
  }

  const taskId = submitResult.request;
  console.log(`Task submitted: ${taskId}`);

  // Step 2: Poll for result (wait 15 seconds first)
  await new Promise(resolve => setTimeout(resolve, 15000));

  let token = null;
  for (let i = 0; i < 20; i++) {
    const pollUrl = `https://ocr.captchaai.com/res.php?key=${API_KEY}&action=get&id=${taskId}&json=1`;
    const pollResponse = await fetch(pollUrl);
    const pollResult = await pollResponse.json();

    if (pollResult.status === 1) {
      token = pollResult.request;
      break;
    }

    if (pollResult.request !== 'CAPCHA_NOT_READY') {
      throw new Error(`Solve failed: ${pollResult.request}`);
    }

    await new Promise(resolve => setTimeout(resolve, 5000));
  }

  if (!token) {
    throw new Error('Polling timeout — CAPTCHA not solved in time');
  }

  // Step 3: Update record with solved token
  await table.updateRecordAsync(recordId, {
    'Status': { name: 'solved' },
    'Token': token,
    'Solved At': new Date().toISOString(),
    'Error': '',
  });

  console.log(`CAPTCHA solved for record ${recordId}`);

} catch (error) {
  // Update record with error
  await table.updateRecordAsync(recordId, {
    'Status': { name: 'failed' },
    'Error': error.message,
  });
  console.error(`Failed: ${error.message}`);
}

Định cấu hình đầu vào tập lệnh

Trong bảng điều khiển bên trái của hành động tập lệnh, hãy ánh xạ các biến đầu vào:

  • recordId -> ID bản ghi từ bước kích hoạt
  • sitekey -> Trường khóa trang web từ bước kích hoạt
  • Trường URL pageurl -> từ bước kích hoạt

Bước 3: Xử lý hàng loạt với phần mở rộng tập lệnh

Để xử lý nhiều bản ghi cùng một lúc, hãy sử dụng Tiện ích mở rộng tập lệnh của Airtable (có sẵn trong bảng Ứng dụng):

// Batch CAPTCHA Solver — Airtable Scripting Extension
const API_KEY = 'YOUR_API_KEY';
const table = base.getTable('CAPTCHA Tasks');

// Get all pending records
const query = await table.selectRecordsAsync({
  fields: ['URL', 'Sitekey', 'Status'],
});

const pendingRecords = query.records.filter(
  r => r.getCellValueAsString('Status') === 'pending'
);

output.text(`Found ${pendingRecords.length} pending CAPTCHAs`);

for (const record of pendingRecords) {
  const sitekey = record.getCellValueAsString('Sitekey');
  const pageurl = record.getCellValueAsString('URL');

  if (!sitekey || !pageurl) {
    output.text(`Skipping ${record.id} — missing sitekey or URL`);
    continue;
  }

  output.text(`Solving for: ${pageurl}`);

  await table.updateRecordAsync(record.id, {
    'Status': { name: 'solving' },
  });

  try {
    // Submit
    const submitResp = await fetch(
      `https://ocr.captchaai.com/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${encodeURIComponent(sitekey)}&pageurl=${encodeURIComponent(pageurl)}&json=1`
    );
    const submitData = await submitResp.json();

    if (submitData.status !== 1) throw new Error(submitData.request);

    // Poll
    await new Promise(r => setTimeout(r, 15000));
    let token = null;

    for (let i = 0; i < 20; i++) {
      const pollResp = await fetch(
        `https://ocr.captchaai.com/res.php?key=${API_KEY}&action=get&id=${submitData.request}&json=1`
      );
      const pollData = await pollResp.json();

      if (pollData.status === 1) { token = pollData.request; break; }
      if (pollData.request !== 'CAPCHA_NOT_READY') throw new Error(pollData.request);
      await new Promise(r => setTimeout(r, 5000));
    }

    if (!token) throw new Error('Timeout');

    await table.updateRecordAsync(record.id, {
      'Status': { name: 'solved' },
      'Token': token,
      'Solved At': new Date().toISOString(),
    });
    output.text(`✓ Solved: ${pageurl}`);

  } catch (e) {
    await table.updateRecordAsync(record.id, {
      'Status': { name: 'failed' },
      'Error': e.message,
    });
    output.text(`✗ Failed: ${e.message}`);
  }
}

output.text('Batch processing complete');

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Tự động hóa không kích hoạt Bản ghi không khớp với điều kiện "đang chờ xử lý" Xác minh giá trị trường Trạng thái khớp chính xác
fetch is not defined Airtable Scripting sử dụng remoteFetchAsync trong một số ngữ cảnh Hãy thử remoteFetchAsync thay vì fetch
Hết thời gian chờ tập lệnh Các tập lệnh Airtable có giới hạn 30 giây cho tự động hóa Sử dụng ít lần lặp bỏ phiếu hơn; tăng thời gian chờ ban đầu lên 20 giây
Cập nhật bản ghi không thành công Tên trường không khớp Đảm bảo tên trường trong bảng khớp updateRecordAsync chính xác
Khóa API hiển thị trong tập lệnh Khóa API được mã hóa cứng Sử dụng input.config() với biến đầu vào bí mật

Câu hỏi thường gặp

Giới hạn thời gian thực thi tập lệnh trong Airtable là bao nhiêu?

Tập lệnh tự động hóa: 30 giây. Gia hạn tập lệnh: 30 giây (nhưng có thể được gia hạn với gói Pro). Để bỏ phiếu lâu, hãy tăng thời gian chờ ban đầu và giảm số lần lặp lại.

Tôi có thể sử dụng tính năng này cho CAPTCHA hình ảnh không?

Vâng. Thay đổi method thành base64 và gửi dữ liệu hình ảnh. Bạn có thể lưu trữ hình ảnh CAPTCHA được mã hóa base64 trong các trường Tệp đính kèm Airtable và trích xuất chúng trong tập lệnh.

Làm cách nào để xử lý khóa API một cách an toàn?

Trong Tự động hóa, hãy sử dụng biến đầu vào được định cấu hình trong bảng cài đặt tập lệnh. Trong tiện ích mở rộng Tập lệnh, bạn có thể nhắc nhập khóa khi chạy bằng input.textAsync().

Tôi có thể giải lại CAPTCHA bị lỗi không?

Vâng. Đặt Trạng thái trở lại "đang chờ xử lý" và quá trình tự động hóa sẽ kích hoạt lại. Thêm trường bộ đếm số lần thử lại để hạn chế số lần thử lại.

bài viết liên quan

  • Cách giải quyết cuộc gọi lại Recaptcha V2 bằng Api
  • Xử lý cửa quay Recaptcha V2 trên cùng một trang web
  • Cơ chế gọi lại Recaptcha V2

Các bước tiếp theo

Tự động giải quyết CAPTCHA từ cơ sở dữ liệu Airtable của bạn –lấy khóa API CaptchaAI của bạnvà thiết lập tự động hóa.

Hướng dẫn liên quan:

Os comentários estão desativados para este artigo.

Postagens relacionadas

Integrations Apify + CaptchaAI: Tích hợp nền tảng Cloud Scraping
Hướng dẫn tích hợp Apify + Captcha AI: Tích hợp nền tảng Cloud Scraping, với cách thiết lập, ví dụ về mã và đường dẫn rõ ràng để kết nối Captcha AI.

Hướng dẫn tích hợp Apify + Captcha AI: Tích hợp nền tảng Cloud Scraping, với cách thiết lập, ví dụ về mã và đư...

Apr 23, 2026
Troubleshooting CAPTCHA tự động hóa trình duyệt không thành công nhưng API vẫn hoạt động: Hướng dẫn gỡ lỗi
Hướng dẫn thực hành về trình duyệt tự động hóa CAPTCHA không thành công nhưng API vẫn hoạt động: Hướng dẫn gỡ lỗi, với các nguyên nhân phổ biến, các bước chẩn đ...

Hướng dẫn thực hành về trình duyệt tự động hóa CAPTCHA không thành công nhưng API vẫn hoạt động: Hướng dẫn gỡ...

Apr 29, 2026
Tutorials Xây dựng quy trình thử nghiệm tự động với CaptchaAI
Hướng dẫn từng bước để xây dựng quy trình thử nghiệm tự động với Captcha AI, với các ví dụ có thể sử dụng lại trực tiếp và quy trình làm việc Captcha AI rõ ràng...

Hướng dẫn từng bước để xây dựng quy trình thử nghiệm tự động với Captcha AI, với các ví dụ có thể sử dụng lại...

Apr 30, 2026