Ações em massa úteis com a API do Octo Browser

Ações em massa úteis com a API do Octo Browser
Alex Phillips
Alex Phillips

Customer Service Specialist

API (Application Programming Interface) é uma interface que permite que vários aplicativos interajam entre si. No caso do Octo Browser, a API permite que você envie solicitações HTTP para os servidores da Octo e automatize o gerenciamento de perfis de navegador. 

Anteriormente, explicamos em detalhes o que é uma API, cobrimos maneiras de executar scripts e explicamos a estrutura das requisições. Agora, vamos apresentar vários exemplos úteis que são os mais procurados entre nossos usuários. Depois de ler este artigo, você aprenderá como recuperar e salvar nomes de perfis, adicionar extensões em massa, páginas iniciais e favoritos aos perfis criados, e exportar dados de perfil para uma planilha. Abaixo você encontrará instruções detalhadas e código pronto para uso.

Índice

Preparação

  1. Baixe e instale o VS Code.

  2. Baixe e instale o Node.js.

  3. Crie uma pasta em um local conveniente e nomeie-a, por exemplo, octo_api.

  4. Abra esta pasta no VS Code.

  5. Crie um arquivo com extensão .js. É melhor nomeá-lo de acordo com a ação que o código executará para evitar confusão: por exemplo, get_titles.js.

  6. Abra o terminal e execute o comando npm install axios para instalar uma dependência para o Node.js.

  7. Se o VS Code mostrar um erro, abra o Windows PowerShell como administrador, insira o comando Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned e confirme. Em seguida, repita a etapa anterior.

  8. Inicie o Octo Browser.

Onde encontrar seu token API

Para interagir com o Octo Browser via API, você precisará de um token API. Ele está disponível para usuários com uma assinatura Base ou superior. O token API é exibido no Octo Browser nas configurações da conta mestre sob a aba “Adicional” (outros membros da equipe não podem ver o token API).

API token is displayed in Octo Browser

Limites da API (limites de taxa)

Lembre-se que a API do Octo Browser possui limites de solicitações. Os snippets fornecidos usam a função check_limits, que verifica os cabeçalhos de limite de taxa da API e pausa automaticamente se o número de solicitações restantes for baixo. Isso ajuda a evitar erros 429 Too Many Requests.

Ao fazer solicitações para a API Pública, 1 RPM e 1 RPH são consumidos por solicitação. Ao usar a API Local, RPM/RPH não são consumidos, exceto para POST Start Profile (1 RPM e 1 RPH) e POST One-time profile (4 RPM e 4 RPH).

O número exato de perfis que você pode iniciar, criar e excluir sob uma assinatura específica depende totalmente de seus scripts e sua lógica. Você pode calcular independentemente o número necessário de solicitações para seu fluxo de trabalho com base nas solicitações que afetam os limites de RPH e RPM.

Algumas solicitações de API podem requerer processamento mais complexo, o que significa que sua execução pode custar mais do que uma solicitação única. Isso é necessário para balancear a carga do servidor e garantir o desempenho ideal para todos os usuários.

RPM significa solicitações por minuto.
RPH significa solicitações por hora.
Os valores dos limites de solicitação dependem da sua assinatura.

Com a configuração concluída, vamos passar para snippets úteis.

Recuperando nomes de perfis e salvando em um arquivo .txt

Este snippet é útil quando você precisa coletar rapidamente uma lista de todos os perfis criados em um só lugar. Ele ajuda a simplificar o rastreamento de perfis, verificar sua existência real e realizar mais ações com eles.

  1. Crie um arquivo get_titles.js na pasta octo_api e cole o código do snippet nele.

  2. Substitua OCTO_API_TOKEN no campo octo_token com seu token API do Octo Browser.

OCTO_API_TOKEN
  1. Salve o arquivo.

  2. Insira o comando node get_titles.js no terminal e execute o script.

saving profile names to a .txt file

Os nomes dos perfis serão salvos linha por linha no arquivo profiles_titles.txt na mesma pasta do script.

Snippet para salvar nomes de perfis em um arquivo .txt

