
Anh Tuan
Data Science Expert

sessions: write, gây ra lỗi 403, và tham số đầu tiên của công cụ thiếu ghi chú BaseModel Pydantic, gây ra ValidationError.Hướng dẫn này tích hợp CapSolver với Composio như một công cụ cho agent hoàn thành quy trình reCAPTCHA v2. Thay vì chỉ trả về token, công cụ chạy toàn bộ chuỗi trang và coi phản hồi thực tế của trang là điều kiện thành công. SDK Agent của OpenAI quyết định khi nào gọi công cụ, trong khi tự động hóa trình duyệt Playwright duy trì ngữ cảnh trang được sử dụng để gửi và xác minh.
Sử dụng mẫu này chỉ cho các quy trình hợp pháp, hợp lý, có trách nhiệm và được người dùng ủy quyền. Khả năng kỹ thuật không cấp quyền truy cập vào dữ liệu riêng tư, bị hạn chế, nhạy cảm hoặc không được ủy quyền; xem lại hướng dẫn tự động hóa AI trước khi triển khai.
Quy trình:
Chạy script
-> SDK Agent của OpenAI quyết định công cụ nào cần gọi
-> Công cụ tùy chỉnh của Composio: complete_recaptcha_v2
-> Playwright mở trang
-> capsolver.solve(...) trả về gRecaptchaResponse
-> Áp dụng token vào g-recaptcha-response
-> Playwright gửi và chờ trang
-> Đọc trang và xác định chấp nhận
-> Công cụ trả về {"accepted": ..., "message": ...}
-> Agent báo cáo kết quả từ accepted
Các thành phần có trách nhiệm như sau:
| Thành phần | Trách nhiệm |
|---|---|
| SDK Agent của OpenAI | Hiểu chỉ thị bằng ngôn ngữ tự nhiên, quyết định khi nào gọi công cụ, thực thi và tổ chức phản hồi |
| Composio | Đăng ký hàm Python chuẩn làm công cụ có thể gọi bởi Agent |
| Playwright | Mở trang, áp dụng kết quả, gửi biểu mẫu và đọc trạng thái trang kết quả |
| SDK CapSolver | Trả về kết quả CAPTCHA thông qua cuộc gọi solve() duy nhất |
pip install composio composio-openai-agents openai-agents capsolver pydantic playwright
playwright install chromium
Mỗi phụ thuộc phục vụ một vai trò cụ thể:
| Gói | Mục đích |
|---|---|
| composio | Tạo phiên và đăng ký hoặc tải công cụ tùy chỉnh |
| composio-openai-agents | Chuyển đổi công cụ Composio thành đối tượng mà OpenAI Agents có thể gọi |
| openai-agents | Cung cấp Agent, Runner và bộ nhớ đa lần |
| capsolver | Cung cấp SDK chính thức và trả về kết quả qua solve() |
| pydantic | Định nghĩa lược đồ đầu vào của công cụ |
| playwright | Mở trang, áp dụng kết quả, gửi biểu mẫu và đọc phản hồi |
# Khóa API.
COMPOSIO_API_KEY = "ak_..."
OPENAI_API_KEY = "sk-..." # Khóa API OpenAI chính thức của bạn.
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY # SDK OpenAI đọc khóa từ môi trường.
# Cấu hình CapSolver và Composio.
capsolver.api_key = "CAP-..."
composio = Composio(
api_key=COMPOSIO_API_KEY,
provider=OpenAIAgentsProvider(),
)
Ghi chú cấu hình:
OPENAI_API_KEYphải được ghi vào môi trường vì SDK đọc khóa từ đó;OpenAIAgentsProviderlàm cho các công cụ trả về bởisession.tools()tương thích với Agent; khóa Composio cần quyềnsessions: writehoặc việc tạo phiên sẽ trả về 403.
Hiện tại nhà cung cấp OpenAI của Composio và SDK Agent của OpenAI giải thích biên giới nhà cung cấp và agent được sử dụng bởi cấu hình này.
Nhận mã ưu đãi CapSolver của bạn
Tăng ngân sách tự động hóa của bạn ngay lập tức!
Sử dụng mã ưu đãi CAP26 khi nạp tiền vào tài khoản CapSolver để nhận thêm 5% ưu đãi cho mỗi lần nạp — không giới hạn.
Nhận mã ngay trong Bảng điều khiển CapSolver
Điều kiện dừng: công cụ chỉ báo cáo thành công khi trang chứa văn bản thành công mong đợi. Khối
finallyđóng trình duyệt trong cả hai trường hợp thành công và thất bại.
import os
from typing import List, cast
import capsolver
from agents import Agent, Runner, SQLiteSession
from composio import Composio
from composio.core.models.custom_tool import CustomTool
from composio.core.models.tool_router import ToolRouterExperimentalConfig
from composio_openai_agents import OpenAIAgentsProvider
from playwright.sync_api import sync_playwright
from pydantic import BaseModel, Field
# Khóa API.
COMPOSIO_API_KEY = "ak_..."
OPENAI_API_KEY = "sk-..." # Khóa API OpenAI chính thức của bạn.
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
# Cấu hình CapSolver và Composio.
capsolver.api_key = "CAP-..."
composio = Composio(
api_key=COMPOSIO_API_KEY,
provider=OpenAIAgentsProvider(),
)
# Lược đồ đầu vào cho công cụ tùy chỉnh; Composio yêu cầu BaseModel Pydantic ở đây.
class CompleteRecaptchaInput(BaseModel):
target_url: str = Field(
default="https://www.google.com/recaptcha/api2/demo",
description="Địa chỉ URL trang chứa demo reCAPTCHA v2",
)
website_key: str = Field(
default="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
description="Khóa website reCAPTCHA v2 từ trang hiện tại",
)
# Đăng ký toàn bộ luồng như một công cụ Composio mà agent có thể gọi.
# Ghi chú kiểu tham số đầu tiên là bắt buộc cho Composio để suy diễn lược đồ.
@composio.experimental.tool(preload=True)
def complete_recaptcha_v2(input: CompleteRecaptchaInput, _ctx):
"""Mở trang bằng Playwright, giải reCAPTCHA v2, gửi và xác minh."""
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # Đặt headless=True để ẩn cửa sổ.
page = browser.new_page()
try:
page.goto(input.target_url)
# Yêu cầu CapSolver giải reCAPTCHA v2.
solution = capsolver.solve(
{
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": input.target_url,
"websiteKey": input.website_key,
}
)
token = solution.get("gRecaptchaResponse")
page.evaluate(
"""
(token) => {
const textarea = document.getElementById('g-recaptcha-response');
if (textarea) {
textarea.value = token;
}
}
""",
token,
)
page.click("#recaptcha-demo-submit")
page.wait_for_load_state("networkidle")
result_page = page.content()
# Thành công chỉ khi trang thực sự hiển thị văn bản thành công
accepted = "Verification Success" in result_page
return {
"accepted": accepted,
"message": (
"Verification Success"
if accepted
else "Trang không báo Verification Success"
),
}
finally:
browser.close()
def main():
experimental: ToolRouterExperimentalConfig = {
"custom_tools": cast(List[CustomTool], [complete_recaptcha_v2]),
}
session = composio.sessions.create(
user_id="playwright-recaptcha-demo-user",
experimental=experimental,
sandbox={"enable": False}, # Chạy công cụ trong quá trình này, không phải trong sandbox.
)
agent = Agent(
name="Trợ lý reCAPTCHA Playwright",
instructions=(
"Khi người dùng yêu cầu chạy demo, gọi complete_recaptcha_v2 "
"với giá trị mặc định. Báo cáo thành công chỉ khi accepted là true."
),
model="gpt-5.2",
tools=session.tools(),
)
# Bộ nhớ cho cuộc trò chuyện nhiều lần
memory = SQLiteSession("conversation")
print("Demo Composio + reCAPTCHA v2 Playwright đang chạy...")
user_input = (
"Gọi complete_recaptcha_v2 ngay bây giờ với target_url và website_key mặc định. Không hỏi xác nhận."
)
result = Runner.run_sync(
starting_agent=agent,
input=user_input,
session=memory,
)
print(f"Trợ lý: {result.final_output}\n")
if __name__ == "__main__":
main()
Mẫu tương tự có thể xử lý CAPTCHA hình ảnh tiêu chuẩn bằng cách đăng ký công cụ Composio thứ hai. Ví dụ này sử dụng BotDetect CAPTCHA Demo: phần tử hình ảnh là #demoCaptcha_CaptchaImage, đầu vào là #captchaCode, và nút xác minh là #validateCaptchaButton.

