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

Автоматизация в Octo Browser: как сократить время на рутине
Artur Hvalei
Technical Support Specialist, Octo Browser
Работа с большим количеством профилей в антидетект-браузере требует много сил, времени и ресурсов даже при самом продуманном UX. Чем больше профилей, тем больше рутинных и повторяющихся действий, которые отнимают рабочее время. При этом многие их этих процессов можно автоматизировать и сэкономить массу времени.

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

Содержание

Кому нужна автоматизация действий в браузере

Выполнение однотипных действий вручную отнимает время, которое можно направить на более важные задачи. Кроме экономии времени и внимания, автоматизация помогает избежать ошибок. Повторяя сотни раз одно и то же, легко что-то напутать. Например, установить неправильные теги или запустить профили, не назначив нужные прокси. В отличие от человека, алгоритмы не допускают ошибок. Используя проверенный скрипт, можно быть уверенным, что все будет сделано правильно.

Помимо решения общих задач, автоматизация будет особенно полезна в следующих сферах:
Текущая версия API позволяет создавать профили с нужными отпечатками браузера, добавлять прокси и присваивать теги, а также запускать и останавливать выполнение автоматических сценариев, используя любую удобную библиотеку для управления браузером. Работа с виртуальными профилями может продолжаться в гибридном формате, сочетая привычное оперирование аккаунтами с преимуществами автоматизации.
  • Арбитраж трафика: автоматизация массового создания и настройки профилей, включая загрузку куки, назначение прокси, установку расширений и стартовых страниц.
  • Фарм аккаунтов: быстрое создание аккаунтов в нужных гео и их автоматический прогрев. Экспорт списка профилей в файл.
  • Веб-скрейпинг: настройка частоты запросов с каждого IP-адреса, близкой к безопасным значениям, ротация прокси и изменение параметров фингерпринта при блокировках.
  • E-commerce: создание скриптов для автоматизации трудоемких задач и безопасного парсинга данных конкурентов.
  • Беттинг и бонусхантинг: упрощает создание профилей с нужными геолокациями и параметрами фингерпринта. Автоматизируйте массовые действия с различными аккаунтами для обхода лимитов на ставки.

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

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

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

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

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

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

В Octo Browser этот инструмент доступен, начиная с подписки Base и выше. Лимиты на количество обращений к API соответствуют выбранному тарифному плану. Если вы подписаны на Advanced, у вас есть возможность увеличить лимиты API до 1000 запросов в минуту (RPM) и до 50 000 запросов в час (RPH). Для еще большего повышения лимитов обратитесь в службу поддержки.

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

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

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

Мы сами любим автоматизацию и стремимся оптимизировать нашу работу, поэтому используем ИИ, чтобы переписать код на нужный нам язык. Это довольно просто. Вы можете попросить ChatGPT переписать код для вас, используя следующий промпт:
Сконвертируй мне этот скрипт из Node.js и Axios в вариант на Python с библиотекой Requests.
//modules
const axios = require('axios');
//here is config. Paste your Octo API Token here and you can modify this for your personal needs
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: 'https://app.octobrowser.net/api/v2/automation/',
   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("Waiting a minute...");
       await sleep(60);
   }
   if (rph < 10) {
       console.log("Waiting an hour...");
       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: ${total_profiles}\nTotal Pages: ${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(`Successfully updated ${profile.uuid}`);
       } catch (error) {
           not_updated.push(profile);
           console.error(`ERROR: Can't patch profile ${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(`Finished process:\nUpdated: ${updated.length}\nNot updated: ${not_updated.length}`);
})();
Промпт для конвертации скрипта в ChatGPT

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

Конечно, вот эквивалентный сценарий на языке Python, использующий библиотеку Requests:
import requests
import math
import time
​
# Config
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 setup
session = requests.Session()
session.headers.update({
   "X-Octo-Api-Token": config["octo_token"],
   "Content-Type": "application/json"
})
session.timeout = 10
​
# Helper functions
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("Waiting a minute...")
       sleep(60)
   if rph < 10:
       print("Waiting an hour...")
       sleep(3600)
​
# API functions
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: {total_profiles}\nTotal Pages: {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"Successfully updated {profile['uuid']}")
       except Exception as e:
           not_updated.append(profile)
           print(f"ERROR: Can't patch profile {profile['uuid']} - {str(e)}")
  
   return updated, not_updated
​
# Main process
if __name__ == "__main__":
   try:
       total = get_total_profiles()
       profiles = get_all_profiles_uuids(total)
       updated, not_updated = patch_all_profiles(profiles)
       print(f"Finished process:\nUpdated: {len(updated)}\nNot updated: {len(not_updated)}")
   except Exception as e:
       print(f"Fatal error: {str(e)}")
Обратите внимание, что для работы этого скрипта в среде Python должна быть установлена библиотека "requests". Вы можете установить ее с помощью pip:
pip install requests
Также замените "OCTO_API_TOKEN" на свой реальный токен для выполнения запросов к API.
Конвертация скрипта в ChatGPT

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

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

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

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

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

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

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

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

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

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

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

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

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

Возможности:
  • Доступен инструмент для генерации кода CodeGen. Его можно использовать, чтобы избежать написания большого количества повторяющегося кода и сэкономить много времени.
  • Вы можете снизить скорость выполнения действий на странице, используя параметр slowMo, приближая эти параметры к человеческим.
  • Нативно поддерживается работа с Shadow DOM.
Плюсы:
  • Открытые исходники.
  • Простая установка и конфигурация.
  • Поддерживает все нужные браузерные движки.
  • И все три ОС-платформы (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 и сгенерируйте package.json с помощью команды «npm init -y». В обозревателе файлов появится package.json и соответствующее сообщение в терминале.
7. Установите библиотеки с помощью команды в терминале VS Code «npm i axios puppeteer playwright». После этого должна появиться подпапка «node-modules» и файл «package-lock.json».

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

Вы можете пользоваться уже готовыми сниппетами из документации по API Octo Browser. Например, готовый скрипт для получения названий всех профилей на вашем аккаунте.
//connecting modules
const fs = require('fs').promises;
const axios = require('axios');
//here is config. Paste your Octo API Token here
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"
    }
});

//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("Waiting a minute...");
        await sleep(60);
    }
    if (rph < 10) {
        console.log("Waiting an hour...");
        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: ${total_profiles}\nTotal Pages: ${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(`ERROR: While trying writing the file some error occured:\n${error}`);
    }
}
//main process
(async () => {
    const total_pages = await get_total_pages();
    const profiles = await get_all_profiles_titles(total_pages);
    await write_file(profiles);
    console.log('Finished. Check profiles_titles.txt file...');
})()

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

  • Создайте файл с расширением .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.
Сниппет — это небольшой фрагмент кода, выполняющий определенные задачи. Его можно вставлять в основной код, а затем настраивать в соответствии с его требованиями.
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
Нажимая кнопку, вы соглашаетесь с нашей политикой конфиденциальности.

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