Tự động hóa hồ sơ trình duyệt bằng API cục bộ

Khởi động một hồ sơ từ script, nhận về một điểm cuối gỡ lỗi, và gắn Playwright hoặc Puppeteer vào một trình duyệt đã có sẵn danh tính và proxy.
Tự động hóa một trình duyệt antidetect thường được trình bày như một bài toán khó. Thực ra không phải vậy, miễn là công cụ đưa cho bạn đúng thứ mà thư viện tự động hóa của bạn đã biết cách dùng: một điểm cuối gỡ lỗi.
Hình dạng của nó
PowerOps chạy một API HTTP gắn với địa chỉ loopback. Script của bạn yêu cầu nó khởi động một hồ sơ; nó chạy trình duyệt với danh tính, lưu trữ và proxy của hồ sơ đó đã được gắn sẵn, rồi trả về điểm cuối WebSocket của trình duyệt đang chạy. Script của bạn kết nối tới điểm cuối đó bằng Playwright, Puppeteer hoặc bất cứ thứ gì nói được giao thức DevTools.
Thư viện tự động hóa không bao giờ cần biết vân tay trình duyệt là gì. Đến lúc nó kết nối, môi trường đã được thiết lập sẵn.
Khởi động một hồ sơ
curl -s -H "Authorization: Bearer $POWEROPS_API_KEY" \
http://127.0.0.1:50326/status
Mọi route trừ việc kiểm tra trạng thái đều yêu cầu khóa bearer. Khởi động một trình duyệt sẽ trả về điểm cuối để gắn vào:
curl -s -X POST \
-H "Authorization: Bearer $POWEROPS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"profileId": "..."}' \
http://127.0.0.1:50326/browser/start
Gắn thư viện của bạn
import { chromium } from "playwright";
const res = await fetch("http://127.0.0.1:50326/browser/start", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.POWEROPS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ profileId }),
});
const { ws } = await res.json();
// The profile's identity, storage and proxy are already in place.
const browser = await chromium.connectOverCDP(ws);
const [context] = browser.contexts();
const page = context.pages()[0] ?? await context.newPage();
await page.goto("https://example.com");
Dòng quan trọng là dòng chú thích. Trong script của bạn không có cấu hình vân tay trình duyệt nào, vì việc cấu hình môi trường không phải việc của script. Nó thuộc về hồ sơ, và nó giữ nguyên dù hồ sơ được mở bởi một người nhấp vào một hàng hay bởi một tác vụ theo lịch lúc ba giờ sáng.
API bao gồm những gì
- Route trạng thái là một lần kiểm tra tình trạng hoạt động, và là route duy nhất không cần khóa.
- Các route trình duyệt khởi động, dừng và truy vấn các trình duyệt đang chạy.
- Các route hồ sơ tạo, cập nhật, truy vấn và xóa hồ sơ.
- Các route proxy quản lý thư viện proxy và gán tuyến đường.
- Các route nhóm sắp xếp hồ sơ hàng loạt.
- Các route tiện ích mở rộng nhập và gán tiện ích mở rộng.
Cách giữ nó ở phạm vi cục bộ
Một API điều khiển các trình duyệt đang giữ tài khoản đã đăng nhập xứng đáng được nói rõ về ranh giới của nó.
- Nó gắn với 127.0.0.1. Không có cài đặt nào khiến nó lắng nghe trên giao diện khác.
- Cần khóa bearer trên mọi route trừ việc kiểm tra trạng thái.
- Nó xác thực header Host và không gửi header CORS, nên một trang web mở trong trình duyệt hằng ngày của bạn không thể truy cập nó.
- Bí mật là chỉ ghi: mật khẩu hồ sơ, bí mật xác thực hai yếu tố và mật khẩu proxy không bao giờ được trả về bởi route truy vấn.
Một mẫu đáng sao chép
Truy vấn các hồ sơ trong một nhóm, khởi động từng hồ sơ, làm việc, rồi dừng nó. Chạy chúng vài cái một lần thay vì tất cả cùng lúc. Ràng buộc là bộ nhớ trên máy của chính bạn, vì mỗi hồ sơ là một tiến trình trình duyệt thực.
const { profiles } = await api("/profiles?groupId=" + groupId);
for (const batch of chunk(profiles, 5)) {
await Promise.all(batch.map(async (profile) => {
const { ws } = await api("/browser/start", { profileId: profile.id });
try {
await doTheWork(ws);
} finally {
await api("/browser/stop", { profileId: profile.id });
}
}));
}
Dừng hồ sơ trong `finally` quan trọng hơn vẻ ngoài của nó: đóng một cách sạch sẽ là điều ghi trạng thái trình duyệt ra, và một hồ sơ bị ngắt đột ngột giữa phiên có thể mất phiên vừa thiết lập.