const fs = require('fs').promises;
const axios = require('axios');
//This is the configuration. Specify your Octo API Token here
const config = {
    octo_token: "OCTO_API_TOKEN", // Specify your API token here
    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) {
    function parse_int_safe(value) {
        const parsed = parseInt(value, 10);
        return isNaN(parsed) ? 0 : parsed;
    }
    const ratelimit_header = response.headers.ratelimit;
    if (!ratelimit_header) {
        console.warn('No ratelimit header found!');
        return;
    }
    const limit_entries = ratelimit_header.split(',').map(entry => entry.trim());
    for (const entry of limit_entries) {
        const name_match = entry.match(/^([^;]+)/);
        const r_match = entry.match(/;r=(\d+)/);
        const t_match = entry.match(/;t=(\d+)/);
        if (!r_match || !t_match) {
            console.warn(`Invalid ratelimit format: ${entry}`);
            continue;
        }
        const limit_name = name_match ? name_match[1] : 'unknown_limit';
        const remaining_quantity = parse_int_safe(r_match[1]);
        const window_seconds = parse_int_safe(t_match[1]);
        if (remaining_quantity < 5) {
            const wait_time = window_seconds + 1;
            console.log(`Waiting ${wait_time} seconds due to ${limit_name} limit`);
            await sleep(wait_time);
        }
    }
}
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}`);
    }
}
(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...');
})()
const fs = require('fs').promises;
const axios = require('axios');
//This is the configuration. Specify your Octo API Token here
const config = {
    octo_token: "OCTO_API_TOKEN", // Specify your API token here
    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) {
    function parse_int_safe(value) {
        const parsed = parseInt(value, 10);
        return isNaN(parsed) ? 0 : parsed;
    }
    const ratelimit_header = response.headers.ratelimit;
    if (!ratelimit_header) {
        console.warn('No ratelimit header found!');
        return;
    }
    const limit_entries = ratelimit_header.split(',').map(entry => entry.trim());
    for (const entry of limit_entries) {
        const name_match = entry.match(/^([^;]+)/);
        const r_match = entry.match(/;r=(\d+)/);
        const t_match = entry.match(/;t=(\d+)/);
        if (!r_match || !t_match) {
            console.warn(`Invalid ratelimit format: ${entry}`);
            continue;
        }
        const limit_name = name_match ? name_match[1] : 'unknown_limit';
        const remaining_quantity = parse_int_safe(r_match[1]);
        const window_seconds = parse_int_safe(t_match[1]);
        if (remaining_quantity < 5) {
            const wait_time = window_seconds + 1;
            console.log(`Waiting ${wait_time} seconds due to ${limit_name} limit`);
            await sleep(wait_time);
        }
    }
}
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}`);
    }
}
(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...');
})()

Preparação

  1. Baixe e instale o VS Code.

  2. Baixe e instale o Node.js.

  3. Crie uma pasta em um local conveniente e nomeie-a, por exemplo, octo_api.

  4. Abra esta pasta no VS Code.

  5. Crie um arquivo com extensão .js. É melhor nomeá-lo de acordo com a ação que o código executará para evitar confusão: por exemplo, get_titles.js.

  6. Abra o terminal e execute o comando npm install axios para instalar uma dependência para o Node.js.

  7. Se o VS Code mostrar um erro, abra o Windows PowerShell como administrador, insira o comando Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned e confirme. Em seguida, repita a etapa anterior.

  8. Inicie o Octo Browser.

Onde encontrar seu token API

Para interagir com o Octo Browser via API, você precisará de um token API. Ele está disponível para usuários com uma assinatura Base ou superior. O token API é exibido no Octo Browser nas configurações da conta mestre sob a aba “Adicional” (outros membros da equipe não podem ver o token API).

API token is displayed in Octo Browser

Limites da API (limites de taxa)

Lembre-se que a API do Octo Browser possui limites de solicitações. Os snippets fornecidos usam a função check_limits, que verifica os cabeçalhos de limite de taxa da API e pausa automaticamente se o número de solicitações restantes for baixo. Isso ajuda a evitar erros 429 Too Many Requests.

