Skip to content

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:

javascript
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:

bash
node start.js

Cách 2: Phiên bản Python

Tạo một tệp có tên start_playwright.py:

python
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:

bash
python start_playwright.py

Cá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.

java
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

javascript
// ❌ 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ánhlaunch() tiêu chuẩnconnectOverCDP() của Mbbrowser
Trạng thái trình duyệtMớ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ụiTrang web mục tiêu thấy một "người dùng thực"
Đa tài khoảnKhô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ườngVí dụ định dạngFramework phù hợp
data.http127.0.0.1:9222Selenium (debuggerAddress)
data.wsws://127.0.0.1:9222/devtools/browser/xxxPlaywright / Puppeteer

connectOverCDP của Playwright yêu cầu địa chỉ ws://... đầy đủ.

browser.contexts()[0]: Đừng tạo Context mới

javascript
// ❌ 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:

javascript
// Đợ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:

javascript
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.