LOCAL API v1.2
Введение
С помощью API v1.2 в Undetectable вы сможете получать список профилей, создавать, запускать, обновлять и закрывать их. Кроме того, с помощью полученной информации, в профилях на ядре Chromium, вы сможете подключать различные средства автоматизации, такие как Puppeteer, Playwright и др.
Chromedriver для работы с Selenium вы можете скачать тут.
Для работы с 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>
отражают статус:
<status code> | <status> | Описание |
---|---|---|
0 | "success" | успех |
1 | "error" | ошибка, <return object> = {“error”:”error description”} |
<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"] // Теги профиля
},
"profile_id2": {
…},
…
},
}
Path: /profile/create
Method: POST
Description: Создаёт профиль с выбранными параметрами. Все параметры являются необязательными, их может и не быть. Список браузеров для команды: Chrome, Edge, FireFox, IE, Opera, Safari, Yandex. Список ОС для команды: Windows, Android, iPhone, iPad, Linux, Mac. Если нет конфигураций с выбранным ОС или Браузером, то будет использоваться случайный тип ОС или Браузера
Format: JSON
{
"name": "profile with random settings", // Имя профиля в программе
"os": "Windows", // Конфигурацию с какой ОС использовать
"browser": "Chrome", // Конфигурацию с каким Браузером использовать
"proxy": "socks5://127.0.0.1:5555:login:pass", // Меняем прокси в профиле (прокси могут быть http, https, socks5, возможны варианты с логином/паролем и без логина/пароля)
"notes": "Text", // Меняем заметки в профиле
"folder": "testFolder", // В какой папке будет профиль
"cookies": [{}] // Импортируем куки в профиль
}
{
"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
{
"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, возможны варианты с логином/паролем и без логина/пароля)
"notes": "Text", // Меняем заметки в профиле
"name": "Profile Name", // Меняем имя профиля
"folder":"TestFolder", // Меняем папку в профиле
"cookies":[{}] // Импортируем куки в профиль
}
{
"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/cookies/<profileID>
Method: GET
Description: Запрашивает куки профиля с выбранным <profileID>
{
"code": 0,
"status": "success",
"data": {}
}
Примеры
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);
});
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" # Local API IP address (if you work from another PC on the same network or a port is open in the router settings, you can access the local API remotely and this address will need to be changed)
port_from_settings_browser = '25325' # Local API port (can be found in the program settings)
chrome_driver_path = "chromedriver.exe" # Path to chromedriver for v110
ser = Service(chrome_driver_path)
chrome_options = Options()
list_response = requests.get(f'http://{address}:{port_from_settings_browser}/list').json()['data'] # Send a request to the local API to get a list of profiles
profile_id = ''
for key, value in list_response.items(): # Loop through the list of profiles and run them one by one
if value['folder'] == 'test': # Here you can add a check to run only the profiles you need (in this example, we run the profiles that are in the 'test' folder)
profile_id = key
if value['status'] == 'Available': # If the profile is not running, then run the profile and take the 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': # If the profile is running, then we simply take the debug_port from the available data
debug_port = value['debug_port']
if value['status'] == 'Locked': # If the profile is Locked, then skip
continue
if debug_port: # We check if the browser has a connection port (WebEngine profiles doesnt have ports, so we close them immediately)
chrome_options.debugger_address = f'{address}:{debug_port}'
driver = webdriver.Chrome(service=ser, options=chrome_options, executable_path=chrome_driver_path)
driver.get("https://whoer.net/") # Open whoer.net in active tab
driver.switch_to.new_window('tab') # Create a new tab and switch to it
driver.get(url='https://browserleaks.com/js') # Open browserleaks.com/js in active tab
# You can add any other actions here
sleep(5) # Wait 5 sec
requests.get(f'http://{address}:{port_from_settings_browser}/profile/stop/{profile_id}') # Stop profile