Octo浏览器中的自动化:大幅削减时间成本
2025/4/10


Artur Hvalei
Technical Support Specialist, Octo Browser
在防检测浏览器中处理大量个人资料需要大量的努力、时间和资源——即使是最周到的用户体验也是如此。您管理的个人资料越多,您工作时间内所需重复的操作就越多。然而,许多这些过程可以自动化,为您节省大量时间。
使用我们 API 的客户表示,它是同行中最好的之一。点击、跟随链接、添加数据——任何标准操作都可以显著加快。在本文中,我们将向您展示如何做到这一点。
在防检测浏览器中处理大量个人资料需要大量的努力、时间和资源——即使是最周到的用户体验也是如此。您管理的个人资料越多,您工作时间内所需重复的操作就越多。然而,许多这些过程可以自动化,为您节省大量时间。
使用我们 API 的客户表示,它是同行中最好的之一。点击、跟随链接、添加数据——任何标准操作都可以显著加快。在本文中,我们将向您展示如何做到这一点。
内容
浏览器自动化最需要在哪里?
手动执行重复性的操作消耗了本可以用于更重要任务的时间。除了节省你的时间和专注,自动化还有助于防止错误。重复执行相同的操作几百次几乎使错误不可避免,例如,设置错误的标签或在未分配正确代理的情况下启动配置文件。与人类不同,算法不会犯这样的错误。使用经过良好测试的脚本,你可以确信一切都被正确执行。
除了处理一般任务,自动化在以下领域尤其有用:
- 账户养成:快速在所需地理位置创建账户并自动进行准备。导出所有配置文件在导出列表中。 
- 网页抓取:调整每个 IP 的请求频率至安全水平,轮换代理,并在发生阻塞时修改指纹。 
- 电子商务:开发脚本以自动化劳动密集型任务并安全解析竞争对手数据。 
- 博彩和奖金猎取:简化带有所需地理位置和指纹参数的配置文件创建。跨账户自动化大规模操作以绕过博彩限制。 
开始使用 API
我们分析了用户的 API 调用,发现许多团队正在积极实施脚本来管理配置文件,从而改变多账户管理的常见方法。许多主要联盟营销团队的领导者强调,我们的 API 的便利性是 Octo 相对于竞争对手的关键优势之一。
我们当前的 API 允许你使用所需的数字指纹创建配置文件,添加代理,分配标签,以及使用任何浏览器自动化框架启动和停止自动场景。你也可以在混合模式下处理你的配置文件,充分利用自动化的好处与传统手动控制账户的细微调整相结合。

