Browserprofile mit einer lokalen API automatisieren

Starten Sie ein Profil per Skript, erhalten Sie einen Debugging-Endpunkt und verbinden Sie Playwright oder Puppeteer mit einem Browser, dem Identität und Proxy bereits zugewiesen sind.
Einen Antidetect-Browser zu automatisieren wird meist als schwieriges Problem dargestellt. Das ist es nicht, sofern das Tool Ihnen das eine gibt, was Ihre Automatisierungsbibliothek bereits zu nutzen weiß: einen Debugging-Endpunkt.
Das Grundprinzip
PowerOps betreibt eine HTTP-API, die an die Loopback-Adresse gebunden ist. Ihr Skript bittet sie, ein Profil zu starten; sie startet den Browser mit Identität, Speicher und Proxy des Profils und gibt den WebSocket-Endpunkt des laufenden Browsers zurück. Ihr Skript verbindet sich mit Playwright, Puppeteer oder allem anderen, das das DevTools-Protokoll spricht, mit diesem Endpunkt.
Die Automatisierungsbibliothek muss nie wissen, was ein Fingerprint ist. Wenn sie sich verbindet, steht die Umgebung bereits.
Ein Profil starten
curl -s -H "Authorization: Bearer $POWEROPS_API_KEY" \
http://127.0.0.1:50326/status
Jede Route außer der Statusprüfung erfordert einen Bearer-Schlüssel. Das Starten eines Browsers liefert den Endpunkt, mit dem Sie sich verbinden:
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
Ihre Bibliothek anbinden
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");
Die wichtige Zeile ist der Kommentar. In Ihrem Skript steht keine Fingerprint-Konfiguration, denn die Umgebung zu konfigurieren ist nicht Aufgabe Ihres Skripts. Sie gehört zum Profil und bleibt gleich, egal ob das Profil von einer Person per Klick auf eine Zeile geöffnet wird oder von einem geplanten Job um drei Uhr nachts.
Was die API abdeckt
- Die Status-Route ist eine Integritätsprüfung und die einzige, die keinen Schlüssel braucht.
- Die Browser-Routen starten und stoppen die aktuell laufenden Browser und fragen sie ab.
- Die Profil-Routen legen Profile an, aktualisieren, fragen ab und löschen sie.
- Die Proxy-Routen verwalten die Proxy-Bibliothek und weisen Routen zu.
- Die Gruppen-Routen ordnen Profile in großen Mengen.
- Die Erweiterungs-Routen importieren und weisen Erweiterungen zu.
Wie sie lokal bleibt
Eine API, die Browser mit angemeldeten Accounts steuert, verdient ein Wort zu ihren Grenzen.
- Sie bindet an 127.0.0.1. Keine Einstellung lässt sie auf einer anderen Schnittstelle lauschen.
- Auf jeder Route außer der Statusprüfung ist ein Bearer-Schlüssel erforderlich.
- Sie validiert den Host-Header und sendet keine CORS-Header, sodass eine Webseite, die in Ihrem Alltagsbrowser offen ist, sie nicht erreichen kann.
- Geheimnisse sind nur schreibbar: Profilpasswörter, Zwei-Faktor-Geheimnisse und Proxy-Passwörter werden von keiner Abfrage-Route je zurückgegeben.
Ein Muster zum Übernehmen
Fragen Sie die Profile einer Gruppe ab, starten Sie jedes, erledigen Sie die Arbeit, stoppen Sie es. Führen Sie sie ein paar auf einmal aus statt alle gleichzeitig. Die Einschränkung ist der Arbeitsspeicher Ihres eigenen Rechners, denn jedes Profil ist ein echter Browserprozess.
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 });
}
}));
}
Das Stoppen des Profils in einem `finally` ist wichtiger, als es aussieht: Sauberes Schließen schreibt den Browserzustand zurück, und ein mitten in der Sitzung beendetes Profil kann die gerade aufgebaute Sitzung verlieren.
