# 脚本示例

# 使用前提

  • 通过调用本地接口/browser/open打开浏览器,获取返回参数,然后使用返回参数中的ws字段,连接浏览器,进行自动化操作。
  • ws字段示例:"ws://127.0.0.1:59192/devtools/browser/d25b3f5d-21a4-49d2-9eb8-582c67dc4e4d"
  • 具体端口、appId、appSecret参数替换成实际参数,该脚本示例仅供学习参考,请以实际运行结果为准
  • 预使浏览器使用无头模式,可以在账号环境startupParameter参数添加以下参数
  • --headless --remote-debugging-port=0 --remote-debugging-address=127.0.0.1

# 1.Python

# selenium

import requests
import hashlib
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# MD5加密函数
def md5_encrypt(data):
    md5 = hashlib.md5()
    md5.update(data.encode('utf-8'))
    return md5.hexdigest()

# 双重MD5加密函数
def double_md5_encrypt(data):
    return md5_encrypt(md5_encrypt(data))

# 假设appId和appSecret是已知的常量
appId = 'your_app_id'
appSecret = 'your_app_secret'

# 进行双重MD5加密
signature = double_md5_encrypt(appId + appSecret)

# 准备POST请求的JSON数据
data = {
    'id': 'xxx',  # 替换为实际的id值
    'signature': signature
}

# 调用本地接口获取ws字段,使用POST请求并发送JSON数据
response = requests.post('http://127.0.0.1:55554/browser/open', json=data)
response_data = response.json()
ws_url = response_data['ws']  # 假设返回的JSON中包含ws字段

# 从ws字段中提取端口号
import urllib.parse
parsed_url = urllib.parse.urlparse(ws_url)
port = parsed_url.port

# 配置Selenium WebDriver选项
chrome_options = Options()
chrome_options.add_argument('--remote-debugging-port={}'.format(port))
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:{}".format(port))

# 初始化WebDriver
driver = webdriver.Chrome(options=chrome_options)

# 打开百度
driver.get('https://www.baidu.com')

# ... 在这里添加你的自动化操作 ...

# 关闭浏览器
# driver.quit()

# playwright

import requests
import hashlib
from playwright.sync_api import sync_playwright

# MD5加密函数和双重MD5加密函数保持不变...

# 假设appId和appSecret是已知的常量
appId = 'your_app_id'
appSecret = 'your_app_secret'

# 进行双重MD5加密
signature = double_md5_encrypt(appId + appSecret)

# 准备POST请求的JSON数据
data = {
    'id': 'xxx',  # 替换为实际的id值
    'signature': signature
}

# 调用本地接口获取ws字段,使用POST请求并发送JSON数据
response = requests.post('http://127.0.0.1:55554/browser/open', json=data)
response_data = response.json()
ws_url = response_data['ws']  # 假设返回的JSON中包含ws字段

# 从ws_url中提取端口号(如果需要)

# 使用Playwright连接到已存在的浏览器实例
with sync_playwright() as p:
    # 连接到已存在的浏览器实例
    browser = p.chromium.connect(ws_url)  # 使用ws_url连接
    page = browser.new_page()  # 创建一个新的页面
    page.goto('https://www.baidu.com')  # 打开百度

    # ... 在这里添加你的自动化操作 ...

    # 关闭浏览器
    browser.close()  # 关闭浏览器实例

# pyppeteer

import requests
import hashlib
import asyncio
from pyppeteer import launch

# MD5加密函数
def md5_encrypt(data):
    md5 = hashlib.md5()
    md5.update(data.encode('utf-8'))
    return md5.hexdigest()

# 双重MD5加密函数
def double_md5_encrypt(data):
    return md5_encrypt(md5_encrypt(data))

# 假设appId和appSecret是已知的常量
appId = 'your_app_id'
appSecret = 'your_app_secret'

# 进行双重MD5加密
signature = double_md5_encrypt(appId + appSecret)

# 准备POST请求的JSON数据
data = {
    'id': 'xxx',  # 替换为实际的id值
    'signature': signature
}

# 调用本地接口获取ws字段,使用POST请求并发送JSON数据
response = requests.post('http://127.0.0.1:55554/browser/open', json=data)
response_data = response.json()
ws_url = response_data['ws']  # 假设返回的JSON中包含ws字段


async def main():
     # 连接到已运行的浏览器实例
    browser = await connect({'browserWSEndpoint': ws_url})
    
    # 创建一个新的页面
    page = await browser.newPage()
    
    # 打开百度
    await page.goto('https://www.baidu.com')

    # ... 在这里添加你的自动化操作 ...

    # 关闭浏览器
    await browser.close()

# Python 3.7+ 可以直接运行 asyncio.run(main())
# 对于更早的Python版本,你需要创建一个事件循环来运行main()函数
asyncio.get_event_loop().run_until_complete(main())

# 2.Java

