Автоматизация в Octo Browser: как сократить время на рутине

1 АВГУСТА 2023 ЭКСПЕРТНОЕ МНЕНИЕ
Автоматизация в Octo Browser: как сократить время на рутине
Артур Хвалей
Technical Support Specialist, Octo Browser
Работа в антидетект браузере с большим количеством профилей требует много сил, времени и ресурсов, даже при самом продуманном UX. Больше профилей — больше рутинных повторяющихся действий, на которые может уйти целый рабочий день. Но в действительности часть этих действий можно автоматизировать и этим сэкономить команде время.

Клики, переходы по ссылкам, ввод данных — любое из этих действий в браузере можно ускорить в несколько раз. В этой статье мы расскажем, как это сделать.

Содержание

Начало работы с API

Мы проанализировали количество обращений к API у наших пользователей и заметили, что многие команды активно внедряют скрипты для управления профилями, меняя подходы к мультиаккаунтингу.

Текущая версия API позволяет создавать профили с нужными отпечатками браузера, добавлять прокси и присваивать теги, а также запускать и останавливать выполнение автоматических сценариев, используя любую удобную библиотеку для управления браузером. Работа с виртуальными профилями может продолжаться в гибридном формате, сочетая привычное оперирование аккаунтами с преимуществами автоматизации.
API-токен отображается в настройках клиента Octo Browser мастер-аккаунта на вкладке «Дополнительные».

API-токен отображается в настройках клиента Octo Browser мастер-аккаунта на вкладке «Дополнительные».

Получение API-токена

В Octo Browser этот инструмент доступен начиная с подписки Base и выше. Лимиты на количество обращений к API применяются в соответствии с выбранным тарифным планом.

Выбор языка программирования

Тема выбора языка слишком обширная, чтобы здесь описать возможные комбинации языков программирования и библиотек. В нашем примере мы будем использовать Node.js + Axios, потому что мы обладаем опытом работы с этим стеком. C/С# и прочие языки могут работать быстрее, но у них есть собственные нюансы и области применения. Вы можете выбрать любой удобный для вашей работы язык, основываясь на вашем опыте.

Переписывание кода с помощью AI

Мы и сами любим автоматизировать и оптимизировать работу, поэтому используем ИИ, чтобы переписать код на нужный нам язык. Вы можете попросить ChatGPT переписать для вас код, используя промпт ниже:
Код на Node.js для библиотеки Axios
Развернуть
Сконвертируй мне этот скрипт из Node.js и Axios в вариант на Python с библиотекой Requests.

```
const axios = require('axios');
const ext = ['aapfglkgnhmiaabhiijkjpfmhllaodgp@4.2.3']; //UUIDs of extensions
const pageURL = 'https://app.octobrowser.net/api/v2/automation/profiles?page_len=100&page=';
const profilesURL = 'https://app.octobrowser.net/api/v2/automation/profiles/';
const pagesNumber = 2; /*2 number of pages, you should check number of your pages and modify it here(100 profiles on page maximum)
Ex: If you have 170 profiles, you have 2 pages.*/
const OCTO_TOKEN = "TOKEN" //token should be here
function sleep(ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
resolve();
} catch (error) {
reject(error);
}
}, ms);
});
}
const getProfiles = {
method: "GET",
url: '',
headers: {
'X-Octo-Api-Token': OCTO_TOKEN //your token should be here
}
};
const setExtension = {
method: "PATCH",
url: '',
headers: {
'X-Octo-Api-Token': OCTO_TOKEN // your token should be here
},
data: {
extensions: ext,
bookmarks: [{ // here you can modify bookmarks which you want
"name": "google",
"url": "https://google.com"
},
{
"name": "facebook",
"url": "https://facebook.com"
}]
}
};
(async () => {
for (let i = 0; i < pagesNumber; i++) {
getProfiles.url = `${pageURL}${i}`;
const profilesUUID = await axios(getProfiles).catch(function (error) {
if (error.response.status === 429) {
console.log("Try after " + (error.response.headers['retry-after'] / 60) + " minutes");
} else {
console.log(error);
}
});
let rpm = profilesUUID.headers['x-ratelimit-remaining'];
let rph = profilesUUID.headers['x-ratelimit-remaining-hour'];
const profilesQuantity = profilesUUID.data.data.length;
if (rpm > 10 && rph > 10) {
for (let j = 0; j < profilesQuantity; j++) {
const uuid = profilesUUID.data.data[j].uuid;
setExtension.url = `${profilesURL}${uuid}`;
if (rpm < 5) {
console.log("waiting a minute");
await sleep(60000);
rpm += 200; //your rpm
}
if (rph < 5) {
console.log("waiting an hour...");
await sleep(3600000);
rph += 500; //your rph
}
const resp = await axios(setExtension).catch(function (error) {
console.log(error);
});
rpm = resp.headers['x-ratelimit-remaining'];
rph = resp.headers['x-ratelimit-remaining-hour'];
console.log(resp.data);
console.log('rph = ' + rph + ' rpm = ' + rpm);
}
} else {
console.log('Not enough RPM or RPH to proceed. RPM: ' + rpm + ', RPH: ' + rph);
}
}
})();
```
Промпт для конвертации скрипта в ChatGPT