Yêu cầu ImageToTextTask gửi hình ảnh Base64 qua body. Khác với các nhiệm vụ dựa trên token, nhiệm vụ này trả về văn bản đã nhận diện trực tiếp và không cần vòng lặp kiểm tra riêng.
image_src = page.locator("#demoCaptcha_CaptchaImage").get_attribute("src")
if not image_src or "," not in image_src:
raise RuntimeError("Không tìm thấy URL dữ liệu hình ảnh CAPTCHA hợp lệ")
base64_image = image_src.split(",", 1)[1] # Loại bỏ phần đầu "data:image/...;base64,"
class CompleteImageCaptchaInput(BaseModel):
target_url: str = Field(
default="https://captcha.com/demos/features/captcha-demo.aspx",
description="Địa chỉ URL trang demo CAPTCHA hình ảnh",
)
module: str = Field(
default="common",
description="Mô-đun nhận dạng ImageToTextTask của CapSolver",
)
@composio.experimental.tool(preload=True)
def complete_image_captcha(input: CompleteImageCaptchaInput, _ctx):
"""Mở trang bằng Playwright, nhận dạng CAPTCHA hình ảnh, gửi và xác minh."""
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
try:
page.goto(input.target_url)
page.wait_for_selector("#demoCaptcha_CaptchaImage", state="visible")
# src hình ảnh đã là URL dữ liệu; loại bỏ phần đầu để lấy Base64.
image_src = page.locator("#demoCaptcha_CaptchaImage").get_attribute("src")
if not image_src or "," not in image_src:
raise RuntimeError("Không tìm thấy URL dữ liệu hình ảnh CAPTCHA hợp lệ")
base64_image = image_src.split(",", 1)[1]
solution = capsolver.solve(
{
"type": "ImageToTextTask",
"websiteURL": input.target_url,
"module": input.module,
"body": base64_image,
}
)
captcha_text = solution.get("text")
if not isinstance(captcha_text, str) or not captcha_text:
raise RuntimeError("CapSolver không trả về văn bản đã nhận diện")
page.fill("#captchaCode", captcha_text) # Ghi kết quả vào #captchaCode.
page.click("#validateCaptchaButton")
page.wait_for_load_state("networkidle")
result_page = page.content()
# Trang demo hiển thị "Correct!" khi thành công, "Incorrect!" khi thất bại.
accepted = "Correct!" in result_page
return {
"accepted": accepted,
"recognized_text": captcha_text,
"message": "Correct!" if accepted else "Trang không báo Correct!",
}
finally:
browser.close()
Tổng quan luồng:
Playwright mở trang CAPTCHA
-> Chờ #demoCaptcha_CaptchaImage hiển thị
-> Đọc src (URL dữ liệu) và loại bỏ phần đầu để lấy Base64
-> capsolver.solve(ImageToTextTask) trả về văn bản
-> page.fill ghi kết quả vào #captchaCode
-> page.click kích hoạt #validateCaptchaButton
-> page.content kiểm tra Correct! hoặc Incorrect!
-> finally đóng trình duyệt
Tham số module là tùy chọn và mặc định là common. Nếu CAPTCHA chứa chỉ số, sử dụng number. Các phong cách đặc biệt có thể sử dụng mô-đun độc lập được tài liệu khi phù hợp.

