Bắt đầu nhanh: Kiểm soát môi trường Mbbrowser
Chương này cung cấp các script hoàn chỉnh, có thể chạy được cho ba ngôn ngữ. Hãy chọn ngôn ngữ bạn quen thuộc nhất. Logic cốt lõi là giống hệt nhau: yêu cầu địa chỉ ws từ ApiServer, sau đó sử dụng connectOverCDP để kiểm soát Mbbrowser.
Cách 1: Phiên bản JavaScript / Node.js
Tạo một tệp có tên start.js:
const { chromium } = require('playwright');
const axios = require('axios');
// ============================
// Cấu hình (Điền thông tin thực tế của bạn)
// ============================
const API_URL = 'http://127.0.0.1:8186';
const SESSION_ID = 'thay_the_bang_session_id_cua_ban'; // Nhấp chuột phải vào môi trường Mbbrowser → Sao chép ID môi trường
async function main() {
// ── Bước 1: Yêu cầu ApiServer mở một môi trường cụ thể ────────
console.log('⏳ Đang mở môi trường Mbbrowser...');
let wsEndpoint;
try {
const response = await axios.post(`${API_URL}/api/v1/browser/start`, {
Session_ID: SESSION_ID
});
if (response.data.code !== 0) {
console.error('❌ Khởi động môi trường thất bại:', response.data.message);
return;
}
// ── Bước 2: Trích xuất địa chỉ WebSocket (Trường dành riêng cho Playwright) ──
wsEndpoint = response.data.data.ws;
console.log('✅ Đã mở môi trường. Địa chỉ ws:', wsEndpoint);
} catch (err) {
console.error('❌ Không thể kết nối với ApiServer. Đảm bảo nó đang chạy!', err.message);
return;
}
// ── Bước 3: Sử dụng connectOverCDP để kiểm soát ─────────────────
const browser = await chromium.connectOverCDP(wsEndpoint);
console.log('🎉 Tiếp quản Playwright thành công!');
try {
// ── Bước 4: Lấy Context và Trang hiện tại ────────────────────
// Môi trường Mbbrowser có một context mặc định; hãy sử dụng cái đầu tiên.
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();
// ── Bước 5: Thực hiện các thao tác nghiệp vụ ─────────────────────
await page.goto('https://www.mbbrowser.com', { waitUntil: 'domcontentloaded' });
console.log('📄 Tiêu đề trang hiện tại:', await page.title());
// Đợi 3 giây để quan sát
await page.waitForTimeout(3000);
console.log('✅ Hoàn thành thực thi script!');
} finally {
// Ngắt kết nối Playwright (Cửa sổ Mbbrowser sẽ tiếp tục chạy)
await browser.close();
}
}
main().catch(console.error);Chạy:
node start.jsCách 2: Phiên bản Python
Tạo một tệp có tên start_playwright.py:
import requests
from playwright.sync_api import sync_playwright
# ============================
# Cấu hình
# ============================
API_URL = "http://127.0.0.1:8186"
SESSION_ID = "thay_the_bang_session_id_cua_ban"
def get_ws_endpoint(session_id: str) -> str or None:
"""Gọi Mbbrowser ApiServer để khởi động môi trường và trả về địa chỉ ws"""
print("⏳ Đang mở môi trường Mbbrowser...")
try:
resp = requests.post(
f"{API_URL}/api/v1/browser/start",
json={"Session_ID": session_id},
timeout=30
)
data = resp.json()
except requests.exceptions.ConnectionError:
print("❌ Không thể kết nối với ApiServer! Đảm bảo apiserver.exe đang chạy.")
return None
if data.get("code") != 0:
print(f"❌ Khởi động môi trường thất bại: {data.get('message')}")
return None
ws = data["data"]["ws"]
print(f"✅ Đã mở môi trường. Địa chỉ ws: {ws}")
return ws
def main():
ws_endpoint = get_ws_endpoint(SESSION_ID)
if not ws_endpoint:
return
with sync_playwright() as p:
# ── connect_over_cdp để kiểm soát ─────────────────
browser = p.chromium.connect_over_cdp(ws_endpoint)
print("🎉 Tiếp quản Playwright thành công!")
# Lấy BrowserContext mặc định hiện có (giữ lại tất cả Cookies, Storage, v.v.)
context = browser.contexts[0]
# Lấy trang đầu tiên; tạo mới nếu chưa có
page = context.pages[0] if context.pages else context.new_page()
# ── Thực hiện các thao tác nghiệp vụ ──────────────────────────────
page.goto("https://www.mbbrowser.com", wait_until="domcontentloaded")
print(f"📄 Tiêu đề trang hiện tại: {page.title()}")
page.wait_for_timeout(3000)
print("✅ Hoàn thành thực thi script!")
browser.close()
if __name__ == "__main__":
main()Chạy:
python start_playwright.pyCách 3: Phiên bản Java
NOTE
Đối với phiên bản Java, chúng tôi khuyên bạn nên sử dụng Trình quản lý script tự động hóa của Mbbrowser Client, trình quản lý này sẽ tự động xử lý các gói Playwright JAR và trích xuất driver. Mã sau đây có thể sử dụng trực tiếp trong trình soạn thảo script.
import com.microsoft.playwright.*;
import java.net.URI;
import java.net.http.*;
import org.json.*;
public class MBPlaywright {
static final String API_URL = "http://127.0.0.1:8186";
static final String SESSION_ID = "thay_the_bang_session_id_cua_ban";
public static void main(String[] args) throws Exception {
// ── Bước 1: Gọi ApiServer để khởi động môi trường ──────────────
System.out.println("⏳ Đang mở môi trường Mbbrowser...");
HttpClient httpClient = HttpClient.newHttpClient();
String body = "{\"Session_ID\":\"" + SESSION_ID + "\"}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(API_URL + "/api/v1/browser/start"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = httpClient.send(
request, HttpResponse.BodyHandlers.ofString()
);
JSONObject data = new JSONObject(response.body());
String wsEndpoint = data.getJSONObject("data").getString("ws");
System.out.println("✅ Đã mở môi trường. ws: " + wsEndpoint);
// ── Bước 2: Tiếp quản Playwright connectOverCDP ───────────────
// Thiết lập để bỏ qua việc tải xuống trình duyệt tích hợp sẵn
System.setProperty("playwright.skip.browser.download", "1");
try (Playwright playwright = Playwright.create()) {
Browser browser = playwright.chromium().connectOverCDP(wsEndpoint);
System.out.println("🎉 Tiếp quản Playwright thành công!");
BrowserContext context = browser.contexts().get(0);
Page page = context.pages().isEmpty()
? context.newPage()
: context.pages().get(0);
page.navigate("https://www.mbbrowser.com");
System.out.println("📄 Tiêu đề trang hiện tại: " + page.title());
Thread.sleep(3000);
System.out.println("✅ Hoàn thành thực thi script!");
browser.close();
}
}
}Phân Tích Từng Dòng
connectOverCDP so với launch: Sự khác biệt quan trọng
// ❌ Cách làm Playwright tiêu chuẩn: Tạo một cửa sổ Chrome mới, trống rỗng
const browser = await chromium.launch();
// ✅ Cách làm Mbbrowser Playwright: Kiểm soát một môi trường vân tay hiện có
const browser = await chromium.connectOverCDP(wsEndpoint);| So sánh | launch() tiêu chuẩn | connectOverCDP() của Mbbrowser |
|---|---|---|
| Trạng thái trình duyệt | Mới tinh, trống rỗng | Đầy đủ vân tay, proxy và Cookies có sẵn |
| Hệ quả | Trang web mục tiêu thấy một bot Chrome trần trụi | Trang web mục tiêu thấy một "người dùng thực" |
| Đa tài khoản | Không thể phân biệt | Được khớp chính xác thông qua Session_ID |
Tại sao sử dụng data.ws thay vì data.http?
| Trường | Ví dụ định dạng | Framework phù hợp |
|---|---|---|
data.http | 127.0.0.1:9222 | Selenium (debuggerAddress) |
data.ws | ws://127.0.0.1:9222/devtools/browser/xxx | Playwright / Puppeteer ✅ |
connectOverCDP của Playwright yêu cầu địa chỉ ws://... đầy đủ.
browser.contexts()[0]: Đừng tạo Context mới
// ❌ SAI: Tạo một context mới; Cookies và bộ nhớ trong Mbbrowser sẽ bị mất.
const context = await browser.newContext();
// ✅ ĐÚNG: Sử dụng context hiện có của Mbbrowser (giữ nguyên trạng thái tài khoản).
const context = browser.contexts()[0];Xử Lý Sự Cố
❓ Lỗi: connect ECONNREFUSED 127.0.0.1:8186
ApiServer chưa được khởi động hoặc cổng bị sai. Đảm bảo apiserver.exe đang chạy trong cửa sổ terminal của nó.
❓ Lỗi: Browser closed hoặc Target page, context or browser has been closed
Môi trường Mbbrowser đã bị đóng (hết thời gian hoặc thủ công). Hãy gọi lại /api/v1/browser/start.
❓ browser.contexts() trả về một mảng trống
Khi một môi trường lần đầu được mở, context mặc định có thể mất một chút thời gian để khởi tạo. Hãy thêm một khoảng thời gian chờ ngắn:
// Đợi context xuất hiện (tối đa 5 giây)
let context;
for (let i = 0; i < 50 && !browser.contexts().length; i++) {
await new Promise(r => setTimeout(r, 100));
}
context = browser.contexts()[0];❓ browser.close() có đóng cửa sổ Mbbrowser không?
Trong chế độ connectOverCDP, browser.close() chỉ ngắt kết nối Playwright—nó không đóng cửa sổ Mbbrowser. Để đóng nó, hãy gọi giao diện dừng:
await axios.post(`${API_URL}/api/v1/browser/stop`, { Session_ID: SESSION_ID });TIP
Sẵn sàng viết code? Chương tiếp theo Tham khảo API cốt lõi sẽ dạy bạn cách sử dụng các API Locator và Page mạnh mẽ của Playwright.
