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 code>`,"status": `<status>`,"data": `<return object>`,}где <status code> и <status> отражают статус:
|
| Описание |
|---|---|---|
0 | "success" | успех |
1 | "error" | ошибка, |
<return object> – различные данные отправляемые API, например список профилей.
Ошибки имеют вид:
{ "code":1, "status":"error", "data": {"error": "error description"},}Запросы
Заголовок раздела «Запросы»- Path:
/status - Method: GET
Description: Возвращает статус локального сервера, работает он или нет
{ "code":0, "status":"success", "data":{},}Список профилей
Заголовок раздела «Список профилей»- Path:
/list - Method: GET
Description: Возвращает список профилей на браузере 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": { …}, … },}Создание профиля
Заголовок раздела «Создание профиля»- Path:
/profile/create - Method: POST
Description: Создаёт профиль с выбранными параметрами. Все параметры являются необязательными, их может и не быть. Список браузеров для команды: Chrome, Edge, FireFox, IE, Opera, Safari, Yandex. Список ОС для команды: Windows, Windows 7, Windows 8, Windows 8.1, Windows 10, Android, iPhone, iPad, Linux, Mac. Если нет конфигураций с выбранным ОС или Браузером, то будет использоваться случайный тип ОС или Браузера
Format: JSON
{ "name": "profile with random settings", // Имя профиля в программе "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": ["tag1", "tag2"], // Установить теги на профиль "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, возможны варианты с логином/паролем и без логина/пароля). Так же можно использовать ProxyID "notes": "Text", // Меняем заметки в профиле "folder": "testFolder", // В какой папке будет профиль "language": "ru-RU, en-US", // Можно установить 2 языка "cookies": [{}], // Импортируем куки в профиль "type": "cloud", // Тип профиля: cloud, local "group": "group_example", // Если нет введенной группы, то берет из Настроек по умолчанию, если есть и она не правильная выводит ошибку "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") // установить часовой пояс или режим подмены часового пояса}{ "code": 0, "status": "success", "data": { "profile_id": "xxxxxxxx...", // Уникальный ID профиля "name": "profile with random settings" // Имя профиля в программе }}Запуск профиля
Заголовок раздела «Запуск профиля»- Path:
/profile/start/<profileID> - Method: GET
Description: Запускает профиль с выбранным <profileID>. В параметрах ссылки вы можете добавить параметры:
- chrome_flags и передать любые флаги запуска, которые захотите, только необходимо закодировать их в URL encoding, к примеру:
?chrome_flags=--blink-settings%3DimagesEnabled%3Dfalse%20--disable-webgl2?chrome_flags=--headless%3Dnew
- 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": ["tag1", "tag2", "tag3"] // Теги профиля },}Закрытие профиля
Заголовок раздела «Закрытие профиля»- Path:
/profile/stop/<profileID> - Method: GET
Description: Останавливает профиль с выбранным <profileID>
{ "code": 0, "status": "success", "data": {}}Обновление профиля
Заголовок раздела «Обновление профиля»- Path:
/profile/update/<profileID> - Method: POST
Description: Обновляет информацию в профиле с нужным <profileID>. Все параметры являются необязательными, их может и не быть
Format: JSON
{ "proxy": "socks5://127.0.0.1:5555:login:pass", // Меняем прокси в профиле (прокси могут быть http, https, socks5, возможны варианты с логином/паролем и без логина/пароля). Так же можно использовать ProxyID "notes": "Text", // Меняем заметки в профиле "name": "Profile Name", // Меняем имя профиля "folder":"TestFolder", // Меняем папку в профиле "tags": ["tag1", "tag2"], // Установить теги на профиль, старые теги будут перезаписаны, если массив пустой, удалит все теги с профиля "geolocation": "12.44, 13.524", // Установить геолокацию, если вбить пустое или некорректное значение, то будет брать настройки по умолчанию "cookies":[{}], // Импортируем куки в профиль "type": "cloud", // Тип профиля: cloud, local "group": "group_example", // Если нет введенной группы, то берет из Настроек по умолчанию, если есть и она не правильная выводит ошибку "accounts": [ // Импортируем аккаунты от разных сайтов в профиль {"website": "facebook.com", "username": "test@gmail.com", "password": "123456"}, {"website": "mail.com","username": "test@gmail.com","password": "123456"} ], "timezone": "Pacific/Niue" ("Auto", "System") // установить часовой пояс или режим подмены часового пояса}{ "code": 0, "status": "success", "data": {}}Удаление профиля
Заголовок раздела «Удаление профиля»- Path:
/profile/delete/<profileID> - Method: GET
Description: Удаляет профиль с выбранным <profileID>
{ "code": 0, "status": "success", "data": {}}Очистка данных в профиле
Заголовок раздела «Очистка данных в профиле»- Path:
/profile/cleardata/<profileID> - Method: GET
Description: Очищает все данные (куки, история, заметки, кэш и т.п.) профиля с выбранным <profileID>
{ "code": 0, "status": "success", "data": {}}Очистка куки в профиле
Заголовок раздела «Очистка куки в профиле»- Path:
/profile/clearcookies/<profileID> - Method: GET
Description: Очищает только куки профиля с выбранным <profileID>
{ "code": 0, "status": "success", "data": {}}Очистка кеша в профиле
Заголовок раздела «Очистка кеша в профиле»- Path:
/profile/clearcache/<profileID> - Method: GET
Description: Очищает только кеш профиля с выбранным <profileID>
{ "code": 0, "status": "success", "data": {}}Куки профиля
Заголовок раздела «Куки профиля»- Path:
/profile/cookies/<profileID> - Method: GET
Description: Запрашивает куки профиля с выбранным <profileID>
{ "code": 0, "status": "success", "data": {}}Отправка в облако
Заголовок раздела «Отправка в облако»- Path:
/profile/tocloud - Method: POST
Description: Отправляет выбранные профили в облако
Format: JSON
{ "profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"], "group": "test"}{ "code": 0, "status": "success", "data": {}}Сделать локальным
Заголовок раздела «Сделать локальным»- Path:
/profile/tolocal - Method: POST
Description: Делает выбранные профили локальными
Format: JSON
{ "profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"]}{ "code": 0, "status": "success", "data": {}}Обновлени версии браузера
Заголовок раздела «Обновлени версии браузера»- Path:
/profile/updatebrowser/<profileID> - Method: GET
Description: Обновляет версию браузера в профиле с выбранным <profileID>
Format: JSON
{ "code": 0, "status": "success", "data": {}}Список конфигураций
Заголовок раздела «Список конфигураций»- Path:
/configslist - Method: GET
Description: Возвращает список активных конфигураций
Format: 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": { … }, … },}Список групп
Заголовок раздела «Список групп»- Path:
/groupslist - Method: GET
Description: Возвращает список групп
Format: JSON
{ "code":0, "status": "success", "data": {["group1", "group2"]},}Информация о профиле
Заголовок раздела «Информация о профиле»- Path:
/profile/getinfo/<profileID> - Method: GET
Description: Запрашивает информацию о профиле с выбранным <profileID>
Format: 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 },}Проверка IP
Заголовок раздела «Проверка IP»- Path:
/profile/checkconnection/<profileID> - Method: GET
Description: Проверяет соединение в профиле с выбранном , если проверка не прошла, то возвращается ошибка
Format: JSON
{ "code": 0, "status": "success", "data": { "ip": "127.0.0.1" // Возвращает IP адрес в данном профиле }}Список часовых поясов
Заголовок раздела «Список часовых поясов»- Path:
/timezoneslist - Method: GET
Description: Возвращает список часовых поясов
Format: JSON
{ "code":0, "status": "success", "data": { "Pacific/Niue": "GMT-11:00", "America/Cambridge_Bay": "GMT-7:00", ... },}Список прокси
Заголовок раздела «Список прокси»- Path:
/proxies/list - Method: GET
Description: Возвращает список прокси
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": { … }, … }}Добавить прокси
Заголовок раздела «Добавить прокси»- Path:
/proxies/add - Method: POST
Description: Добавить прокси в прокси менеджер, параметры login, password, ipchangelink не обязательные
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" }}Удалить прокси
Заголовок раздела «Удалить прокси»- Path:
/proxies/delete/<ProxyID> - Method: GET
Description: Удаляет прокси с выбранным ProxyID. У всех профилей слетят данные прокси, так же, как и при обычном удалении из менеджера
Format: JSON
{ "code": 0, "status": "success", "data": {}}Обновить прокси
Заголовок раздела «Обновить прокси»- Path:
/proxies/update/<ProxyID> - Method: POST
Description: Обновляем прокси с выбранным ProxyID, все параметры не обязательны
Format: JSON
{ "name": "Proxy1", "type": "http", "host": "127.0.0.1", "port": "2222", "login": "12345", "password": "12345", "ipchangelink": ""}{ "code": 0, "status": "success", "data": {}}Примеры
Заголовок раздела «Примеры»Puppeteer (Node.js)
Заголовок раздела «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'; // Локальный IPconst 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)
Заголовок раздела «Selenium (Python)»Python + Selenium Запуск профилей, находящихся в определенной папке и открытие нескольких сайтов:
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" # Локальный IP-адрес API (если вы работаете с другого компьютера в той же сети или порт открыт в настройках маршрутизатора, вы можете получить доступ к локальному API удаленно, и этот адрес нужно будет изменить)port_from_settings_browser = '25325' # Порт локального API (можно найти в настройках программы)chrome_driver_path = "chromedriver.exe" # Путь к chromedriver для v110ser = 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}') # Останавливаем профиль