# selenium

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SeleniumExample {

    // MD5加密函数
    public static String md5Encrypt(String data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    // 双重MD5加密函数
    public static String doubleMd5Encrypt(String data) throws NoSuchAlgorithmException {
        return md5Encrypt(md5Encrypt(data));
    }

    public static void main(String[] args) throws Exception {
        // 假设appId和appSecret是已知的常量
        String appId = "your_app_id";
        String appSecret = "your_app_secret";

        // 进行双重MD5加密
        String signature = doubleMd5Encrypt(appId + appSecret);

        // 准备POST请求的JSON数据
        JSONObject json = new JSONObject();
        json.put("id", "xxx"); // 替换为实际的id值
        json.put("signature", signature);

        // 调用本地接口获取ws字段,使用POST请求并发送JSON数据
        URL url = new URL("http://127.0.0.1:55554/browser/open");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "application/json; utf-8");
        con.setRequestProperty("Accept", "application/json");
        con.setDoOutput(true);
        con.getOutputStream().write(json.toString().getBytes(StandardCharsets.UTF_8));

        // 读取响应
        BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8));
        StringBuilder response = new StringBuilder();
        String responseLine;
        while ((responseLine = br.readLine()) != null) {
            response.append(responseLine.trim());
        }
        JSONObject responseData = new JSONObject(response.toString());
        String wsUrl = responseData.getString("ws"); // 假设返回的JSON中包含ws字段

        // 从ws字段中提取端口号
        String port = wsUrl.split(":")[4]; // 假设ws_url格式为ws://127.0.0.1:端口号/...

        // 配置Selenium WebDriver选项
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setExperimentalOption("debuggerAddress", "127.0.0.1:" + port);

        // 初始化WebDriver
        WebDriver driver = new ChromeDriver(chromeOptions);

        // 打开百度
        driver.get("https://www.baidu.com");

        // ... 在这里添加你的自动化操作 ...

        // 关闭浏览器
        // driver.quit();
    }
}

# playwright

import com.microsoft.playwright.*;
import org.json.JSONObject;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class PlaywrightExample {

    // MD5加密函数
    public static String md5Encrypt(String data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    // 双重MD5加密函数
    public static String doubleMd5Encrypt(String data) throws NoSuchAlgorithmException {
        return md5Encrypt(md5Encrypt(data));
    }

    public static void main(String[] args) throws Exception {
        // 假设appId和appSecret是已知的常量
        String appId = "your_app_id";
        String appSecret = "your_app_secret";

        // 进行双重MD5加密
        String signature = doubleMd5Encrypt(appId + appSecret);

        // 准备POST请求的JSON数据
        JSONObject json = new JSONObject();
        json.put("id", "xxx"); // 替换为实际的id值
        json.put("signature", signature);

        // 调用本地接口获取ws字段,使用POST请求并发送JSON数据
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI("http://127.0.0.1:55554/browser/open"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(json.toString()))
                .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        JSONObject responseData = new JSONObject(response.body());
        String wsUrl = responseData.getString("ws"); // 假设返回的JSON中包含ws字段

        // 使用 Playwright 连接到已运行的浏览器实例
        try (Playwright playwright = Playwright.create()) {
            Browser browser = playwright.chromium().connect(wsUrl);
            Page page = browser.newPage(); // 创建一个新的页面

            // 打开百度
            page.navigate("https://www.baidu.com");

            // 关闭浏览器
            browser.close();
        }
    }
}

# 3.node

# puppeteer

const puppeteer = require('puppeteer');
const axios = require('axios'); // 使用axios代替requests库
const crypto = require("crypto-js");

// MD5加密函数
function md5Encrypt(data) {
    return crypto.MD5(data).toString()
}

// 双重MD5加密函数
function doubleMd5Encrypt(data) {
    return md5Encrypt(md5Encrypt(data));
}

(async () => {
    // 假设appId和appSecret是已知的常量
    const appId = 'your_app_id';
    const appSecret = 'your_app_secret';

    // 进行双重MD5加密
    const signature = doubleMd5Encrypt(appId + appSecret);

    // 准备POST请求的JSON数据
    const data = {
        id: 'xxx', // 替换为实际的id值
        signature: signature
    };

    // 调用本地接口获取ws字段,使用POST请求并发送JSON数据
    const response = await axios.post('http://127.0.0.1:55554/browser/open', data);
    const wsUrl = response.data.ws; // 假设返回的JSON中包含ws字段

    const browser = await puppeteer.connect({
      browserWSEndpoint: wsUrl,
      defaultViewport: null
    })
    // 具体业务代码

    const page = await browser.newPage()
    await page.goto('https://www.baidu.com')

    // 关闭浏览器
    // await browser.close();
})();

# selenium

const { Builder, By, Key, until } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const axios = require('axios');
const crypto = require("crypto-js");

// MD5加密函数
function md5Encrypt(data) {
    return crypto.MD5(data).toString()
}

// 双重MD5加密函数
function doubleMd5Encrypt(data) {
    return md5Encrypt(md5Encrypt(data));
}

(async function example() {
    // 假设appId和appSecret是已知的常量
    const appId = 'your_app_id';
    const appSecret = 'your_app_secret';

    // 进行双重MD5加密
    const signature = doubleMd5Encrypt(appId + appSecret);

    // 准备POST请求的JSON数据
    const data = {
        id: 'xxx', // 替换为实际的id值
        signature: signature
    };

    // 调用本地接口获取ws字段,使用POST请求并发送JSON数据
    const response = await axios.post('http://127.0.0.1:55554/browser/open', data);
    const wsUrl = response.data.ws; // 假设返回的JSON中包含ws字段

    // 配置 Chrome 选项
    let options = new chrome.Options();
    options.addArguments('--start-maximized'); // 最大化浏览器窗口
    // 创建 WebDriver 实例,连接到远程浏览器
    let driver = await new Builder()
        .forBrowser('chrome')
        .setChromeOptions(options)
        .usingServer(wsUrl) // 使用 WebSocket URL 连接到远程浏览器
        .build();

    try {
        // 打开百度
        await driver.get('https://www.baidu.com');

        // ... 在这里添加你的自动化操作 ...

    } finally {
        // 关闭浏览器
        // await driver.quit();
    }
})();