你可以在你的 Octo 浏览器主账户的附加设置中找到你的 API 令牌
你的 API 令牌
Octo 浏览器从基本订阅及以上版本开始为你提供访问 API 令牌的权限。你的 API 调用限制由你的订阅决定。如果你拥有高级订阅,可以将 API 限制进一步提高至每分钟 1,000 次请求(RPM)和每小时 50,000 次请求(RPH)。如需更高的限制,请联系客户服务。
| 订阅等级 | RPM | RPH | 
|---|---|---|
| 基本 | 50 | 500 | 
| 团队 | 100 | 1500 | 
| 高级 | 200 (+800) | 3000 (+47,000) | 
选择编程语言
编程语言选择的话题过于广泛,无法在这里涵盖所有可能的语言和库组合。在我们的例子中,我们将使用 Node.js + Axios,因为我们对这个堆栈有经验。其他语言,如 C 或 C#,可能更快,但每种语言都有其独特的特性、细节和用例。你可以根据自己的经验选择任何语言。
使用 AI 重写代码
我们自己热爱自动化,总是努力优化我们的工作,因此我们利用 AI 将代码重写为所需的语言。这个过程相当简单:你可以要求ChatGPT使用以下提示为你转换代码:将此脚本从 Node.js 与 Axios 转换为 Python 与 Requests 库。
//modules
const axios = require('axios');
//这里是配置。将你的 Octo API 令牌粘贴到这里,你也可以根据个人需要进行修改
const config = {
    octo_token: "OCTO_API_TOKEN",
    octo_api_base_url: "https://app.octobrowser.net/api/v2/automation/",
    data: {
    extensions: ['aapfglkgnhmiaabhiijkjpfmhllaodgp@4.2.3'],
    bookmarks: [{ "name": "google", "url": "https://google.com" }, { "name": "facebook", "url": "https://facebook.com" }],
    start_pages: ["https://google.com", "https://facebook.com"]
    }
}
const OCTO_REMOTE_API = axios.create({
    baseURL: config.octo_api_base_url,
    timeout: 10000,
    headers: {
        'X-Octo-Api-Token': config.octo_token,
        'Content-Type': "application/json"
    }
});
//functions
async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms * 1000));
}
async function check_limits(response) {
    let rpm = response.headers['x-ratelimit-remaining'];
    let rph = response.headers['x-ratelimit-remaining-hour'];
    if (rpm < 10) {
        console.log("等待一分钟...");
        await sleep(60);
    }
    if (rph < 10) {
        console.log("等待一个小时...");
        await sleep(3600);
    }
}
async function get_total_profiles(){
    const response = await OCTO_REMOTE_API.get('/profiles?page=0&page_len=10');
    const total_profiles = response.data.total_count;
    const total_pages = Math.ceil(response.data.total_count/100);
    console.log(`总配置文件: ${total_profiles}\n总页面: ${total_pages}`);
    await check_limits(response);
    return total_pages;
}
async function get_all_profiles_uuids(total_pages){
    let profiles = [];
    for (let i = 0; i < total_pages; i++) {
    let response = await OCTO_REMOTE_API.get(`/profiles?page=${i}&page_len=100`);
    await check_limits(response);
    profiles.push(...response.data.data);
    }
    return profiles;
}
async function patch_all_profiles(profiles){
    let updated = [];
    let not_updated = [];
    for (let profile of profiles) {
        try{
        const response = await OCTO_REMOTE_API.patch(`/profiles/${profile.uuid}`, config.data);
        await check_limits(response);
        updated.push(profile);
        console.log(`成功更新 ${profile.uuid}`);
        } catch (error) {
            not_updated.push(profile);
            console.error(`错误: 无法补丁配置文件 ${profile.uuid}`);
        }
    }
    return [updated, not_updated];
}
//main process
(async () => {
    const total = await get_total_profiles();
    const profiles = await get_all_profiles_uuids(total);
    const [updated, not_updated] = await patch_all_profiles(profiles);
    console.log(`完成处理:\n更新: ${updated.length}\n未更新: ${not_updated.length}`);
})();

让我们把代码片段输入给 ChatGPT
当然,这里是使用 Requests 库的等效 Python 脚本:
import requests
import math
import time
# 配置
config = {
    "octo_token": "OCTO_API_TOKEN",
    "octo_api_base_url": "https://app.octobrowser.net/api/v2/automation/",
    "data": {
        "extensions": ["aapfglkgnhmiaabhiijkjpfmhllaodgp@4.2.3"],
        "bookmarks": [
            {"name": "google", "url": "https://google.com"},
            {"name": "facebook", "url": "https://facebook.com"}
        ],
        "start_pages": ["https://google.com", "https://facebook.com"]
    }
}
# 会话设置
session = requests.Session()
session.headers.update({
    "X-Octo-Api-Token": config["octo_token"],
    "Content-Type": "application/json"
})
session.timeout = 10
# 辅助函数
def sleep(seconds):
    time.sleep(seconds)
def check_limits(response):
    rpm = int(response.headers.get("x-ratelimit-remaining", 0))
    rph = int(response.headers.get("x-ratelimit-remaining-hour", 0))
    
    if rpm < 10:
        print("等待一分钟...")
        sleep(60)
    if rph < 10:
        print("等待一个小时...")
        sleep(3600)
# API 函数
def get_total_profiles():
    response = session.get(f"{config['octo_api_base_url']}profiles?page=0&page_len=10")
    response.raise_for_status()
    
    total_profiles = response.json()["total_count"]
    total_pages = math.ceil(total_profiles / 100)
    print(f"总配置文件: {total_profiles}\n总页面: {total_pages}")
    
    check_limits(response)
    return total_pages
def get_all_profiles_uuids(total_pages):
    profiles = []
    for i in range(total_pages):
        response = session.get(f"{config['octo_api_base_url']}profiles?page={i}&page_len=100")
        response.raise_for_status()
        
        check_limits(response)
        profiles.extend(response.json()["data"])
    
    return profiles
def patch_all_profiles(profiles):
    updated = []
    not_updated = []
    
    for profile in profiles:
        try:
            response = session.patch(
                f"{config['octo_api_base_url']}profiles/{profile['uuid']}",
                json=config["data"]
            )
            response.raise_for_status()
            
            check_limits(response)
            updated.append(profile)
            print(f"成功更新 {profile['uuid']}")
        except Exception as e:
            not_updated.append(profile)
            print(f"错误: 无法补丁配置文件 {profile['uuid']} - {str(e)}")
    
    return updated, not_updated
