Перейти до вмісту

API

Вступ

За допомогою API v1.5 в Undetectable ви зможете отримувати список профілів, створювати, запускати, оновлювати та закривати їх. Крім того, за допомогою отриманої інформації, в профілях на ядрі Chromium, ви зможете підключати різні засоби автоматизації, такі як Puppeteer, Playwright та інші.

Chromedriver для роботи з Selenium ви можете завантажити тут:
Windows
MacOS M series
MacOS Intel

Для роботи з API програма повинна бути запущена.

За замовчуванням, локальний сервер запускається на порту 25325, якщо цей порт зайнятий, то запуститься на іншому порту. В налаштуваннях програми ви можете переглянути порт і змінити його на потрібний.

Для звернення до локального серверу, використовуйте IP 127.0.0.1, localhost або локальний IP в межах вашої мережі і порт з налаштувань + шлях, який ви хочете виконати, наприклад http://localhost:25325/status.

Всі відповіді на API виглядають так:

{
"code": `<код статусу>`,
"status": `<статус>`,
"data": `<об'єкт результату>`,
}

де <код статусу> і <статус> відображають статус:

<код статусу><статус>Опис
0”success”успіх
1”error”помилка, <об'єкт результату> = {“error”:“опис помилки”}

<об'єкт результату> – різні дані, які надсилаються API, наприклад список профілів.

Помилки мають вигляд:

{
"code":1,
"status":"error",
"data":
{"error": "опис помилки"},
}

Запити

Статус

  • Шлях: /status
  • Метод: GET

Опис: Повертає статус локального сервера, чи працює він чи ні

Повернення даних
{
"code":0,
"status":"success",
"data":{},
}

Список профілів

  • Шлях: /list
  • Метод: GET

Опис: Повертає список профілів на браузері Chromium, доступних в програмі

Повернення даних
{
"code": 0,
"status": "success",
"data" {
"profile_id1": {
"name": "Profile1" // Ім'я профілю в програмі
"status": "Available", // статус профілю, може бути: "Started","Locked", "Available"
"debug_port": "xxxx", // debug port браузера, використовується для автоматизації (порожнє значення, якщо профіль не запущений). Тільки для браузера Chromium
"websocket_link": "ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // посилання на браузер, використовується для автоматизації (порожнє значення, якщо профіль не запущений). Тільки для браузера Chromium
"folder": "Name", // Ім'я папки профілю
"tags": ["tag1", "tag2", "tag3"], // Теги профілю
"cloud_id": "", // ID хмарного профілю
"creation_date": 123456789, // Дата створення Unix Timestamp
"modify_date": 123456789, // Дата модифікації Unix Timestamp
},
"profile_id2": {
},
},
}

Створення профілю

  • Шлях: /profile/create
  • Метод: POST

Опис: Створює профіль з обраними параметрами. Всі параметри є необов’язковими, їх може і не бути. Список браузерів для команди: Chrome, Edge, FireFox, IE, Opera, Safari, Yandex. Список ОС для команди: Windows, Windows 7, Windows 8, Windows 8.1, Windows 10, Android, iPhone, iPad, Linux, Mac. Якщо немає конфігурацій з обраною ОС або Браузером, то буде використовуватися випадковий тип ОС або Браузера
Формат: JSON

