ทำงานอัตโนมัติกับโปรไฟล์เบราว์เซอร์ด้วย Local API

เริ่มโปรไฟล์จากสคริปต์ รับเอนด์พอยต์สำหรับดีบักกลับมา แล้วเชื่อม Playwright หรือ Puppeteer เข้ากับเบราว์เซอร์ที่มีตัวตนและพร็อกซีติดมาแล้ว
การทำงานอัตโนมัติกับเบราว์เซอร์ antidetect มักถูกนำเสนอว่าเป็นปัญหายาก แต่ไม่ใช่ ตราบใดที่เครื่องมือยื่นสิ่งเดียวที่ไลบรารีอัตโนมัติของคุณรู้จักใช้อยู่แล้วให้ คือเอนด์พอยต์สำหรับดีบัก
ภาพรวม
PowerOps รัน HTTP API ที่ผูกกับที่อยู่ loopback สคริปต์ของคุณขอให้มันเริ่มโปรไฟล์ มันเปิดเบราว์เซอร์พร้อมตัวตน พื้นที่จัดเก็บ และพร็อกซีของโปรไฟล์นั้นที่ติดมาแล้ว และคืนเอนด์พอยต์ WebSocket ของเบราว์เซอร์ที่กำลังทำงาน สคริปต์ของคุณเชื่อมต่อกับเอนด์พอยต์นั้นด้วย Playwright, Puppeteer หรืออะไรก็ตามที่พูดโปรโตคอล DevTools ได้
ไลบรารีอัตโนมัติไม่ต้องรู้เลยว่าลายนิ้วมือคืออะไร เมื่อมันเชื่อมต่อ สภาพแวดล้อมก็พร้อมแล้ว
การเริ่มโปรไฟล์
curl -s -H "Authorization: Bearer $POWEROPS_API_KEY" \
http://127.0.0.1:50326/status
ทุกเส้นทางยกเว้นการตรวจสถานะต้องใช้คีย์ bearer การเริ่มเบราว์เซอร์จะคืนเอนด์พอยต์ที่ใช้เชื่อมต่อ
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
การเชื่อมไลบรารีของคุณ
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");
บรรทัดสำคัญคือคอมเมนต์ ในสคริปต์ของคุณไม่มีการตั้งค่าลายนิ้วมือเลย เพราะการตั้งค่าสภาพแวดล้อมไม่ใช่หน้าที่ของสคริปต์ มันเป็นของโปรไฟล์ และคงเดิมไม่ว่าโปรไฟล์จะถูกเปิดโดยคนคลิกแถว หรือโดยงานตามกำหนดเวลาตอนตีสาม
API ครอบคลุมอะไรบ้าง
- เส้นทางสถานะคือการตรวจสุขภาพ และเป็นเส้นทางเดียวที่ไม่ต้องใช้คีย์
- เส้นทางเบราว์เซอร์เริ่ม หยุด และสอบถามเบราว์เซอร์ที่กำลังทำงานอยู่
- เส้นทางโปรไฟล์สร้าง อัปเดต สอบถาม และลบโปรไฟล์
- เส้นทางพร็อกซีจัดการคลังพร็อกซีและกำหนดเส้นทาง
- เส้นทางกลุ่มจัดระเบียบโปรไฟล์เป็นชุด
- เส้นทางส่วนขยายนำเข้าและกำหนดส่วนขยาย
วิธีรักษาให้อยู่ในเครื่อง
API ที่ควบคุมเบราว์เซอร์ซึ่งถือบัญชีที่ล็อกอินไว้ควรพูดถึงขอบเขตของมันสักหน่อย
- มันผูกกับ 127.0.0.1 ไม่มีการตั้งค่าใดที่ทำให้มันรับฟังบนอินเทอร์เฟซอื่น
- ต้องใช้คีย์ bearer ในทุกเส้นทางยกเว้นการตรวจสถานะ
- มันตรวจสอบ Host header และไม่ส่ง CORS headers ดังนั้นหน้าเว็บที่เปิดอยู่ในเบราว์เซอร์ประจำวันของคุณจึงเข้าถึงมันไม่ได้
- ความลับเป็นแบบเขียนอย่างเดียว คือรหัสผ่านโปรไฟล์ ความลับการยืนยันตัวตนสองขั้นตอน และรหัสผ่านพร็อกซีจะไม่ถูกคืนจากเส้นทางสอบถามเลย
รูปแบบที่ควรคัดลอก
สอบถามโปรไฟล์ในกลุ่ม เริ่มทีละตัว ทำงาน แล้วหยุด รันทีละไม่กี่ตัวแทนที่จะรันพร้อมกันทั้งหมด ข้อจำกัดคือหน่วยความจำของเครื่องคุณเอง เพราะแต่ละโปรไฟล์คือกระบวนการเบราว์เซอร์จริง
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 });
}
}));
}
การหยุดโปรไฟล์ใน `finally` สำคัญกว่าที่เห็น เพราะการปิดอย่างเรียบร้อยคือสิ่งที่เขียนสถานะเบราว์เซอร์ออก และโปรไฟล์ที่ถูกฆ่ากลางเซสชันอาจเสียเซสชันที่เพิ่งสร้างขึ้น