# 主要过程
if __name__ == "__main__":
    try:
        total = get_total_profiles()
        profiles = get_all_profiles_uuids(total)
        updated, not_updated = patch_all_profiles(profiles)
        print(f"完成处理:\n更新: {len(updated)}\n未更新: {len(not_updated)}")
    except Exception as e:
        print(f"致命错误: {str(e)}")
请注意,您的 Python 环境需要安装 "requests" 库以使此脚本正常工作。您可以使用 pip 安装它:
pip install requests
另外,请将 "OCTO_API_TOKEN" 替换为您的实际令牌以进行 API 请求。

使用 ChatGPT 转换脚本
使用 Puppeteer、Selenium 和 Playwright 库
浏览器自动化框架通常与基于 Chromium 的 Google Chrome 配合良好。由于 Octo 浏览器也是基于Chromium 内核,因此可以无缝地与这些框架进行交互。
使用 Selenium 进行自动化
Selenium 是一种流行的浏览器操作自动化工具,因为它允许模拟用户在网站上的操作。
关键特性
- 网页任务自动化。 
- 与使用 JavaScript 和 AJAX 的动态网站一起工作。 
优点
- 灵活性和对多种编程语言的支持。 
- 免费使用,拥有一个庞大而活跃的社区。 
- 开源。 
缺点
- 速度慢且资源消耗大。 
- 需要对编程概念有良好的理解。 
使用 Selenium 进行浏览器自动化可以优化不同的配置文件任务,从简单的自动化脚本到搜索、收集和与不同在线资源的数据交互的网络爬虫。
那些曾经管理多个账户的人对 Selenium 非常熟悉。它可以直接在浏览器中部署,可以用于模拟真正人类的行为。然而,Selenium 并不总是完美的解决方案,它的伪装可能会被一些平台发现,包括 CloudFlare。
CloudFlare 是一个网络安全服务供应商,提供安全内容交付网络服务、DDoS 攻击保护和 DNS 服务器。网站使用 CloudFare 解决方案来检测由 Selenium 发起的查询。
Puppeteer 自动化
Puppeteer 是一个 Node.js 库,允许你使用DevTools协议自动化与基于 Chromium 的浏览器的交互。
特性
- 强大且灵活的网页操作自动化工具。 
- 可以像常规浏览器一样与网页交互。 
- 有一个非官方的 Python 移植版,称为 Pyppeteer,我们创建了一个指南来连接它。 
优点
- 对于处理动态网站和执行 JavaScript 代码的绝佳选择。 
- 易于使用和配置的简单直观 API。 
- 一个免费的工具,拥有一个活跃的社区。 
缺点
- 仅支持 JavaScript(Node.js),但是有非官方的其他语言的移植版。例如,针对 Python 的移植版称为Pyppeteer。 
- 资源消耗大;比一些其他库慢。 
Playwright 自动化
Playwright 是一个 Node.js 库,使用相同的 API 为 Chromium、Firefox 和 WebKit 便捷、快速和有效地自动化。
特性
- 提供代码生成工具 CodeGen。你可以使用它来避免编写大量重复代码,从而节省大量时间。 
- 你可以通过使用 slowMo 参数放慢在网页上完成操作的速度,从而使这些操作的完成速度更接近真实人类的价值。 
- 原生支持与 Shadow DOM 的工作。 
优点
- 开源。 
- 易于安装和配置。 
- 支持所有必要的浏览器引擎。 
- 支持所有三大操作系统(macOS、Windows、Linux)。 
- 支持所有必要的编程语言(Python、Golang、Java、JS、C#)。 
- 支持测试运行器(Mocha、Jest、Jasmine)。 
- 与 CI/CD 工具(Jenkins、CircleCI、Azure Pipeline、TravisCI)集成。 
- 自动延迟,因此你不必硬编码明确的延迟。 
- 自动等待功能。 
- 当你需要同时打开多个标签页时,可以并行执行。 
- 一个舒适的报告器。 
缺点
- 相对较新的产品。 
- 相对较小的社区。 
- 没有 Ruby 支持。 
API:设置环境
- 安装Visual Studio Code以开始。选择你的操作系统及其类型(32 位或 64 位)。 
- 安装Node.js。在安装过程中按两次 - Enter以在 PowerShell 窗口中下载其他软件包。
- 在方便的位置创建一个新的工作文件夹。打开 VS Code,按 Ctrl + K + O,然后选择刚刚创建的文件夹。 
- 安装 NPM 扩展。它允许你为 Node.js 和 ASP.NET Core 安装和管理软件包。为此,按 Ctrl + P,在搜索窗口中输入 - ext install npm。选择出现的列表中的第一个扩展。

在 Visual Studio Code 中安装 NPM 扩展
- 安装代码运行器扩展。为此,按 Ctrl + P,在搜索窗口中输入 - ext install code runner。从列表中安装第一个扩展。
- 打开 VS Code 终端并使用命令 - npm init -y生成 package.json。你将在资源管理器中看到- package.json文件和终端中的相应消息。

使用标准字段的自动填充值生成 package.json

在 Visual Studio Code 中初始化新仓库
- 使用命令 npm i axios puppeteer playwright 在 VS Code 终端中安装库。你应该能看到一个新的子文件夹 node-modules,以及一个新的文件 package-lock.json。 
在 Octo 浏览器中进行多账户管理的有用代码片段
你可以从Octo 浏览器 API 知识库中使用现成的代码片段,例如,用于获取你账户上所有配置文件名称的现成脚本。
//连接模块
const fs = require('fs').promises;
const axios = require('axios');
//这里是配置。将你的 Octo API 令牌粘贴到这里
const config = {
    octo_token: "OCTO_API_TOKEN",
    octo_api_base_url: "https://app.octobrowser.net/api/v2/automation/",
}
const OCTO_REMOTE_API = axios.create({
    baseURL: config.octo_api_base_url,
    timeout: 10000,
    headers: {
        'X-Octo-Api-Token': config.octo_token,
        'Content-Type': "application/json"
    }
});
//函数
async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms * 1000));
}
async function check_limits(response) {
    let rpm = response.headers['x-ratelimit-remaining'];
    let rph = response.headers['x-ratelimit-remaining-hour'];
    if (rpm < 10) {
        console.log("等待一分钟...");
        await sleep(60);
    }
    if (rph < 10) {
        console.log("等待一个小时...");
        await sleep(3600);
    }
}
async function get_total_pages() {
    const response = await OCTO_REMOTE_API.get('/profiles?page=0&page_len=10');
    const total_profiles = response.data.total_count;
    const total_pages = Math.ceil(response.data.total_count / 100);
    console.log(`总配置文件: ${total_profiles}\n总页面: ${total_pages}`);
    await check_limits(response);
    return total_pages;
}
async function get_all_profiles_titles(total_pages) {
    let profiles = [];
    for (let i = 0; i < total_pages; i++) {
        let response = await OCTO_REMOTE_API.get(`/profiles?page=${i}&page_len=100&fields=title`);
        await check_limits(response);
        profiles.push(...response.data.data);
    }
    return profiles;
}
async function write_file(profiles) {
    const titles = profiles.map(item => item.title).filter(Boolean);
    try {
        await fs.writeFile('./profiles_titles.txt', titles.join('\n'), 'utf-8');
    } catch (error) {
        console.error(`错误: 尝试写入文件时发生了一些错误:\n${error}`);
    }
}
//主要过程
(async () => {
    const total_pages = await get_total_pages();
    const profiles = await get_all_profiles_titles(total_pages);
    await write_file(profiles);
    console.log('完成。检查 profiles_titles.txt 文件...');
})()
创建和运行脚本
创建一个 .js 文件。在资源管理器中右键单击将显示你创建的文件。转到 API 文档并选择 Node.js — Axios(通常 cURL 是默认选项)。你可以通过在 VS Code 终端运行命令node script_name.js来启动创建的脚本。