Промпт для конвертации скрипта в ChatGPT.

Сгенерированный код на Python для библиотеки Requests
Развернуть
Конечно, вот эквивалентный сценарий на языке Python, использующий библиотеку Requests:

```python
import requests
import time
ext = ['aapfglkgnhmiaabhiijkjpfmhllaodgp@4.2.3'] # UUIDs of extensions
pageURL = 'https://app.octobrowser.net/api/v2/automation/profiles?page_len=100&page='
profilesURL = 'https://app.octobrowser.net/api/v2/automation/profiles/'
pagesNumber = 2 # 2 number of pages, you should check the number of your pages and modify it here(100 profiles on page maximum)
OCTO_TOKEN = "TOKEN" # token should be here
def sleep(ms):
time.sleep(ms / 1000.0)
getProfiles = {
"method": "GET",
"url": '',
"headers": {
'X-Octo-Api-Token': OCTO_TOKEN # your token should be here
}
}
setExtension = {
"method": "PATCH",
"url": '',
"headers": {
'X-Octo-Api-Token': OCTO_TOKEN # your token should be here
},
"data": {
"extensions": ext,
"bookmarks": [{ # here you can modify bookmarks as desired
"name": "google",
"url": "https://google.com"
},
{
"name": "facebook",
"url": "https://facebook.com"
}]
}
}
def main():
for i in range(pagesNumber):
getProfiles["url"] = f"{pageURL}{i}"
profilesUUID = requests.get(getProfiles["url"], headers=getProfiles["headers"])
if profilesUUID.status_code == 429:
print(f"Try after {profilesUUID.headers['retry-after']} seconds")
else:
rpm = int(profilesUUID.headers['x-ratelimit-remaining'])
rph = int(profilesUUID.headers['x-ratelimit-remaining-hour'])
profilesQuantity = len(profilesUUID.json()["data"])
if rpm > 10 and rph > 10:
for j in range(profilesQuantity):
uuid = profilesUUID.json()["data"][j]["uuid"]
setExtension["url"] = f"{profilesURL}{uuid}"
if rpm < 5:
print("waiting a minute")
sleep(60000)
rpm += 200 # your rpm
if rph < 5:
print("waiting an hour...")
sleep(3600000)
rph += 500 # your rph
resp = requests.patch(setExtension["url"], headers=setExtension["headers"], json=setExtension["data"])
rpm = int(resp.headers['x-ratelimit-remaining'])
rph = int(resp.headers['x-ratelimit-remaining-hour'])
print(resp.json())
print('rph = ' + str(rph) + ' rpm = ' + str(rpm))
else:
print('Not enough RPM or RPH to proceed. RPM: ' + str(rpm) + ', RPH: ' + str(rph))
if __name__ == "__main__":
main()
```
Обратите внимание, что для работы этого скрипта в среде Python должна быть установлена библиотека "requests". Вы можете установить ее с помощью pip:

```
pip install requests
```
Также замените "TOKEN" на свой реальный токен для выполнения запросов к API.
Конвертация скрипта в ChatGPT

Конвертация скрипта в ChatGPT.

Работа с библиотеками Puppeteer, Selenium, Playwright

Библиотеки для автоматизации браузера прежде всего ориентированы на работу с Google Chrome, созданном на базе Chromium. Octo Browser также создан на ядре Chromium, поэтому взаимодействие с этими библиотеками происходит безупречно.

Автоматизация Selenium

Selenium — популярный инструмент для автоматизации действий браузера, который позволяет моделировать поведение пользователя на сайте.

Возможности:
  • Автоматизация задач в вебе.
  • Возможность работы с динамическими веб-сайтами, использующими JavaScript и AJAX.