Ao fazer solicitações para a API Pública, 1 RPM e 1 RPH são consumidos por solicitação. Ao usar a API Local, RPM/RPH não são consumidos, exceto para POST Start Profile (1 RPM e 1 RPH) e POST One-time profile (4 RPM e 4 RPH).

O número exato de perfis que você pode iniciar, criar e excluir sob uma assinatura específica depende totalmente de seus scripts e sua lógica. Você pode calcular independentemente o número necessário de solicitações para seu fluxo de trabalho com base nas solicitações que afetam os limites de RPH e RPM.

Algumas solicitações de API podem requerer processamento mais complexo, o que significa que sua execução pode custar mais do que uma solicitação única. Isso é necessário para balancear a carga do servidor e garantir o desempenho ideal para todos os usuários.

RPM significa solicitações por minuto.
RPH significa solicitações por hora.
Os valores dos limites de solicitação dependem da sua assinatura.

Com a configuração concluída, vamos passar para snippets úteis.

Recuperando nomes de perfis e salvando em um arquivo .txt

Este snippet é útil quando você precisa coletar rapidamente uma lista de todos os perfis criados em um só lugar. Ele ajuda a simplificar o rastreamento de perfis, verificar sua existência real e realizar mais ações com eles.

  1. Crie um arquivo get_titles.js na pasta octo_api e cole o código do snippet nele.

  2. Substitua OCTO_API_TOKEN no campo octo_token com seu token API do Octo Browser.

OCTO_API_TOKEN
  1. Salve o arquivo.

  2. Insira o comando node get_titles.js no terminal e execute o script.

saving profile names to a .txt file

Os nomes dos perfis serão salvos linha por linha no arquivo profiles_titles.txt na mesma pasta do script.

Snippet para salvar nomes de perfis em um arquivo .txt

const fs = require('fs').promises;
const axios = require('axios');
//This is the configuration. Specify your Octo API Token here
const config = {
    octo_token: "OCTO_API_TOKEN", // Specify your API token here
    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) {
    function parse_int_safe(value) {
        const parsed = parseInt(value, 10);
        return isNaN(parsed) ? 0 : parsed;
    }
    const ratelimit_header = response.headers.ratelimit;
    if (!ratelimit_header) {
        console.warn('No ratelimit header found!');
        return;
    }
    const limit_entries = ratelimit_header.split(',').map(entry => entry.trim());
    for (const entry of limit_entries) {
        const name_match = entry.match(/^([^;]+)/);
        const r_match = entry.match(/;r=(\d+)/);
        const t_match = entry.match(/;t=(\d+)/);
        if (!r_match || !t_match) {
            console.warn(`Invalid ratelimit format: ${entry}`);
            continue;
        }
        const limit_name = name_match ? name_match[1] : 'unknown_limit';
        const remaining_quantity = parse_int_safe(r_match[1]);
        const window_seconds = parse_int_safe(t_match[1]);
        if (remaining_quantity < 5) {
            const wait_time = window_seconds + 1;
            console.log(`Waiting ${wait_time} seconds due to ${limit_name} limit`);
            await sleep(wait_time);
        }
    }
}
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}`);
    }
}
(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...');
})()

Mantenha-se atualizado com as últimas notícias do Octo Browser

Ao clicar no botão, você concorda com a nossa Política de Privacidade.

Mantenha-se atualizado com as últimas notícias do Octo Browser

Ao clicar no botão, você concorda com a nossa Política de Privacidade.

Mantenha-se atualizado com as últimas notícias do Octo Browser

Ao clicar no botão, você concorda com a nossa Política de Privacidade.

Junte-se ao Octo Browser agora mesmo

Ou entre em contato com a equipe de suporte no chat para tirar dúvidas a qualquer momento.

Junte-se ao Octo Browser agora mesmo

Ou entre em contato com a equipe de suporte no chat para tirar dúvidas a qualquer momento.

Junte-se ao Octo Browser agora mesmo

Ou entre em contato com a equipe de suporte no chat para tirar dúvidas a qualquer momento.

©

2026

Octo Browser

©

2026

Octo Browser

©

2026

Octo Browser