我应该为我的团队使用自动化吗?
我们的调查持续显示,越来越多的团队转向自动化,因为它显著减少了工作时间,并在配置文件内实现了独立的、异步的流程。即便是对例行工作流程的小优化也会带来显著的效果,并显著加快你在 Octo 浏览器中的工作。告别手动配置代理、添加起始页面或为每个配置文件安装扩展!你可以使用我们知识库中的现成代码片段,或根据你的确切需要进行修改,以达到多账户管理的新水平。
常见问题
我担心脚本可能会盗取我的账户、令牌或密码。
我们提供的代码都是开放的且完全透明的。你可以亲自查看没有对第三方资源发出请求,脚本仅使用官方库,并在你的本地计算机上运行。
我可以修改脚本以更好地满足我的需求吗?
当然可以!毕竟这是开源的。如果你使用我们的脚本作为任务的基本可调框架,我们会感到很高兴。
本地 API 请求会消耗可用的请求限制吗?
在本地 API 列中,只有启动配置文件请求算入你的限制。列出活动配置文件、停止配置文件、强制停止配置文件、登录、注销、获取客户版本、更新客户端请求不算入你的限制。
浏览器自动化最需要在哪里?
手动执行重复性的操作消耗了本可以用于更重要任务的时间。除了节省你的时间和专注,自动化还有助于防止错误。重复执行相同的操作几百次几乎使错误不可避免,例如,设置错误的标签或在未分配正确代理的情况下启动配置文件。与人类不同,算法不会犯这样的错误。使用经过良好测试的脚本,你可以确信一切都被正确执行。
除了处理一般任务,自动化在以下领域尤其有用:
- 账户养成:快速在所需地理位置创建账户并自动进行准备。导出所有配置文件在导出列表中。 
- 网页抓取:调整每个 IP 的请求频率至安全水平,轮换代理,并在发生阻塞时修改指纹。 
- 电子商务:开发脚本以自动化劳动密集型任务并安全解析竞争对手数据。 
- 博彩和奖金猎取:简化带有所需地理位置和指纹参数的配置文件创建。跨账户自动化大规模操作以绕过博彩限制。 
开始使用 API
我们分析了用户的 API 调用,发现许多团队正在积极实施脚本来管理配置文件,从而改变多账户管理的常见方法。许多主要联盟营销团队的领导者强调,我们的 API 的便利性是 Octo 相对于竞争对手的关键优势之一。
我们当前的 API 允许你使用所需的数字指纹创建配置文件,添加代理,分配标签,以及使用任何浏览器自动化框架启动和停止自动场景。你也可以在混合模式下处理你的配置文件,充分利用自动化的好处与传统手动控制账户的细微调整相结合。

