API
Introdução
Com a API v1.5 do Undetectable, você poderá obter uma lista de perfis, criar, iniciar, atualizar e fechar perfis. Além disso, com as informações obtidas nos perfis baseados no núcleo do Chromium, você poderá conectar várias ferramentas de automação, como Puppeteer, Playwright, entre outras.
Você pode baixar o Chromedriver para trabalhar com o Selenium aqui:
Windows
MacOS M series
MacOS Intel
O programa deve estar em execução para usar a API.
Por padrão, o servidor local é executado na porta 25325. Se essa porta estiver ocupada, ele será executado em outra porta. Você pode verificar a porta nas configurações do programa e alterá-la, se necessário.
Para acessar o servidor local, use o IP 127.0.0.1, localhost ou o IP local dentro da sua rede, juntamente com a porta das configurações e o caminho que deseja executar, por exemplo, http://localhost:25325/status
.
Todas as respostas da API têm o seguinte formato:
{"code": `<código de status>`,"status": `<status>`,"data": `<objeto de retorno>`,}
onde <código de status>
e <status>
refletem o status:
<código de status> | <status> | Descrição |
---|---|---|
0 | ”success” | sucesso |
1 | ”error” | erro, <objeto de retorno> = {“error”:“descrição do erro”} |
<objeto de retorno>
- vários dados enviados pela API, como uma lista de perfis.
Os erros têm o seguinte formato:
{ "code":1, "status":"error", "data": {"error": "descrição do erro"},}
Requisições
Status
- Caminho:
/status
- Método: GET
Descrição: Retorna o status do servidor local, se ele está funcionando ou não.
{ "code":0, "status":"success", "data":{},}
Lista de perfis
- Caminho:
/list
- Método: GET
Descrição: Retorna uma lista de perfis no navegador Chromium disponíveis no programa.
{ "code": 0, "status": "success", "data" { "profile_id1": { "name": "Perfil1" // Nome do perfil no programa "status": "Disponível", // status do perfil, pode ser: "Iniciado", "Bloqueado", "Disponível" "debug_port": "xxxx", // porta de depuração do navegador, usada para automação (valor vazio se o perfil não estiver em execução). Apenas para o navegador Chromium "websocket_link": "ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // link para o navegador, usado para automação (valor vazio se o perfil não estiver em execução). Apenas para o navegador Chromium "folder": "Nome", // Nome da pasta do perfil "tags": ["tag1", "tag2", "tag3"], // Tags do perfil "cloud_id": "", // ID do perfil na nuvem "creation_date": 123456789, // Data de criação em formato Unix Timestamp "modify_date": 123456789, // Data de modificação em formato Unix Timestamp }, "profile_id2": { …}, … },}
Criação de perfil
- Caminho:
/profile/create
- Método: POST
Descrição: Cria um perfil com os parâmetros selecionados. Todos os parâmetros são opcionais e podem ser omitidos. A lista de navegadores para o comando: Chrome, Edge, FireFox, IE, Opera, Safari, Yandex. A lista de sistemas operacionais para o comando: Windows, Windows 7, Windows 8, Windows 8.1, Windows 10, Android, iPhone, iPad, Linux, Mac. Se não houver configurações com o sistema operacional ou navegador selecionado, um tipo aleatório de sistema operacional ou navegador será usado.
Formato: JSON
{ "name": "perfil com configurações aleatórias", // Nome do perfil no programa "os": "Windows", // Configuração do sistema operacional a ser usado "browser": "Chrome", // Configuração do navegador a ser usado "cpu": 8, // Número de núcleos, valores possíveis: 32, 24, 20, 16, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0 "memory": 8, // Quantidade de memória, valores possíveis: 8, 4, 2, 1, 0 "tags": ["tag1", "tag2"], // Definir tags para o perfil "geolocation": "12.44, 13.524", // Definir geolocalização, se inserir um valor vazio ou incorreto, as configurações padrão serão usadas "resolution": "1024x768", // Resolução da tela, valores possíveis: "800x600", "960x540", "1024x768", "1152x864", "1280x720", "1280x768", "1280x800", "1280x1024", "1366x768", "1408x792", "1440x900", "1400x1050", "1440x1080", "1536x864", "1600x900", "1600x1024", "1600x1200", "1680x1050", "1920x1080", "1920x1200", "2048x1152", "2560x1080", "2560x1440", "3440x1440", "3840x2160", "5120x1440" "proxy": "socks5://127.0.0.1:5555:login:pass", // Alterar o proxy no perfil (os proxies podem ser http, https, socks5, podem ter login/senha ou não) "notes": "Texto", // Alterar as notas no perfil "folder": "testFolder", // Em qual pasta o perfil será criado "language": "ru-RU, en-US", // É possível definir 2 idiomas "cookies": [{}], // Importar cookies para o perfil "type": "cloud", // Tipo de perfil: cloud, local "group": "group_example", // Se nenhum grupo for inserido, ele usará as configurações padrão, se houver um grupo inserido e ele for inválido, será exibido um erro "configid": "id", // ID da configuração, se inserido, os parâmetros OS e Browser serão ignorados, os outros parâmetros serão usados se possível, por exemplo, se a configuração for para Android, a resolução da tela não será alterada "accounts": [ // Importar contas de diferentes sites para o perfil {"website": "facebook.com", "username": "test@gmail.com", "password": "123456"}, {"website": "mail.com","username": "test@gmail.com","password": "123456"} ], "timezone": "Pacific/Niue" ("Auto", "System") // set timezone or timezone mode}
{ "code": 0, "status": "success", "data": { "profile_id": "xxxxxxxx...", // ID exclusivo do perfil "name": "perfil com configurações aleatórias" // Nome do perfil no programa }}
Iniciar perfil
- Caminho:
/profile/start/<profileID>
- Método: GET
Descrição: Inicia o perfil com o <profileID>
selecionado. Você pode adicionar parâmetros à URL:
- chrome_flags e passar quaisquer flags de inicialização que desejar, apenas certifique-se de codificá-las em URL encoding, por exemplo: ?chrome_flags=—blink-settings%3DimagesEnabled%3Dfalse%20—disable-webgl2
- start-pages e especificar as páginas de inicialização, apenas certifique-se de codificá-las em URL encoding, por exemplo: ?start-pages=https%3A%2F%2Fgoogle.com%2Chttps%3A%2F%2Fya.ru
{ "code":0, "status":"success", "data":{ "name": "Perfil1" // Nome do perfil no programa "websocket_link":"ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // link para o navegador, usado para automação (valor vazio se o perfil não estiver em execução). Apenas para navegadores Chromium "debug_port": "xxxx", // porta de depuração do navegador Chromium, usada para automação (valor vazio se o perfil não estiver em execução). Apenas para navegadores Chromium "folder": "Nome", // Nome da pasta do perfil "tags": ["tag1", "tag2", "tag3"] // Tags do perfil },}
Encerrar perfil
- Caminho:
/profile/stop/<profileID>
- Método: GET
Descrição: Encerra o perfil com o <profileID>
selecionado
{ "code": 0, "status": "sucesso", "data": {}}
Atualizar Perfil
- Caminho:
/perfil/atualizar/<IDdoPerfil>
- Método: POST
Descrição: Atualiza as informações no perfil com o <IDdoPerfil>
fornecido. Todos os parâmetros são opcionais e podem não estar presentes.
Formato: JSON
{ "proxy": "socks5://127.0.0.1:5555:login:senha", // Altera o proxy no perfil (os proxies podem ser http, https, socks5, com ou sem login/senha) "notas": "Texto", // Altera as notas no perfil "nome": "Nome do Perfil", // Altera o nome do perfil "pasta":"Pasta de Teste", // Altera a pasta no perfil "tags": ["tag1", "tag2"], // Define tags para o perfil, as tags antigas serão substituídas, se a matriz estiver vazia, todas as tags serão removidas do perfil "geolocalizacao": "12.44, 13.524", // Define a geolocalização, se um valor vazio ou incorreto for inserido, as configurações padrão serão usadas "cookies":[{}], // Importa cookies para o perfil "tipo": "nuvem", // Tipo de perfil: nuvem, local "grupo": "exemplo_de_grupo", // Se nenhum grupo for fornecido, ele será obtido nas Configurações Padrão, se um grupo inválido for fornecido, um erro será retornado "contas": [ // Importa contas de diferentes sites para o perfil {"website": "facebook.com", "username": "test@gmail.com", "password": "123456"}, {"website": "mail.com","username": "test@gmail.com","password": "123456"} ], "timezone": "Pacific/Niue" ("Auto", "System") // set timezone or timezone mode}
{ "code": 0, "status": "sucesso", "data": {}}
Excluir Perfil
- Caminho:
/perfil/excluir/<IDdoPerfil>
- Método: GET
Descrição: Exclui o perfil com o <IDdoPerfil>
fornecido.
{ "code": 0, "status": "sucesso", "data": {}}
Limpar Dados do Perfil
- Caminho:
/perfil/limpardados/<IDdoPerfil>
- Método: GET
Descrição: Limpa todos os dados (cookies, histórico, notas, cache, etc.) do perfil com o <IDdoPerfil>
fornecido.
{ "code": 0, "status": "sucesso", "data": {}}
Clear profile cookies
- Path:
/profile/clearcookies/<profileID>
- Method: GET
Description: Clear only cookies from profile with selected <profileID>
{ "code": 0, "status": "success", "data": {}}
Cookies do Perfil
- Caminho:
/perfil/cookies/<IDdoPerfil>
- Método: GET
Descrição: Retorna os cookies do perfil com o <IDdoPerfil>
fornecido.
{ "code": 0, "status": "sucesso", "data": {}}
Enviar para a Nuvem
- Caminho:
/perfil/paranuvem
- Método: POST
Descrição: Envia os perfis selecionados para a nuvem.
Formato: JSON
{ "perfis": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"]}
{ "code": 0, "status": "sucesso", "data": {}}
Tornar Local
- Caminho:
/perfil/paralocal
- Método: POST
Descrição: Torna os perfis selecionados locais.
Formato: JSON
{ "perfis": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"], "group": "test"}
{ "code": 0, "status": "sucesso", "data": {}}
Atualizar Versão do Navegador
- Caminho:
/perfil/atualizarversaonavegador/<IDdoPerfil>
- Método: GET
Descrição: Atualiza a versão do navegador no perfil com o <IDdoPerfil>
fornecido.
Formato: JSON
{ "code": 0, "status": "sucesso", "data": {}}
Lista de Configurações
- Caminho:
/listadeconfiguracoes
- Método: GET
Descrição: Retorna a lista de configurações ativas.
Formato: JSON
{ "code":0, "status":"success", "data": { "config_id1": { "os": "Windows 10" // Sistema operacional "browser":"Chrome 115", // Tipo e versão do navegador "useragent": "xxxx", // UserAgent na configuração "webgl": "Apple GPU", // WebGL na configuração "screen": "1024x768", // Resolução da tela }, "config_id2": { … }, … },
}
Lista de grupos
- Caminho:
/groupslist
- Método: GET
Descrição: Retorna uma lista de grupos
Formato: JSON
{ "code":0, "status": "success", "data": {["group1", "group2"]},}
Informações do perfil
- Caminho:
/profile/checkconnection/<profileID>
- Método: GET
Descrição: Solicita informações sobre o perfil com o <profileID>
selecionado
Formato: JSON
{ "code":0, "status": "success", "data": { "name": "Profile1" // Nome do perfil no programa "status": "Disponível", // status do perfil, pode ser: "Iniciado", "Bloqueado", "Disponível" "debug_port": "xxxx", // porta de depuração do navegador, usada para automação (valor vazio se o perfil não estiver em execução) "websocket_link": "ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // link para o navegador, usado para automação (valor vazio se o perfil não estiver em execução) "configid": "id" // ID da configuração "cloud_id": "" "type": "cloud" // Tipo de perfil: cloud, local "proxy": "socks5://127.0.0.1:5555:login:pass", // Proxy do perfil "folder": "Nome", // Nome da pasta do perfil "tags": ["tag1", "tag2", "tag3"], // Tags do perfil "notes": "Texto", // Notas do perfil "useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43", // useragent do perfil "browser": "Edge 114.0.1823.43", // Navegador do perfil "os": "Windows 10", // Sistema operacional do perfil "screen": "1366x768", // Resolução da tela do perfil "language": "en-US,en;q=0.9,ak-GH;q=0.8,ak;q=0.7", // idioma do perfil "cpu": 8, // Número de núcleos "memory": 4, // Quantidade de memória "creation_date": 123456789, // Data de criação do Unix Timestamp "modify_date": 123456789, // Data de modificação do Unix Timestamp },}
Check IP
- Path:
/profile/getinfo/<profileID>
- Method: GET
Description: Checks the connection in the profile with the selected
Format: JSON
{ "code":0, "status": "success", "data": { "ip": "127.0.0.1" // Returns the IP address in this profile }}
Get timezones list
- Path:
/timezoneslist
- Method: GET
Description: Returning timezones list
Format: JSON
{ "code":0, "status": "success", "data": { "Pacific/Niue": "GMT-11:00", "America/Cambridge_Bay": "GMT-7:00", ... },}
Get proxies list
- Path:
/proxies/list
- Method: GET
Description: Returning proxies list
Format: JSON
{ "code":0, "status": "success", "data": { "proxy_id1": { "name": "Proxy1" "type": "http", "host": "127.0.0.1", "port": "2222", "login": "12345", "password": "12345", "ipchangelink": "", } "proxy_id2": { … }, … }}
Add proxy
- Path:
/proxies/add
- Method: POST
Description: Add a proxy to the proxy manager, the parameters login, password, ipchangelink are optional, the rest are required
Format: JSON
{ "name": "Proxy1", "type": "http", "host": "127.0.0.1", "port": "2222", "login": "12345", "password": "12345", "ipchangelink": ""}
{ "code": 0, "status": "success", "data": { "proxy_id": "12345" }}
Delete proxy
- Path:
/proxies/delete/<ProxyID>
- Method: GET
Description: Removes a proxy with the selected ID. Proxy will be deleted for all profiles with that proxy, the same as during normal deletion from the manager
Format: JSON
{ "code":0, "status":"success", "data": { },}
Update proxy
- Path:
/proxies/update/<ProxyID>
- Method: POST
Description: Updates the proxy with the selected ID, all parameters are optional
Format: JSON
{ "name": "Proxy1", "type": "http", "host": "127.0.0.1", "port": "2222", "login": "12345", "password": "12345", "ipchangelink": ""}
{ "code": 0, "status": "success", "data": { }}
Exemplos
Puppeteer (Node.js)
Node.js Puppeteer Iniciar um perfil com um nome específico e abrir a página undetectable.io nesse perfil:
const puppeteer = require('puppeteer');const axios = require('axios');
const port = 25325; // Portaconst ip = '127.0.0.1'; // IP localconst profileName = ‘TestProfile’; // Nome do perfil
const sleep = (ms) => { return new Promise((resolve) => setTimeout(resolve, ms));};
axios.get('http://' + ip + ':' + port + '/status').then(response => { if (response.data.code == 0) { axios.get('http://' + ip + ':' + port + '/list').then(async response => {
for (var profile in response.data.data) { ///// Iniciar um perfil específico e navegar para a página if (response.data.data[profile].name == profileName ) { axios.get('http://' + ip + ':' + port + '/profile/start/' + profile).then(async response => { try { const browser = await puppeteer.connect({ browserWSEndpoint: response.data.data.websocket_link, defaultViewport: null }); const page = await browser.newPage(); await sleep(1000); await page.goto('https://undetectable.io'); } catch (e) { console.log(e); } }) .catch(error => { console.log(error); }); } } }) .catch(error => { console.log(error); }); }}).catch(error => { console.log(error);});
Selenium (Python)
Python + Selenium Iniciar perfis em uma determinada pasta e abrir vários sites:
from time import sleepimport requestsfrom selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.chrome.service import Service
address = "127.0.0.1" # Endereço IP local da API (se você estiver trabalhando em outro computador na mesma rede ou a porta estiver aberta nas configurações do roteador, você poderá acessar a API localmente e precisará alterar este endereço)port_from_settings_browser = '25325' # Porta da API local (pode ser encontrada nas configurações do programa)chrome_driver_path = "chromedriver.exe" # Caminho para o chromedriver v110ser = Service(chrome_driver_path)chrome_options = Options()list_response = requests.get(f'http://{address}:{port_from_settings_browser}/list').json()['data'] # Envia uma solicitação para a API local para obter a lista de perfisprofile_id = ''
for key, value in list_response.items(): # Percorre a lista de perfis e os inicia um por um if value['folder'] == 'test': # Aqui você pode adicionar uma verificação para iniciar apenas os perfis desejados (neste exemplo, estamos iniciando os perfis que estão na pasta 'test') profile_id = key if value['status'] == 'Available': # Se o perfil não estiver em execução, inicia o perfil e obtém a porta de depuração start_profile_response = requests.get(f'http://{address}:{port_from_settings_browser}/profile/start/{profile_id}', timeout=5).json()['data'] debug_port = start_profile_response['debug_port'] if value['status'] == 'Started': # Se o perfil estiver em execução, simplesmente pega a porta de depuração dos dados disponíveis debug_port = value['debug_port'] if value['status'] == 'Locked': # Se o perfil estiver bloqueado, pula para o próximo continue if debug_port: # Verifica se o navegador possui uma porta de conexão (os perfis WebEngine não possuem portas, então os fechamos imediatamente) chrome_options.debugger_address = f'{address}:{debug_port}' driver = webdriver.Chrome(service=ser, options=chrome_options) driver.get("https://whoer.net/") # Abre o whoer.net na guia ativa driver.switch_to.new_window('tab') # Cria uma nova guia e muda para ela driver.get(url='https://browserleaks.com/js') # Abre o browserleaks.com/js na guia ativa # Aqui você pode adicionar qualquer outra ação sleep(5) # Aguarda 5 segundos requests.get(f'http://{address}:{port_from_settings_browser}/profile/stop/{profile_id}') # Interrompe o perfil