Плюсы:
  • Гибкость и поддержка множества языков программирования.
  • Бесплатный в использовании с большим и активным сообществом.
  • Открытый исходный код.
Минусы:
  • Медленный и ресурсоемкий.
  • Требуется хорошее понимание концепций программирования.

Браузерная автоматизация с Selenium позволяет оптимизировать различные задачи в профилях: от создания простых скриптов автоматизации до веб-краулеров, которые занимаются поиском, сбором и взаимодействием с данными различных онлайн-ресурсов.

Selenium должен быть знаком тем, кто имеет опыт управления несколькими аккаунтами. Его можно развернуть прямо в браузере и имитировать поведение реального человека. Однако Selenium не всегда так хорош, и его маскировка может распознаваться некоторыми платформами, одна из которых — CloudFlare.

Тестовый сайт обнаружения автоматизации: nowsecure. Страница сайта находится под защитой CloudFlare. Если она требует подтвердить, что мы люди, это значит, что браузер не прошел проверку и было определено автоматизированное ПО.
Успешное обхождение защиты CloudFlare

Успешное обхождение защиты CloudFlare.

Автоматизация Puppeteer

Puppeteer — это библиотека Node.js, которая позволяет автоматизировать работу с браузерами на исходном коде Chromium через протокол DevTools.

Особенности:
  • Мощный и гибкий инструмент для автоматизации действий в вебе.
  • Может взаимодействовать со страницами через обычный браузер.
  • Существует неофициальный порт для Python, который называется Pyppeteer. Мы подготовили инструкцию по его подключению.
Плюсы:
  • Отличный выбор для работы с динамическими сайтами и выполнения кода на JavaScript.
  • Простой и интуитивно понятный API, который легко использовать и настраивать
  • Бесплатный инструмент с активным сообществом.
Минусы:
  • Поддерживает только JavaScript (Node.js).
  • Ресурсоемкий; медленнее, чем некоторые другие библиотеки.

Puppeteer в состоянии обойти защиту CloudFlare через запуск протокола Chrome DevTools Protocol. Однако обязательное использование Node.js делает этот метод менее привлекательным.

Тестовый сайт обнаружения браузерной автоматизации с Puppeteer.

Автоматизация Playwright

Playwright — это библиотека Node.js, которая обеспечивает надежную, быструю и эффективную автоматизацию Chromium, Firefox and WebKit при помощи одного API.

Возможности:
  • Доступен инструмент для генерации кода CodeGen. Его можно использовать, чтобы избежать написания большого количества повторяющегося кода и сэкономить много времени.
  • Вы можете снизить скорость выполнения действий на странице, используя параметр slowMo, приближая эти параметры к человеческим.