你可以在你的 Octo 浏览器主账户的附加设置中找到你的 API 令牌
你的 API 令牌
Octo 浏览器从基本订阅及以上版本开始为你提供访问 API 令牌的权限。你的 API 调用限制由你的订阅决定。如果你拥有高级订阅,可以将 API 限制进一步提高至每分钟 1,000 次请求(RPM)和每小时 50,000 次请求(RPH)。如需更高的限制,请联系客户服务。
| 订阅等级 | RPM | RPH | 
|---|---|---|
| 基本 | 50 | 500 | 
| 团队 | 100 | 1500 | 
| 高级 | 200 (+800) | 3000 (+47,000) | 
选择编程语言
编程语言选择的话题过于广泛,无法在这里涵盖所有可能的语言和库组合。在我们的例子中,我们将使用 Node.js + Axios,因为我们对这个堆栈有经验。其他语言,如 C 或 C#,可能更快,但每种语言都有其独特的特性、细节和用例。你可以根据自己的经验选择任何语言。
使用 AI 重写代码
我们自己热爱自动化,总是努力优化我们的工作,因此我们利用 AI 将代码重写为所需的语言。这个过程相当简单:你可以要求ChatGPT使用以下提示为你转换代码:将此脚本从 Node.js 与 Axios 转换为 Python 与 Requests 库。
//modules
const axios = require('axios');
//这里是配置。将你的 Octo API 令牌粘贴到这里,你也可以根据个人需要进行修改
const config = {
    octo_token: "OCTO_API_TOKEN",
    octo_api_base_url: "https://app.octobrowser.net/api/v2/automation/",
    data: {
    extensions: ['aapfglkgnhmiaabhiijkjpfmhllaodgp@4.2.3'],
    bookmarks: [{ "name": "google", "url": "https://google.com" }, { "name": "facebook", "url": "https://facebook.com" }],
    start_pages: ["https://google.com", "https://facebook.com"]
    }
}
const OCTO_REMOTE_API = axios.create({
    baseURL: config.octo_api_base_url,
    timeout: 10000,
    headers: {
        'X-Octo-Api-Token': config.octo_token,
        'Content-Type': "application/json"
    }
});
//functions
async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms * 1000));
}
async function check_limits(response) {
    let rpm = response.headers['x-ratelimit-remaining'];
    let rph = response.headers['x-ratelimit-remaining-hour'];
    if (rpm < 10) {
        console.log("等待一分钟...");
        await sleep(60);
    }
    if (rph < 10) {
        console.log("等待一个小时...");
        await sleep(3600);
    }
}
async function get_total_profiles(){
    const response = await OCTO_REMOTE_API.get('/profiles?page=0&page_len=10');
    const total_profiles = response.data.total_count;
    const total_pages = Math.ceil(response.data.total_count/100);
    console.log(`总配置文件: ${total_profiles}\n总页面: ${total_pages}`);
    await check_limits(response);
    return total_pages;
}
async function get_all_profiles_uuids(total_pages){
    let profiles = [];
    for (let i = 0; i < total_pages; i++) {
    let response = await OCTO_REMOTE_API.get(`/profiles?page=${i}&page_len=100`);
    await check_limits(response);
    profiles.push(...response.data.data);
    }
    return profiles;
}
async function patch_all_profiles(profiles){
    let updated = [];
    let not_updated = [];
    for (let profile of profiles) {
        try{
        const response = await OCTO_REMOTE_API.patch(`/profiles/${profile.uuid}`, config.data);
        await check_limits(response);
        updated.push(profile);
        console.log(`成功更新 ${profile.uuid}`);
        } catch (error) {
            not_updated.push(profile);
            console.error(`错误: 无法补丁配置文件 ${profile.uuid}`);
        }
    }
    return [updated, not_updated];
}
//main process
(async () => {
    const total = await get_total_profiles();
    const profiles = await get_all_profiles_uuids(total);
    const [updated, not_updated] = await patch_all_profiles(profiles);
    console.log(`完成处理:\n更新: ${updated.length}\n未更新: ${not_updated.length}`);
})();

