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新闻
通过点击按钮,您同意我们的 隐私政策。