
Anh Tuan
Data Science Expert
Đã xuất bản Nov 02, 2026
Đã cập nhật Nov 02, 2026 · đọc tối thiểu

ErrorId của API; lỗi Go là nil không chứng minh dịch vụ xử lý thành công.chromedp là một thư viện Go để điều khiển trình duyệt thông qua Chrome DevTools Protocol. Lập trình viên dùng nó để kiểm thử và tự động hóa trình duyệt mà không phải thêm một trình điều khiển Python hay JavaScript. Khi một tác vụ trình duyệt đã được cho phép gặp một CAPTCHA được hỗ trợ, ứng dụng Go có thể gọi một solver rồi tiếp tục điều khiển cùng trang đó.
CapSolver cung cấp Go SDK chính thức và các API tác vụ được tài liệu hóa cho bước giải. Hướng dẫn này kết nối các trách nhiệm đó mà không trình bày thư viện trình duyệt như một solver. Bài kiểm tra chạy được sử dụng một fixture trình duyệt cục bộ thuộc sở hữu và một yêu cầu API thật với khóa giả cố ý không hợp lệ. Nó xác minh dây nối và xử lý lỗi, không phải một lần giải tốn phí.
Giải CAPTCHA được đặt giữa bước thu thập tham số thử thách hiện tại và bước tiếp tục thao tác trình duyệt cần tới kết quả.
Kho lưu trữ chromedp chính thức cung cấp bộ điều khiển trình duyệt. Chương trình Go của bạn mở trang được cho phép, đọc trạng thái liên quan và quyết định khi nào một thử thách được hỗ trợ cần được xử lý. Solver cung cấp đầu ra đã được tài liệu hóa; chromedp vẫn chịu trách nhiệm cho các thao tác trang tiếp theo.
Một CAPTCHA không phải là bằng chứng rằng mọi thao tác trình duyệt bị treo đều cần một yêu cầu giải. Một trường thiếu, điều hướng thất bại, hoặc lỗi ứng dụng có thể cần một cách khắc phục khác. Hãy nhận diện đúng thử thách trước khi chọn loại tác vụ.
Với một form QA thuộc sở hữu, chuỗi thao tác khá thẳng: mở form, xác định cấu hình CAPTCHA của nó, yêu cầu lời giải khi phù hợp, áp dụng lời giải qua đường tích hợp mà ứng dụng mong đợi, rồi kiểm tra xác nhận của form. Hướng dẫn này không cung cấp callback hay script gửi form dùng chung cho mọi website.
Dùng một module Go tách biệt và phụ thuộc được cố định phiên bản để các lời gọi API trong bài trùng với bản build của bạn.
Môi trường đã kiểm thử dùng Go 1.27.3, github.com/chromedp/chromedp@v0.21.0, và github.com/capsolver/capsolver-go@v0.0.0-20251204081438-e4e07af23eae. Chrome được cài cục bộ và chạy trong một context trình duyệt tạm riêng.
Tạo thư mục làm việc, khởi tạo module với go mod init captcha-browser-check, sau đó chạy:
go get github.com/chromedp/chromedp@v0.21.0 github.com/capsolver/capsolver-go@v0.0.0-20251204081438-e4e07af23eae
Ghi chú phát hành v0.21.0 nêu rằng Go 1.25 trở lên được hỗ trợ. Hãy dùng tài liệu của phiên bản đó khi điều chỉnh một script trình duyệt cũ. Việc trộn các ví dụ xuất kết quả bằng con trỏ cũ với API hành động kiểu mới có thể gây lỗi biên dịch trước cả khi bất kỳ yêu cầu trình duyệt hay solver nào chạy.
Tài liệu chính thức API balance bao gồm phương thức Balance() của Go SDK. Lời gọi balance hữu ích để tách việc truy cập tài khoản/API khỏi việc giải CAPTCHA cụ thể. Nó không tạo một tác vụ CAPTCHA.
Chạy một bài kiểm tra nhỏ chứng minh Chrome có thể đọc một trang thuộc sở hữu và Go SDK có thể nhận một phản hồi API thực tế.
Lưu đoạn này thành main.go và chạy go run . từ module đã khởi tạo. Thuộc tính cục bộ FIXTURE_ONLY là dữ liệu test, không phải sitekey thật. API key cố ý không hợp lệ, và chương trình kỳ vọng dịch vụ sẽ từ chối nó.
package main
import (
"context"
"fmt"
"log"
"net/http"
"net/http/httptest"
"time"
"github.com/chromedp/chromedp"
capsolver "github.com/capsolver/capsolver-go"
)
func main() {
// Fixture cục bộ kiểm tra dây nối trình duyệt. Nó không phải CAPTCHA thật.
fixture := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, `<title>Owned QA fixture</title><div id="widget" data-sitekey="FIXTURE_ONLY"></div>`)
}))
defer fixture.Close()
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
ctx, deadline := context.WithTimeout(ctx, 30*time.Second)
defer deadline()
if err := chromedp.Do(ctx, chromedp.Navigate(fixture.URL)); err != nil { log.Fatal(err) }
sitekey, err := chromedp.Run(ctx, chromedp.AttributeValue("#widget", "data-sitekey"))
if err != nil { log.Fatal(err) }
if !sitekey.Exists || sitekey.Value != "FIXTURE_ONLY" { log.Fatal("Fixture key not found") }; fmt.Println("Fixture key:", sitekey.Value)
// Thông tin xác thực cố ý không hợp lệ: kiểm tra lỗi API thực, không phải tài khoản.
solver := capsolver.CapSolver{ApiKey: "YOUR_API_KEY"}
result, err := solver.Balance()
if err != nil { log.Fatal(err) }
fmt.Println("API error:", result.ErrorId, result.ErrorCode)
if result.ErrorId == 0 { log.Fatal("Expected the placeholder credential to be rejected") }
}
Lần chạy đã xác minh in ra Fixture key: FIXTURE_ONLY, tiếp theo là một lỗi API với ErrorId bằng 1 và ERROR_KEY_DOES_NOT_EXIST. Hãy xem mã đó là phản hồi quan sát được cho bài kiểm tra placeholder này, không phải phản hồi đảm bảo cho mọi thông tin xác thực không hợp lệ.
Điều này thiết lập việc truy cập trình duyệt cục bộ và một đường yêu cầu–phản hồi thực tới API. Không tài khoản thật nào được truy vấn, không thử thách nào được giải, và không hành động gửi form nào được thực hiện.
Hành động AttributeValue hiện tại trả về một AttributeResult chứa giá trị thuộc tính và cờ tồn tại.
Ví dụ kiểm tra cả hai trường trước khi tiếp tục. Một thuộc tính thiếu phải dừng việc thu thập tham số thay vì trở thành sitekey rỗng trong một yêu cầu tốn phí. Một selector hoạt động trên fixture thuộc sở hữu này không phải là selector dùng chung cho mọi tích hợp CAPTCHA.
SDK đã kiểm tra có thể trả về một phản hồi dịch vụ đã parse mà không trả về lỗi Go.
Đó là lý do ví dụ kiểm tra result.ErrorId sau khi xử lý err. Lỗi mạng, lỗi parse JSON, và một phản hồi hợp lệ mô tả lỗi tài khoản là những điều kiện khác nhau. Hãy đọc chính xác phản hồi trả về thay vì giả định err == nil nghĩa là tài khoản hay tác vụ đã thành công.
Nhập mã thưởng CapSolver của bạn
Tăng ngân sách tự động hóa ngay lập tức!
Dùng mã thưởng CAP26 khi nạp tiền vào tài khoản CapSolver để nhận thêm 5% tiền thưởng cho mỗi lần nạp — không giới hạn.
Đổi mã ngay trong Bảng điều khiển CapSolver
Dùng tài liệu task của loại CAPTCHA đã chọn để xây dựng yêu cầu giải từ chính trang bạn đã kiểm tra.
Với reCAPTCHA v2, tài liệu task chính thức chỉ rõ họ task và các trường như websiteURL và websiteKey. Hãy dùng đúng chính tả và chữ hoa–thường được tài liệu hóa. Đừng tự nghĩ ra tên task từ trí nhớ hoặc sao chép một ví dụ SDK cũ mà không kiểm tra hợp đồng hiện tại.
Go SDK chính thức cung cấp Solve() cho một map task. Bản triển khai production nên cung cấp thông tin xác thực thật một cách an toàn, truyền các tham số task hiện tại, và kiểm tra kết quả trả về hoặc lỗi theo phiên bản SDK đã cố định.
Bài kiểm tra kết nối ở trên được cố ý thiết kế không phải một chương trình giải tốn phí hoàn chỉnh. Trước khi triển khai bước giải, hãy chạy một thử thách được cho phép bằng tài khoản đã được nạp tiền của bạn và xác thực kết quả so với ứng dụng thuộc sở hữu. Bước đó phụ thuộc vào thông tin xác thực và không được thực hiện trong bài này, nên không có tỷ lệ thành công hay hoàn thành end-to-end nào được khẳng định.
Giữ URL trang, họ thử thách, public key và các tham số tùy chọn bắt buộc gắn liền với cùng một thao tác trình duyệt. Nếu điều hướng thay thế trang hoặc tạo lại thử thách, hãy kiểm tra lại đầu vào trước khi bắt đầu một lần thử khác.
Dùng lời giải theo cách mà ứng dụng thuộc sở hữu mong đợi, rồi xác minh hành vi ứng dụng đã thay đổi như dự kiến.
Kết quả dạng token không phải là chỉ thị phải nhấp bất kỳ nút xác minh nào hiển thị. Một số ứng dụng dùng callback, số khác bind kết quả vào form, và việc xác thực phía máy chủ cuối cùng vẫn rất quan trọng. Hãy tham khảo triển khai của ứng dụng thay vì đoán tên callback JavaScript.
Tài liệu xác minh phản hồi của Google giải thích bước xác minh phía server cho reCAPTCHA. Tự động hóa trình duyệt chạy tới một dòng code sau khi giải không đồng nghĩa với việc server chấp nhận phản hồi đó.
Giữ điều kiện thành công của bài test thật cụ thể. Với một form thuộc sở hữu, hãy kiểm tra xác nhận của form hoặc bản ghi test. Với một quy trình đọc được cho phép, hãy kiểm tra nội dung mong đợi. Tránh coi widget biến mất là tín hiệu hoàn thành duy nhất khi ứng dụng có kết quả đáng tin cậy hơn.
Chẩn đoán thành phần thất bại trước khi chạy lại điều hướng, kiểm tra tài khoản, và giải cùng nhau.
Lỗi biên dịch chỉ tới code và tính tương thích phụ thuộc. Lỗi khởi chạy trình duyệt chỉ tới file thực thi hoặc môi trường runtime. Khóa thiếu chỉ tới bước kiểm tra trang. Lỗi dịch vụ chỉ tới phản hồi API đã tài liệu hóa. Form bị từ chối sau khi có lời giải chỉ tới bước áp dụng kết quả và bản thân ứng dụng.
Với các lỗi hợp đồng đầu vào, hướng dẫn xử lý invalid-task-data cho thấy cách so sánh yêu cầu thực tế với task đã chọn. Nhiều lần retry trình duyệt hơn sẽ không sửa một trường bị sai chính tả trong yêu cầu đó.
Giữ lại một bản ghi chẩn đoán nhỏ chứa phiên bản package, giai đoạn thất bại, mã định danh task nếu có, và thông tin lỗi đã được làm mờ. Đừng log khóa tài khoản thật hay token lời giải đầy đủ. Khi cần escalte, hãy mô tả những gì bài kiểm tra trình duyệt và bài kiểm tra API đã thiết lập riêng rẽ.
Giữ chromedp chịu trách nhiệm trình duyệt và đặt lời gọi solver đã tài liệu hóa tại chính bước CAPTCHA. CapSolver cung cấp giao diện giải; ứng dụng của bạn sở hữu trạng thái trang, quyết định lỗi, và bước kiểm tra hoàn tất cuối cùng.
H: chromedp có bao gồm tính năng giải CAPTCHA không?
chromedp là bộ điều khiển trình duyệt. Workflow này thêm một dịch vụ solver riêng cho các thử thách được hỗ trợ gặp phải trong những tác vụ được cho phép.
H: Ví dụ này có tốn credit solver không?
Không có task tốn phí nào được tạo. Ví dụ gửi một yêu cầu balance với khóa placeholder cố ý không hợp lệ và kiểm tra lỗi nhận được.
H: Tại sao API có thể từ chối yêu cầu khi lỗi Go là nil?
SDK có thể đã nhận và parse thành công một phản hồi chứa lỗi ở mức dịch vụ. Hãy kiểm tra cả các trường lỗi trong phản hồi lẫn lỗi Go.
H: Tôi có thể dùng FIXTURE_ONLY làm sitekey của mình không?
Không. Nó là dữ liệu test cục bộ dùng để kiểm tra việc đọc thuộc tính trong trình duyệt. Một tác vụ giải thật cần public key hiện tại từ trang được cho phép.
H: Ở đây đã kiểm thử một lần giải CAPTCHA tốn phí hoàn chỉnh chưa?
Chưa. Phạm vi đã xác minh là fixture chromedp trong trình duyệt và một lần bị API từ chối thực tế. Việc giải tốn phí và được ứng dụng thuộc sở hữu chấp nhận cần tài khoản của bạn và một bài test end-to-end riêng.

Anh Tuan
Data Science Expert
Turning task outcomes into actionable insights.
GIỚI THIỆU TÁC GIẢ
Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Tự động hóa việc giải CAPTCHA với Nanobot và CapSolver. Sử dụng Playwright để giải reCAPTCHA và Cloudflare tự động.