让我们把代码片段输入给 ChatGPT
当然,这里是使用 Requests 库的等效 Python 脚本:
import requests
import math
import time
# 配置
config = {
    "octo_token": "OCTO_API_TOKEN",
    "octo_api_base_url": "https://app.octobrowser.net/api/v2/automation/",
    "data": {
        "extensions": ["aapfglkgnhmiaabhiijkjpfmhllaodgp@4.2.3"],
        "bookmarks": [
            {"name": "google", "url": "https://google.com"},
            {"name": "facebook", "url": "https://facebook.com"}
        ],
        "start_pages": ["https://google.com", "https://facebook.com"]
    }
}
# 会话设置
session = requests.Session()
session.headers.update({
    "X-Octo-Api-Token": config["octo_token"],
    "Content-Type": "application/json"
})
session.timeout = 10
# 辅助函数
def sleep(seconds):
    time.sleep(seconds)
def check_limits(response):
    rpm = int(response.headers.get("x-ratelimit-remaining", 0))
    rph = int(response.headers.get("x-ratelimit-remaining-hour", 0))
    
    if rpm < 10:
        print("等待一分钟...")
        sleep(60)
    if rph < 10:
        print("等待一个小时...")
        sleep(3600)
# API 函数
def get_total_profiles():
    response = session.get(f"{config['octo_api_base_url']}profiles?page=0&page_len=10")
    response.raise_for_status()
    
    total_profiles = response.json()["total_count"]
    total_pages = math.ceil(total_profiles / 100)
    print(f"总配置文件: {total_profiles}\n总页面: {total_pages}")
    
    check_limits(response)
    return total_pages
def get_all_profiles_uuids(total_pages):
    profiles = []
    for i in range(total_pages):
        response = session.get(f"{config['octo_api_base_url']}profiles?page={i}&page_len=100")
        response.raise_for_status()
        
        check_limits(response)
        profiles.extend(response.json()["data"])
    
    return profiles
def patch_all_profiles(profiles):
    updated = []
    not_updated = []
    
    for profile in profiles:
        try:
            response = session.patch(
                f"{config['octo_api_base_url']}profiles/{profile['uuid']}",
                json=config["data"]
            )
            response.raise_for_status()
            
            check_limits(response)
            updated.append(profile)
            print(f"成功更新 {profile['uuid']}")
        except Exception as e:
            not_updated.append(profile)
            print(f"错误: 无法补丁配置文件 {profile['uuid']} - {str(e)}")
    
    return updated, not_updated
# 主要过程
if __name__ == "__main__":
    try:
        total = get_total_profiles()
        profiles = get_all_profiles_uuids(total)
        updated, not_updated = patch_all_profiles(profiles)
        print(f"完成处理:\n更新: {len(updated)}\n未更新: {len(not_updated)}")
    except Exception as e:
        print(f"致命错误: {str(e)}")
请注意,您的 Python 环境需要安装 "requests" 库以使此脚本正常工作。您可以使用 pip 安装它:
pip install requests
另外,请将 "OCTO_API_TOKEN" 替换为您的实际令牌以进行 API 请求。