Ví dụ, sử dụng mã nguồn nguyên vẹn sau cho nhận dạng chỉ số:
solution = capsolver.solve({
"type": "ImageToTextTask",
"module": "number",
"images": [base64_image],
})
answers = solution["answers"]
Mô-đun number hỗ trợ nhiều hình ảnh trong một lần gửi, và images có thể chứa đến chín chuỗi Base64. Các tên mô-đun được hỗ trợ và trường hợp sử dụng được liệt kê trên trang ImageToTextTask của CapSolver.
experimental.tool: tham số đầu tiên của "complete_recaptcha_v2" phải được ghi chú bằng lớp con BaseModel Pydantic. Nhận được: <class 'inspect._empty'>
Composio suy diễn lược đồ đầu vào từ ghi chú kiểu tham số đầu tiên, do đó input: CompleteRecaptchaInput không thể bỏ qua. Đây là ghi chú chức năng, không phải ghi chú kiểu tùy chọn. Tài liệu BaseModel Pydantic mô tả kiểu mô hình được sử dụng cho lược đồ.
Tạo phiên có thể trả về lỗi sau:
403 APIKey_InsufficientPermissions
Đường dẫn này yêu cầu quyền ghi "phiên"
Nguyên nhân là composio.sessions.create() yêu cầu quyền ghi cho khóa dự án, trong khi khóa hiện tại chỉ có quyền đọc. Khóa vẫn hợp lệ nhưng phạm vi không đủ, vì vậy phản hồi là 403 thay vì 401.
Các bước khắc phục:
sessions: write và thay thế COMPOSIO_API_KEY ở đầu đoạn mã.Lõi của tích hợp này là quy trình kinh doanh đầy đủ được đóng gói dưới dạng một công cụ Composio:
Công cụ Composio = Các hành động trang Playwright + Kết quả CapSolver + Xác minh trạng thái trang
Chạy ví dụ chỉ trên các trang và quy trình bạn sở hữu hoặc được phép tự động hóa. Sử dụng biến môi trường hoặc quản lý bí mật để lưu trữ thông tin xác thực, dừng lại khi trang không đạt được trạng thái kinh doanh mong đợi và xem xét các lỗi lặp lại thay vì thử lại vô hạn.
Đối với quy trình làm việc của agent Composio được ủy quyền cần lớp hạ tầng CAPTCHA tập trung, hãy kiểm tra CapSolver với các trang do bạn kiểm soát và xác minh kết quả ứng dụng sau mỗi lần giải.
Composio xử lý gì trong tích hợp này?
Composio đăng ký hàm Python dưới dạng công cụ tùy chỉnh có thể gọi bởi agent, tạo phiên, hiển thị schema công cụ và định tuyến thực thi từ agent OpenAI.
Tại sao tham số đầu tiên của công cụ phải là BaseModel của Pydantic?
Composio sử dụng ghi chú này để suy diễn schema đầu vào của công cụ. Bỏ qua sẽ ngăn việc xây dựng schema và gây ra lỗi xác thực trước khi quy trình trình duyệt bắt đầu.
Công cụ reCAPTCHA v2 dừng lại sau khi CapSolver trả về token?
Không. Mã không thay đổi áp dụng token, gửi biểu mẫu demo, đọc HTML kết quả và chỉ báo thành công khi trang chứa văn bản "Verification Success" mong đợi.
ImageToTextTask có cần vòng lặp kiểm tra riêng không?
Không. Trong quy trình này, SDK chính thức trả về văn bản đã nhận dạng trực tiếp. Công cụ sau đó điền vào ô nhập, gửi trang và kiểm tra "Correct!" như điều kiện dừng.
Quy trình này có thể sử dụng trên bất kỳ trang web nào không?
Không. Sử dụng chỉ cho tự động hóa hợp pháp, hợp lý, có trách nhiệm và được người dùng ủy quyền. Tôn trọng điều khoản trang, luật pháp áp dụng, giới hạn tốc độ và yêu cầu giảm thiểu dữ liệu.
Một người đại diện AI giải reCAPTCHA v3 chỉ đáng tin cậy khi người đại diện duy trì hành động, trang, phiên trình duyệt và ngữ cảnh xác thực đã tạo ra thử thách. CapSolver cung cấp lớp cơ sở hạ tầng CAPTCHA được tài liệu hóa thông qua Core SDK, Công cụ Người đại diện và MCP. Người đại diện vẫn chịu trách nhiệm về chính sách, số lần thử lại và xác nhận của nhiệm vụ ban đầu. Hướng dẫn này giải thích tích hợp sản xuất cho reCAPTCHA v3, bao gồm cả Enterprise, mà không coi token trả về là thành công cuối cùng.

Khi báo cáo CAPTCHA không hoạt động từ trí tuệ nhân tạo (AI) đến, cụm từ này che giấu nhiều sự cố khác nhau. Phát hiện có thể sai lệch, trí tuệ nhân tạo có thể định tuyến đến công cụ không khả dụng, trình duyệt có thể điều hướng trước khi kết quả trả về, hoặc ứng dụng có thể từ chối kết quả đã được tạo ra về mặt kỹ thuật. CapSolver cung cấp cơ sở hạ tầng CAPTCHA được tài liệu hóa, trong khi trình điều phối của bạn phải lưu giữ bằng chứng và chọn nhánh phục hồi đúng. Hướng dẫn này biến một sự cố mơ hồ thành một lớp