Параметри запиту:
{
"name": "профіль з випадковими налаштуваннями", // Ім'я профілю в програмі
"os": "Windows", // Конфігурацію з якою ОС використовувати
"browser": "Chrome", // Конфігурацію з яким Браузером використовувати
"cpu": 8, // Кількість ядер, можливі значення: 32, 24, 20, 16, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0
"memory": 8, // Кількість пам'яті, можливі значення: 8, 4, 2, 1, 0
"tags": ["тег1", "тег2"], // Встановити теги на профіль
"geolocation": "12.44, 13.524", // Встановити геолокацію, якщо ввести порожнє або некоректне значення, то будуть використовуватися налаштування за замовчуванням
"resolution": "1024x768", // Роздільна здатність екрану, можливі значення: "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", // Змінюємо проксі в профілі (проксі можуть бути http, https, socks5, можливі варіанти з логіном/паролем і без логіна/пароля)
"notes": "Текст", // Змінюємо нотатки в профілі
"folder": "тестоваПапка", // В якій папці буде профіль
"language": "ru-RU, en-US", // Можна встановити 2 мови
"cookies": [{}], // Імпортуємо кукі в профіль
"type": "cloud", // Тип профілю: cloud, local
"group": "прикладГрупи", // Якщо немає введеної групи, то бере з Налаштувань за замовчуванням, якщо є і вона не правильна виводить помилку
"configid": "id", // Config ID, якщо введено, то параметри OS і Browser ігноруються, решта параметрів за можливості, наприклад, якщо конфіг від Андроїд, то роздільна здатність екрану не зміниться
"accounts": [ // Імпортуємо аккаунти з різних сайтів в профіль
{"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 профілю
"name": "профіль з випадковими налаштуваннями" // Ім'я профілю в програмі
}
}

Запуск профілю

  • Шлях: /profile/start/<profileID>
  • Метод: GET

Опис: Запускає профіль з обраним <profileID>. В параметрах посилання ви можете додати параметри:

  • chrome_flags і передати будь-які прапори запуску, які захочете, тільки необхідно закодувати їх в URL encoding, наприклад: ?chrome_flags=—blink-settings%3DimagesEnabled%3Dfalse%20—disable-webgl2
  • start-pages і вказати стартові сторінки, тільки необхідно закодувати їх в URL encoding, наприклад: ?start-pages=https%3A%2F%2Fgoogle.com%2Chttps%3A%2F%2Fya.ru
Повернені дані
{
"code":0,
"status":"success",
"data":{
"name": "Profile1" // Ім'я профілю в програмі
"websocket_link":"ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // посилання на браузер, використовується для автоматизації (порожнє значення, якщо профіль не запущений). Тільки для браузера Chromium
"debug_port": "xxxx", // debug port браузера Chromium, використовується для автоматизації (порожнє значення, якщо профіль не запущений). Тільки для браузера Chromium
"folder": "Name", // Ім'я папки профілю
"tags": ["тег1", "тег2", "тег3"] // Теги профілю
},
}

Закриття профілю

  • Шлях: /profile/stop/<profileID>
  • Метод: GET

Опис: Зупиняє профіль з обраним <profileID>

Повернення даних:
{
"code": 0,
"status": "success",
"data": {}
}

Оновлення профілю

  • Шлях: /profile/update/<profileID>
  • Метод: POST

Опис: Оновлює інформацію в профілі з вказаним <profileID>. Всі параметри є необов’язковими і можуть бути відсутніми.
Формат: JSON

Параметри запиту:
{
"proxy": "socks5://127.0.0.1:5555:login:pass", // Змінюємо проксі в профілі (проксі можуть бути http, https, socks5, можливі варіанти з логіном/паролем та без логіна/пароля)
"notes": "Текст", // Змінюємо нотатки в профілі
"name": "Ім'я профілю", // Змінюємо ім'я профілю
"folder":"Тестова папка", // Змінюємо папку в профілі
"tags": ["тег1", "тег2"], // Встановлюємо теги для профілю, старі теги будуть перезаписані, якщо масив порожній, видалить всі теги з профілю
"geolocation": "12.44, 13.524", // Встановлюємо геолокацію, якщо ввести порожнє або некоректне значення, то буде використовувати налаштування за замовчуванням
"cookies":[{}], // Імпортуємо куки в профіль
"type": "cloud", // Тип профілю: cloud, local
"group": "приклад_групи", // Якщо групи не вказано, то бере з Налаштувань за замовчуванням, якщо вказана і вона неправильна, виводить помилку
"accounts": [ // Імпортуємо аккаунти з різних сайтів в профіль
{"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/delete/<profileID>
  • Метод: GET

Опис: Видаляє профіль з вибраним <profileID>

Повернення даних:
{
"code": 0,
"status": "success",
"data": {}
}

Очищення даних в профілі

  • Шлях: /profile/cleardata/<profileID>
  • Метод: GET

Опис: Очищає всі дані (куки, історія, нотатки, кеш і т.д.) профілю з вибраним <profileID>

Повернення даних:
{
"code": 0,
"status": "success",
"data": {}
}

Clear profile cookies

  • Path: /profile/clearcookies/<profileID>
  • Method: GET

Description: Clear only cookies from profile with selected <profileID>

Returning Data:
{
"code": 0,
"status": "success",
"data": {}
}

Куки профілю

  • Шлях: /profile/cookies/<profileID>
  • Метод: GET

Опис: Запитує куки профілю з вибраним <profileID>

Повернення даних:
{
"code": 0,
"status": "success",
"data": {}
}

Відправка в хмару

  • Шлях: /profile/tocloud
  • Метод: POST

Опис: Відправляє вибрані профілі в хмару
Формат: JSON

Параметри запиту:
{
"profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"],
"group": "test"
}
Повернення даних:
{
"code": 0,
"status": "success",
"data": {}
}

Зробити локальним

  • Шлях: /profile/tolocal
  • Метод: POST

Опис: Робить вибрані профілі локальними
Формат: JSON

Параметри запиту:
{
"profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"]
}
Повернення даних:
{
"code": 0,
"status": "success",
"data": {}
}

Оновлення версії браузера

  • Шлях: /profile/updatebrowser/<profileID>
  • Метод: GET

Опис: Оновлює версію браузера в профілі з вибраним <profileID>
Формат: JSON

Повернення даних:
{
"code": 0,
"status": "success",
"data": {}
}

Список конфігурацій

  • Шлях: /configslist
  • Метод: GET

Опис: Повертає список активних конфігурацій
Формат: JSON

Повернення даних:
{
"code":0,
"status":"success",
"data": {
"config_id1":
{
"os": "Windows 10" // Операційна система
"browser":"Chrome 115", // Тип браузера і версія
"useragent": "xxxx", // UserAgent в конфігурації
"webgl": "Apple GPU", // WebGL в конфігурації
"screen": "1024x768", // Роздільна здатність екрану
},
"config_id2":
{
},
},
}

Список груп

  • Шлях: /groupslist
  • Метод: GET

Опис: Повертає список груп
Формат: JSON

Повернення даних:
{
"code":0,
"status": "success",
"data": {["group1", "group2"]},
}

Інформація про профіль

  • Шлях: /profile/getinfo/<profileID>
  • Метод: GET

Опис: Запитує інформацію про профіль з обраним <profileID>
Формат: JSON

Повернення даних:
{
"code":0,
"status": "success",
"data": {
"name": "Profile1" // Ім'я профілю в програмі
"status": "Available", // статус профілю, може бути: "Started","Locked", "Available"
"debug_port": "xxxx", // debug port браузера, використовується для автоматизації (порожнє значення, якщо профіль не запущений)
"websocket_link": "ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // посилання на браузер, використовується для автоматизації (порожнє значення, якщо профіль не запущений)
"configid": "id" // Config ID
"cloud_id": ""
"type": "cloud" // Тип профілю: cloud, local
"proxy": "socks5://127.0.0.1:5555:login:pass", // Проксі профілю
"folder": "Name", // Ім'я папки профілю
"tags": ["tag1", "tag2", "tag3"], // Теги профілю
"notes": "Text", // Замітки профілю
"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 профілю
"browser": "Edge 114.0.1823.43", // Браузер профілю
"os": "Windows 10", // ОС профілю
"screen": "1366x768", // роздільна здатність екрану профілю
"language": "en-US,en;q=0.9,ak-GH;q=0.8,ak;q=0.7", // мова профілю
"cpu": 8, // Кількість ядер
"memory": 4, // Кількість пам'яті
"creation_date": 123456789, // Дата створення Unix Timestamp
"modify_date": 123456789, // Дата модифікації Unix Timestamp
},
}

Check IP

  • Path: /profile/getinfo/<profileID>
  • Method: GET

Description: Checks the connection in the profile with the selected , if the check fails, an error is returned
Format: JSON

Returning Data:
{
"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

Returning Data:
{
"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

Returning Data:
{
"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

Request parameters:
{
"name": "Proxy1",
"type": "http",
"host": "127.0.0.1",
"port": "2222",
"login": "12345",
"password": "12345",
"ipchangelink": ""
}
Returning Data:
{
"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

Returning Data:
{
"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

Request parameters:
{
"name": "Proxy1",
"type": "http",
"host": "127.0.0.1",
"port": "2222",
"login": "12345",
"password": "12345",
"ipchangelink": ""
}
Returning Data:
{
"code": 0,
"status": "success",
"data": {
}
}

Приклади

Puppeteer (Node.js)

Node.js Puppeteer Запуск профілю з певним ім’ям і відкриття сторінки undetectable.io в цьому профілі:

const puppeteer = require('puppeteer');
const axios = require('axios');
const port = 25325; // Порт
const ip = '127.0.0.1'; // Локальний IP
const profileName = ‘TestProfile; // Ім'я профілю
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) {
///// Старт конкретного профілю і перехід на сторінку
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 Запуск профілів, що знаходяться в певній папці і відкриття кількох сайтів:

from time import sleep
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
address = "127.0.0.1" # Локальна IP-адреса API (якщо ви працюєте з іншого комп'ютера в тій же мережі або порт відкритий в налаштуваннях маршрутизатора, ви можете отримати доступ до локального API віддалено, і цю адресу потрібно буде змінити)
port_from_settings_browser = '25325' # Порт локального API (можна знайти в налаштуваннях програми)
chrome_driver_path = "chromedriver.exe" # Шлях до chromedriver для v110
ser = Service(chrome_driver_path)
chrome_options = Options()
list_response = requests.get(f'http://{address}:{port_from_settings_browser}/list').json()['data'] # Відправляємо запит до локального API для отримання списку профілів
profile_id = ''
for key, value in list_response.items(): # Проходимо по списку профілів і запускаємо їх по одному
if value['folder'] == 'test': # Тут можна додати перевірку, щоб запускати лише потрібні профілі (у цьому прикладі ми запускаємо профілі, які знаходяться в папці 'test')
profile_id = key
if value['status'] == 'Available': # Якщо профіль не запущений, то запускаємо профіль і отримуємо debug_port
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': # Якщо профіль запущений, то просто беремо debug_port з доступних даних
debug_port = value['debug_port']
if value['status'] == 'Locked': # Якщо профіль заблокований, то пропускаємо його
continue
if debug_port: # Перевіряємо, чи є у браузері порт підключення (у профілів WebEngine немає портів, тому ми відразу їх закриваємо)
chrome_options.debugger_address = f'{address}:{debug_port}'
driver = webdriver.Chrome(service=ser, options=chrome_options)
driver.get("https://whoer.net/") # Відкриваємо whoer.net в активній вкладці
driver.switch_to.new_window('tab') # Створюємо нову вкладку і переключаємося на неї
driver.get(url='https://browserleaks.com/js') # Відкриваємо browserleaks.com/js в активній вкладці
# Тут можна додати будь-які інші дії
sleep(5) # Чекаємо 5 секунд
requests.get(f'http://{address}:{port_from_settings_browser}/profile/stop/{profile_id}') # Зупиняємо профіль