使用 ChatGPT 转换脚本
使用 Puppeteer、Selenium 和 Playwright 库
浏览器自动化框架通常与基于 Chromium 的 Google Chrome 配合良好。由于 Octo 浏览器也是基于Chromium 内核,因此可以无缝地与这些框架进行交互。
使用 Selenium 进行自动化
Selenium 是一种流行的浏览器操作自动化工具,因为它允许模拟用户在网站上的操作。
关键特性
- 网页任务自动化。 
- 与使用 JavaScript 和 AJAX 的动态网站一起工作。 
优点
- 灵活性和对多种编程语言的支持。 
- 免费使用,拥有一个庞大而活跃的社区。 
- 开源。 
缺点
- 速度慢且资源消耗大。 
- 需要对编程概念有良好的理解。 
使用 Selenium 进行浏览器自动化可以优化不同的配置文件任务,从简单的自动化脚本到搜索、收集和与不同在线资源的数据交互的网络爬虫。
那些曾经管理多个账户的人对 Selenium 非常熟悉。它可以直接在浏览器中部署,可以用于模拟真正人类的行为。然而,Selenium 并不总是完美的解决方案,它的伪装可能会被一些平台发现,包括 CloudFlare。
CloudFlare 是一个网络安全服务供应商,提供安全内容交付网络服务、DDoS 攻击保护和 DNS 服务器。网站使用 CloudFare 解决方案来检测由 Selenium 发起的查询。
Puppeteer 自动化
Puppeteer 是一个 Node.js 库,允许你使用DevTools协议自动化与基于 Chromium 的浏览器的交互。
特性
- 强大且灵活的网页操作自动化工具。 
- 可以像常规浏览器一样与网页交互。 
- 有一个非官方的 Python 移植版,称为 Pyppeteer,我们创建了一个指南来连接它。 
优点
- 对于处理动态网站和执行 JavaScript 代码的绝佳选择。 
- 易于使用和配置的简单直观 API。 
- 一个免费的工具,拥有一个活跃的社区。 
缺点
- 仅支持 JavaScript(Node.js),但是有非官方的其他语言的移植版。例如,针对 Python 的移植版称为Pyppeteer。 
- 资源消耗大;比一些其他库慢。 
Playwright 自动化
Playwright 是一个 Node.js 库,使用相同的 API 为 Chromium、Firefox 和 WebKit 便捷、快速和有效地自动化。
特性
- 提供代码生成工具 CodeGen。你可以使用它来避免编写大量重复代码,从而节省大量时间。 
- 你可以通过使用 slowMo 参数放慢在网页上完成操作的速度,从而使这些操作的完成速度更接近真实人类的价值。 
- 原生支持与 Shadow DOM 的工作。 
优点
- 开源。 
- 易于安装和配置。 
- 支持所有必要的浏览器引擎。 
- 支持所有三大操作系统(macOS、Windows、Linux)。 
- 支持所有必要的编程语言(Python、Golang、Java、JS、C#)。 
- 支持测试运行器(Mocha、Jest、Jasmine)。 
- 与 CI/CD 工具(Jenkins、CircleCI、Azure Pipeline、TravisCI)集成。 
- 自动延迟,因此你不必硬编码明确的延迟。 
- 自动等待功能。 
- 当你需要同时打开多个标签页时,可以并行执行。 
- 一个舒适的报告器。 
缺点
- 相对较新的产品。 
- 相对较小的社区。 
- 没有 Ruby 支持。 
API:设置环境
- 安装Visual Studio Code以开始。选择你的操作系统及其类型(32 位或 64 位)。 
- 安装Node.js。在安装过程中按两次 - Enter以在 PowerShell 窗口中下载其他软件包。
- 在方便的位置创建一个新的工作文件夹。打开 VS Code,按 Ctrl + K + O,然后选择刚刚创建的文件夹。 
- 安装 NPM 扩展。它允许你为 Node.js 和 ASP.NET Core 安装和管理软件包。为此,按 Ctrl + P,在搜索窗口中输入 - ext install npm。选择出现的列表中的第一个扩展。

在 Visual Studio Code 中安装 NPM 扩展
- 安装代码运行器扩展。为此,按 Ctrl + P,在搜索窗口中输入 - ext install code runner。从列表中安装第一个扩展。
- 打开 VS Code 终端并使用命令 - npm init -y生成 package.json。你将在资源管理器中看到- package.json文件和终端中的相应消息。

使用标准字段的自动填充值生成 package.json

在 Visual Studio Code 中初始化新仓库
- 使用命令 npm i axios puppeteer playwright 在 VS Code 终端中安装库。你应该能看到一个新的子文件夹 node-modules,以及一个新的文件 package-lock.json。 
在 Octo 浏览器中进行多账户管理的有用代码片段
你可以从Octo 浏览器 API 知识库中使用现成的代码片段,例如,用于获取你账户上所有配置文件名称的现成脚本。
//连接模块
const fs = require('fs').promises;
const axios = require('axios');
//这里是配置。将你的 Octo API 令牌粘贴到这里
const config = {
    octo_token: "OCTO_API_TOKEN",
    octo_api_base_url: "https://app.octobrowser.net/api/v2/automation/",
}
const OCTO_REMOTE_API = axios.create({
    baseURL: config.octo_api_base_url,
    timeout: 10000,
    headers: {
        'X-Octo-Api-Token': config.octo_token,
        'Content-Type': "application/json"
    }
});
//函数
async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms * 1000));
}
async function check_limits(response) {
    let rpm = response.headers['x-ratelimit-remaining'];
    let rph = response.headers['x-ratelimit-remaining-hour'];
    if (rpm < 10) {
        console.log("等待一分钟...");
        await sleep(60);
    }
    if (rph < 10) {
        console.log("等待一个小时...");
        await sleep(3600);
    }
}
async function get_total_pages() {
    const response = await OCTO_REMOTE_API.get('/profiles?page=0&page_len=10');
    const total_profiles = response.data.total_count;
    const total_pages = Math.ceil(response.data.total_count / 100);
    console.log(`总配置文件: ${total_profiles}\n总页面: ${total_pages}`);
    await check_limits(response);
    return total_pages;
}
async function get_all_profiles_titles(total_pages) {
    let profiles = [];
    for (let i = 0; i < total_pages; i++) {
        let response = await OCTO_REMOTE_API.get(`/profiles?page=${i}&page_len=100&fields=title`);
        await check_limits(response);
        profiles.push(...response.data.data);
    }
    return profiles;
}
async function write_file(profiles) {
    const titles = profiles.map(item => item.title).filter(Boolean);
    try {
        await fs.writeFile('./profiles_titles.txt', titles.join('\n'), 'utf-8');
    } catch (error) {
        console.error(`错误: 尝试写入文件时发生了一些错误:\n${error}`);
    }
}
//主要过程
(async () => {
    const total_pages = await get_total_pages();
    const profiles = await get_all_profiles_titles(total_pages);
    await write_file(profiles);
    console.log('完成。检查 profiles_titles.txt 文件...');
})()
创建和运行脚本
创建一个 .js 文件。在资源管理器中右键单击将显示你创建的文件。转到 API 文档并选择 Node.js — Axios(通常 cURL 是默认选项)。你可以通过在 VS Code 终端运行命令node script_name.js来启动创建的脚本。