Плюсы:
  • Открытые исходники.
  • Простая установка и конфигурация.
  • Поддерживает все нужные браузерные движки.
  • И все три ОС-платформы (macOS, Windows, Linux).
  • Поддержка всех нужных языков программирования (Python, Golang, Java, JS, C#).
  • Поддерживает тест-раннеры (Mocha, Jest, Jasmine).
  • Интегрируется с инструментами CI/CD (Jenkins, CircleCI, Azure Pipeline, TravisCI).
  • Автоматические ожидания: не надо прописывать эксплицитное ожидание.
  • Функция auto-wait.
  • Параллельное выполнение в контекстах, когда много вкладок надо открыть одновременно.
  • Есть удобный Reporter.
Минусы:
  • Относительно новый продукт.
  • Не очень большое комьюнити.
  • Отсутствует поддержка Ruby.

API: Настройка окружения

  1. Чтобы начать работу, установите Visual Studio Code. Выберите свою операционную систему и её разрядность (32/64 бита).
  2. Установите Node.js. В процессе установки два раза нажмите Enter для загрузки дополнительных пакетов в окне PowerShell.
  3. Создайте новую рабочую папку в удобном для вас месте. Откройте VS Code и нажмите сочетание клавиш Ctrl + K + O, выберите созданную папку.
  4. Установите расширение NPM. Оно позволяет устанавливать пакеты для приложений Node.js и ASP.NET Core, а также управлять ими. Для этого нажмите Ctrl + P и в окне поиска введите «ext install npm». Из появившегося списка расширений выберите самое первое.
Установка расширения NPM в Visual Studio Code.

Установка расширения NPM в Visual Studio Code.

5. Установите расширение Code runner. Для этого нажмите Ctrl + P и в окне поиска напишите «ext install code runner». Из списка расширений установите самое первое.
6. Откройте терминал VS Code и инициализируйте папку с помощью команды «npm init -y». В обозревателе файлов появится package.json и соответствующее сообщение в терминале.
7. Установите библиотеки с помощью команды в терминале VS Code «npm i axios puppeteer playwright». После этого должна появиться подпапка «node-modules» и файл «package-lock.json».

Полезные сниппеты для мультиаккаунтинга в Octo Browser

Вы можете пользоваться уже готовыми сниппетами из документации по API Octo Browser. Например, готовым скриптом по добавлению избранного прокси в профиль.
Скрипт добавляет прокси в профиль
Развернуть
```
const axios = require('axios');
const data = {
proxy: {
uuid: 'uuidOfSavedProxy', //put UUID of saved proxy here
}
}
const config = {
method: 'patch',
url: 'https://app.octobrowser.net/api/v2/automation/profiles/uuidOfProfile', //Put UUID of profile
headers: {
'Content-Type': 'application/json',
'X-Octo-Api-Token': 'Token' //Put your Token here
},
data: data
};
axios(config)
.then(function (response) {
console.log(response.data);
})
.catch(function (error) {
console.log(error);
});
```

Создание и запуск скрипта

  • Создайте файл с расширением .js. По клику правой кнопкой мыши по обозревателю (Explorer) видны созданные файлы.
  • Зайдите на документацию по API и выберите язык Node.js – Axios (Обычно стоит cURL по умолчанию).
  • Запуск написанного скрипта происходит по команде в терминале VS Code «node script_name.js».
Автоматизация в Octo Browser

Стоит ли внедрять автоматизацию в работу вашей команды?

Наши опросы показывают, что всё больше команд прибегают к автоматизации, поскольку это экономит огромное количество рабочего времени и позволяет запускать независимые и асинхронные процессы в профилях.

Даже небольшая оптимизация рутинных процессов даст ощутимый результат и в несколько раз ускорит вашу привычную работу в Octo Browser. Забудьте о ручной настройке прокси, добавлении стартовых страниц и всех необходимых расширений для каждого профиля. Пользуйтесь готовыми сниппетами из нашей документации, модифицируйте их под свои задачи и выходите на новый уровень мультиаккаунтинга.

Часто задаваемые вопросы

Ваши скрипты не воруют аккаунты, токены или пароли?
Мы предоставляем открытый код, в котором всё прозрачно. Вы можете сами посмотреть, что никаких запросов на сторонние ресурсы не подается. Программа использует официальные библиотеки и запускается на вашей локальной машине.
Можно ли подправить скрипт под свои цели? Или поправить костыли?
Конечно можно, это же открытый код. Будет отлично, если вы сможете использовать этот скрипт как скелет для своих задач.
Израсходуют ли запросы к Local API количество допустимых запросов?
Из всех запросов, которые доступны в колонке Local API, израсходует RPM (кол-во запросов в минуту) и RPH (кол-во запросов в час) только запрос Start Profile. Запросы List Active Profiles, Stop Profile, Force Stop Profile, Login, Logout, Get Client Version, Update Client не расходуют лимиты.
Можно ли массово создать профили и заполнить их куки, подключить расширения и назначить теги?
Через интерфейс клиента Octo Browser массовое создание профилей с загрузкой куки на данный момент недоступно. Для этого вы можете использовать наш API.

Выберите удобный язык программирования для создания скрипта и используйте текстовый файл с куки или другими данными. Настройте обращения из скрипта к файлу таким образом, чтобы последовательно передавать нужные параметры в запрос создания профиля.
Сниппет — это небольшой фрагмент кода, выполняющий определенные задачи. Его можно вставлять в основной код, а затем настраивать в соответствии с его требованиями.
Node или Node.js — программная платформа для выполнения кода JavaScript вне браузера, построенная на движке Chrome V8.
Axios — это библиотека JavaScript, которая позволяет делать HTTP-запросы из браузера или из Node.js.
CloudFlare — поставщик услуг веб-безопасности, защиты от DDoS-атак, безопасного доступа к ресурсам и серверам DNS. Cайты используют решения CloudFlare для обнаружения запросов, инициированных Selenium.
Python is a high-level programming language that is known for its efficiency, simplicity, and versatility.
Requests is a Python module that you can use to send all kinds of HTTP requests.

Понравилась статья? Поделитесь с друзьями!

Похожие статьи
Присоединяйтесь к Octo Browser сейчас
Вы можете обращаться за помощью к нашим специалистам службы поддержки в чате.