VMLogin浏览器自动化 Local API,基于Selenium WebDriver

浏览器自动化允许您在VMLogin的浏览器配置文件中自动执行任务。从创建简单的自动化脚本到复杂的Web爬虫,可以搜索、收集Web数据并与之交互。

VMLogin浏览器自动化基于Selenium WebDriver,同时也支持Puppeteer等自动化框架。

通常情况下,如果您运行Selenium代码,首先将连接到Chrome驱动,然后设置您所需要的功能。而将VMLogin与Selenium代码结合使用时,您无需这样操作。您将使用Web Driver程序,通过本地端口连接到VMLogin应用或某浏览器配置文件,设置所需功能,在预定义的浏览器配置文件中执行Selenium命令。

VMLogin Local API中文版说明文档https://m.vmlogin.com/zh-cn/v1/rest-api.html

支持的语言
Selenium框架提供了多种可搭配使用的语言,因此VMLogin自动化也可以在多种编码语言上运行。但是目前,我们仅为Java和Python供技术支持。

在 VMLogin 中使用Selenium
定义VMLogin端口
您需要提前定义软件端口以使用Selenium自动化。以下是定义端口的方法:

在软件《我的帐户》中打开启用浏览器自动化设置,并在监听端口中设置能使用端口,这里默认是35000,另外你也可以设置一个访问密码。

随后,您就可以通过定义的端口连接到VMLogin了。


接口还可以传入代理服务器信息,如果传入代理信息会覆盖配置文件里的代理信息,这种覆盖是临时性的,不会真的修改配置文件,只对自动化接口有效:Markup

http://127.0.0.1:35000/api/v1/profile/start?automation=true&profileId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&proxytype=socks5&proxyserver=ip&proxyport=1080&proxyusername=&proxypassword=

C++

代理类型可能是这三种:
proxytype=socks5
proxytype=socks4
proxytype=http

代理用户名和密码可以不传为空。

Python 案例:

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

mla_profile_id = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
mla_url = 'http://127.0.0.1:35000/api/v1/profile/start?automation=true&profileId='+mla_profile_id

resp = requests.get(mla_url)
json = resp.json()
print(json['value'])

chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", json['value'][7:])
chrome_driver = r"chromedriver.exe" 
#http://chromedriver.storage.googleapis.com/79.0.3945.36/chromedriver_win32.zip
#下载 chromedriver 文件放到python目录
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)

driver.get('https://www.bing.com/')
executor_url = driver.command_executor._url
session_id = driver.session_id
print(executor_url)
print(session_id)
print('ok it is done')

driver.quit()

注意一下VMLogin 浏览器内核版本,如果是79,就下载Python

http://chromedriver.storage.googleapis.com/79.0.3945.36/chromedriver_win32.zip

如果是86,就下载Python

http://chromedriver.storage.googleapis.com/86.0.4240.22/chromedriver_win32.zip

chromedriver 版本不对应,会造成自动化失败。

如果不能关闭浏览器,可以使用  http://127.0.0.1:35000/api/v1/profile/stop?profileId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  接口来关闭指定配置的浏览器进程。

如果你运行代码只能打开浏览器,并没有打开网站,那可能要把chromedriver.exe复制到你的 python 安装目录里了,还有一种可能是你选了移动仿真模式。

JAVA 案例:

package com.ruoyi.common.spider.reptile;

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

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author vmlogin
 *         <dependency>
 *             <groupId>org.seleniumhq.selenium</groupId>
 *             <artifactId>selenium-java</artifactId>
 *             <version>3.141.59</version>
 *         </dependency>
 */
public class ProductChrome {

    public static void main(String[] args) throws Exception {

        ProductChrome pc = new ProductChrome();
        String profileId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
        //根据profileId打开并获取远程调试地址
        URL url = new URL(pc.startProfile(profileId));

        //使用远程调试地址连接到打开的chrome浏览器
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setExperimentalOption("debuggerAddress", url.getAuthority());
        WebDriver driver = new ChromeDriver(chromeOptions);

        //访问vmlogin
        driver.get("https://www.vmlogin.com/");
        System.out.println(driver.getTitle());
        driver.quit();
    }


    private String startProfile(String profileId) throws Exception {

        String url = "http://127.0.0.1:35000/api/v1/profile/start?automation=true&profileId=" + profileId;
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("GET");
        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        JSONObject jsonResponse = new JSONObject(response.toString());
        return jsonResponse.getStr("value");
    }
}

发表评论