我应该为我的团队使用自动化吗?
我们的调查持续显示,越来越多的团队转向自动化,因为它显著减少了工作时间,并在配置文件内实现了独立的、异步的流程。即便是对例行工作流程的小优化也会带来显著的效果,并显著加快你在 Octo 浏览器中的工作。告别手动配置代理、添加起始页面或为每个配置文件安装扩展!你可以使用我们知识库中的现成代码片段,或根据你的确切需要进行修改,以达到多账户管理的新水平。
常见问题
我担心脚本可能会盗取我的账户、令牌或密码。
我们提供的代码都是开放的且完全透明的。你可以亲自查看没有对第三方资源发出请求,脚本仅使用官方库,并在你的本地计算机上运行。
我可以修改脚本以更好地满足我的需求吗?
当然可以!毕竟这是开源的。如果你使用我们的脚本作为任务的基本可调框架,我们会感到很高兴。
本地 API 请求会消耗可用的请求限制吗?
在本地 API 列中,只有启动配置文件请求算入你的限制。列出活动配置文件、停止配置文件、强制停止配置文件、登录、注销、获取客户版本、更新客户端请求不算入你的限制。
随时获取最新的Octo Browser新闻
通过点击按钮,您同意我们的 隐私政策。
随时获取最新的Octo Browser新闻
通过点击按钮,您同意我们的 隐私政策。
随时获取最新的Octo Browser新闻
通过点击按钮,您同意我们的 隐私政策。


