Bỏ qua đến nội dung

API

Giới thiệu

Với API v1.5 trong Undetectable, bạn có thể nhận danh sách các hồ sơ, tạo, chạy, cập nhật và đóng chúng. Ngoài ra, với thông tin nhận được, bạn có thể kết nối các công cụ tự động hóa khác nhau như Puppeteer, Playwright và các công cụ khác vào các hồ sơ trên nhân Chromium.

Bạn có thể tải Chromedriver để làm việc với Selenium tại đây:
Windows
MacOS M series
MacOS Intel

Chương trình phải được chạy để làm việc với API.

Mặc định, máy chủ cục bộ được chạy trên cổng 25325, nếu cổng này đã được sử dụng, máy chủ sẽ được chạy trên cổng khác. Bạn có thể xem và thay đổi cổng trong cài đặt của chương trình.

Để truy cập vào máy chủ cục bộ, hãy sử dụng IP 127.0.0.1, localhost hoặc IP cục bộ trong mạng của bạn và cộng thêm cổng từ cài đặt + đường dẫn bạn muốn thực hiện, ví dụ: http://localhost:25325/status.

Tất cả các phản hồi từ API có dạng:

{
"code": `<status code>`,
"status": `<status>`,
"data": `<return object>`,
}

trong đó <status code><status> phản ánh trạng thái:

<status code><status>Mô tả
0”success”thành công
1”error”lỗi, <return object> = {“error”:“mô tả lỗi”}

<return object> - các dữ liệu khác nhau được gửi qua API, ví dụ danh sách các hồ sơ.

Các lỗi có dạng:

{
"code":1,
"status":"error",
"data":
{"error": "mô tả lỗi"},
}

Các yêu cầu

Trạng thái

  • Đường dẫn: /status
  • Phương thức: GET

Mô tả: Trả về trạng thái của máy chủ cục bộ, xem nó có hoạt động hay không

Dữ liệu trả về
{
"code":0,
"status":"success",
"data":{},
}

Danh sách các hồ sơ

  • Đường dẫn: /list
  • Phương thức: GET

Mô tả: Trả về danh sách các hồ sơ trên trình duyệt Chromium có sẵn trong chương trình

Dữ liệu trả về
{
"code": 0,
"status": "success",
"data" {
"profile_id1": {
"name": "Profile1" // Tên hồ sơ trong chương trình
"status": "Available", // trạng thái của hồ sơ, có thể là: "Started","Locked", "Available"
"debug_port": "xxxx", // cổng gỡ lỗi của trình duyệt, được sử dụng cho tự động hóa (giá trị trống nếu hồ sơ chưa được chạy). Chỉ dành cho trình duyệt Chromium
"websocket_link": "ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // liên kết đến trình duyệt, được sử dụng cho tự động hóa (giá trị trống nếu hồ sơ chưa được chạy). Chỉ dành cho trình duyệt Chromium
"folder": "Name", // Tên thư mục của hồ sơ
"tags": ["tag1", "tag2", "tag3"], // Các nhãn của hồ sơ
"cloud_id": "", // ID của hồ sơ đám mây
"creation_date": 123456789, // Ngày tạo Unix Timestamp
"modify_date": 123456789, // Ngày sửa Unix Timestamp
},
"profile_id2": {
},
},
}

Tạo hồ sơ

  • Đường dẫn: /profile/create
  • Phương thức: POST

Mô tả: Tạo hồ sơ với các tham số đã chọn. Tất cả các tham số là tùy chọn, có thể không có. Danh sách trình duyệt cho lệnh: Chrome, Edge, FireFox, IE, Opera, Safari, Yandex. Danh sách hệ điều hành cho lệnh: Windows, Windows 7, Windows 8, Windows 8.1, Windows 10, Android, iPhone, iPad, Linux, Mac. Nếu không có cấu hình nào với hệ điều hành hoặc trình duyệt đã chọn, một loại ngẫu nhiên của hệ điều hành hoặc trình duyệt sẽ được sử dụng
Định dạng: JSON

Các tham số yêu cầu:
{
"name": "profile với cài đặt ngẫu nhiên", // Tên của hồ sơ trong chương trình
"os": "Windows", // Cấu hình hệ điều hành nào được sử dụng
"browser": "Chrome", // Cấu hình trình duyệt nào được sử dụng
"cpu": 8, // Số lõi, các giá trị có thể có: 32, 24, 20, 16, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0
"memory": 8, // Số lượng bộ nhớ, các giá trị có thể có: 8, 4, 2, 1, 0
"tags": ["tag1", "tag2"], // Đặt các thẻ cho hồ sơ
"geolocation": "12.44, 13.524", // Đặt vị trí địa lý, nếu bạn nhập giá trị trống hoặc không hợp lệ, nó sẽ sử dụng cài đặt mặc định
"resolution": "1024x768", // Độ phân giải màn hình, các giá trị có thể có: "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", // Thay đổi proxy trong hồ sơ (proxy có thể là http, https, socks5, có thể có hoặc không có tên đăng nhập/mật khẩu)
"notes": "Text", // Thay đổi ghi chú trong hồ sơ
"folder": "testFolder", // Thư mục nào chứa hồ sơ
"language": "ru-RU, en-US", // Có thể đặt 2 ngôn ngữ
"cookies": [{}], // Nhập cookie vào hồ sơ
"type": "cloud", // Loại hồ sơ: cloud, local
"group": "group_example", // Nếu không có nhóm đã nhập, nó sẽ lấy từ Cài đặt mặc định, nếu có và nó không chính xác, nó sẽ hiển thị lỗi
"configid": "id", // Config ID, nếu được nhập, các tham số OS và Browser sẽ bị bỏ qua, các tham số khác sẽ được áp dụng nếu có thể, ví dụ, nếu cấu hình là Android, độ phân giải màn hình sẽ không thay đổi
"accounts": [ // Nhập tài khoản từ các trang web khác nhau vào hồ sơ
{"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
}
Dữ liệu trả về:
{
"code": 0,
"status": "success",
"data": {
"profile_id": "xxxxxxxx...", // ID duy nhất của hồ sơ
"name": "profile với cài đặt ngẫu nhiên" // Tên của hồ sơ trong chương trình
}
}

Khởi chạy hồ sơ

  • Đường dẫn: /profile/start/<profileID>
  • Phương thức: GET

Mô tả: Khởi chạy hồ sơ với <profileID> đã chọn. Bạn có thể thêm các tham số trong URL:

  • chrome_flags và truyền bất kỳ cờ nào bạn muốn, chỉ cần mã hóa chúng thành URL encoding, ví dụ: ?chrome_flags=—blink-settings%3DimagesEnabled%3Dfalse%20—disable-webgl2
  • start-pages và chỉ định các trang khởi đầu, chỉ cần mã hóa chúng thành URL encoding, ví dụ: ?start-pages=https%3A%2F%2Fgoogle.com%2Chttps%3A%2F%2Fya.ru
Dữ liệu trả về
{
"code":0,
"status":"success",
"data":{
"name": "Profile1" // Tên của hồ sơ trong chương trình
"websocket_link":"ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // liên kết đến trình duyệt, được sử dụng để tự động hóa (giá trị trống nếu hồ sơ không được khởi chạy). Chỉ dành cho trình duyệt Chromium
"debug_port": "xxxx", // cổng gỡ lỗi của trình duyệt Chromium, được sử dụng để tự động hóa (giá trị trống nếu hồ sơ không được khởi chạy). Chỉ dành cho trình duyệt Chromium
"folder": "Name", // Tên thư mục của hồ sơ
"tags": ["tag1", "tag2", "tag3"] // Các thẻ của hồ sơ
},
}

Đóng hồ sơ

  • Đường dẫn: /profile/stop/<profileID>
  • Phương thức: GET

Mô tả: Dừng hồ sơ với <profileID> đã chọn

Dữ liệu trả về:
{
"code": 0,
"status": "success",
"data": {}
}

Cập nhật hồ sơ

  • Đường dẫn: /profile/update/<profileID>
  • Phương thức: POST

Mô tả: Cập nhật thông tin trong hồ sơ với <profileID> cần thiết. Tất cả các tham số là tùy chọn và có thể không có
Định dạng: JSON

Các tham số yêu cầu:
{
"proxy": "socks5://127.0.0.1:5555:login:pass", // Thay đổi proxy trong hồ sơ (proxy có thể là http, https, socks5, có thể có hoặc không có tên đăng nhập/mật khẩu)
"notes": "Text", // Thay đổi ghi chú trong hồ sơ
"name": "Profile Name", // Thay đổi tên hồ sơ
"folder":"TestFolder", // Thay đổi thư mục trong hồ sơ
"tags": ["tag1", "tag2"], // Đặt các thẻ cho hồ sơ, các thẻ cũ sẽ bị ghi đè, nếu mảng trống, tất cả các thẻ sẽ bị xóa khỏi hồ sơ
"geolocation": "12.44, 13.524", // Đặt vị trí địa lý, nếu nhập giá trị trống hoặc không hợp lệ, sẽ sử dụng cài đặt mặc định
"cookies":[{}], // Nhập cookie vào hồ sơ
"type": "cloud", // Loại hồ sơ: cloud, local
"group": "group_example", // Nếu không có nhóm đã nhập, sẽ lấy từ Cài đặt mặc định, nếu có và không chính xác, sẽ hiển thị lỗi
"accounts": [ // Nhập tài khoản từ các trang web khác nhau vào hồ sơ
{"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
}
Dữ liệu trả về:
{
"code": 0,
"status": "success",
"data": {}
}

Xóa hồ sơ

  • Đường dẫn: /profile/delete/<profileID>
  • Phương thức: GET

Mô tả: Xóa hồ sơ với <profileID> đã chọn

Dữ liệu trả về:
{
"code": 0,
"status": "success",
"data": {}
}

Xóa dữ liệu trong hồ sơ

  • Đường dẫn: /profile/cleardata/<profileID>
  • Phương thức: GET

Mô tả: Xóa tất cả dữ liệu (cookie, lịch sử, ghi chú, bộ nhớ cache, v.v.) trong hồ sơ với <profileID> đã chọn

Dữ liệu trả về:
{
"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": {}
}
  • Đường dẫn: /profile/cookies/<profileID>
  • Phương thức: GET

Mô tả: Yêu cầu cookie của hồ sơ với <profileID> đã chọn

Dữ liệu trả về:
{
"code": 0,
"status": "success",
"data": {}
}

Gửi lên đám mây

  • Đường dẫn: /profile/tocloud
  • Phương thức: POST

Mô tả: Gửi các hồ sơ đã chọn lên đám mây
Định dạng: JSON

Các tham số yêu cầu:
{
"profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"],
"group": "test"
}
Dữ liệu trả về:
{
"code": 0,
"status": "success",
"data": {}
}

Làm thành hồ sơ cục bộ

  • Đường dẫn: /profile/tolocal
  • Phương thức: POST

Mô tả: Làm cho các hồ sơ đã chọn trở thành hồ sơ cục bộ
Định dạng: JSON

Các tham số yêu cầu:
{
"profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"]
}
Dữ liệu trả về:
{
"code": 0,
"status": "success",
"data": {}
}

Cập nhật phiên bản trình duyệt

  • Đường dẫn: /profile/updatebrowser/<profileID>
  • Phương thức: GET

Mô tả: Cập nhật phiên bản trình duyệt trong hồ sơ với <profileID> đã chọn
Định dạng: JSON

Dữ liệu trả về:
{
"code": 0,
"status": "success",
"data": {}
}

Danh sách cấu hình

  • Đường dẫn: /configslist
  • Phương thức: GET

Mô tả: Trả về danh sách cấu hình hoạt động
Định dạng: JSON

Dữ liệu trả về:
{
"code":0,
"status":"success",
"data": {
"config_id1":
{
"os": "Windows 10" // Hệ điều hành
"browser":"Chrome 115", // Loại trình duyệt và phiên bản
"useragent": "xxxx", // UserAgent trong cấu hình
"webgl": "Apple GPU", // WebGL trong cấu hình
"screen": "1024x768", // Độ phân giải màn hình
},
"config_id2":
{
},
},
}

Danh sách nhóm

  • Đường dẫn: /groupslist
  • Phương thức: GET

Mô tả: Trả về danh sách nhóm
Định dạng: JSON

Dữ liệu trả về:
{
"code":0,
"status": "success",
"data": {["group1", "group2"]},
}

Thông tin về hồ sơ

  • Đường dẫn: /profile/getinfo/<profileID>
  • Phương thức: GET

Mô tả: Yêu cầu thông tin về hồ sơ với <profileID> đã chọn
Định dạng: JSON

Trả về dữ liệu:
{
"code":0,
"status": "thành công",
"data": {
"name": "Profile1" // Tên hồ sơ trong chương trình
"status": "Có sẵn", // Trạng thái hồ sơ, có thể là: "Bắt đầu","Bị khóa", "Có sẵn"
"debug_port": "xxxx", // Cổng gỡ lỗi của trình duyệt, được sử dụng để tự động hóa (giá trị trống nếu hồ sơ chưa được khởi chạy)
"websocket_link": "ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // Liên kết đến trình duyệt, được sử dụng để tự động hóa (giá trị trống nếu hồ sơ chưa được khởi chạy)
"configid": "id" // ID cấu hình
"cloud_id": ""
"type": "cloud" // Loại hồ sơ: cloud, local
"proxy": "socks5://127.0.0.1:5555:login:pass", // Proxy của hồ sơ
"folder": "Tên", // Tên thư mục của hồ sơ
"tags": ["tag1", "tag2", "tag3"], // Nhãn của hồ sơ
"notes": "Văn bản", // Ghi chú của hồ sơ
"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 của hồ sơ
"browser": "Edge 114.0.1823.43", // Trình duyệt của hồ sơ
"os": "Windows 10", // Hệ điều hành của hồ sơ
"screen": "1366x768", // Độ phân giải màn hình của hồ sơ
"language": "en-US,en;q=0.9,ak-GH;q=0.8,ak;q=0.7", // Ngôn ngữ của hồ sơ
"cpu": 8, // Số lõi CPU
"memory": 4, // Số lượng bộ nhớ
"creation_date": 123456789, // Ngày tạo Unix Timestamp
"modify_date": 123456789, // Ngày sửa đổi 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": {
}
}

Ví dụ

Puppeteer (Node.js)

Node.js Puppeteer Khởi chạy hồ sơ với tên cụ thể và mở trang undetectable.io trong hồ sơ đó:

const puppeteer = require('puppeteer');
const axios = require('axios');
const port = 25325; // Cổng
const ip = '127.0.0.1'; // IP cục bộ
const profileName = ‘TestProfile; // Tên hồ sơ
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) {
///// Khởi chạy hồ sơ cụ thể và điều hướng đến trang
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 Khởi chạy các hồ sơ trong một thư mục cụ thể và mở một số trang web:

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" # Địa chỉ IP API cục bộ (nếu bạn làm việc từ một máy tính khác trên cùng mạng hoặc một cổng được mở trong cài đặt định tuyến, bạn có thể truy cập API cục bộ từ xa và địa chỉ này sẽ cần được thay đổi)
port_from_settings_browser = '25325' # Cổng API cục bộ (có thể tìm thấy trong cài đặt chương trình)
chrome_driver_path = "chromedriver.exe" # Đường dẫn đến chromedriver cho v110
ser = Service(chrome_driver_path)
chrome_options = Options()
list_response = requests.get(f'http://{address}:{port_from_settings_browser}/list').json()['data'] # Gửi yêu cầu đến API cục bộ để lấy danh sách các hồ sơ
profile_id = ''
for key, value in list_response.items(): # Lặp qua danh sách các hồ sơ và chạy chúng một cách tuần tự
if value['folder'] == 'test': # Ở đây bạn có thể thêm kiểm tra để chỉ chạy các hồ sơ bạn cần (trong ví dụ này, chúng tôi chạy các hồ sơ nằm trong thư mục 'test')
profile_id = key
if value['status'] == 'Available': # Nếu hồ sơ không chạy, sau đó chạy hồ sơ và lấy 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': # Nếu hồ sơ đang chạy, sau đó chúng tôi chỉ cần lấy debug_port từ dữ liệu có sẵn
debug_port = value['debug_port']
if value['status'] == 'Locked': # Nếu hồ sơ bị khóa, sau đó bỏ qua
continue
if debug_port: # Chúng tôi kiểm tra xem trình duyệt có cổng kết nối không (các hồ sơ WebEngine không có cổng, vì vậy chúng tôi đóng chúng ngay lập tức)
chrome_options.debugger_address = f'{address}:{debug_port}'
driver = webdriver.Chrome(service=ser, options=chrome_options)
driver.get("https://whoer.net/") # Mở whoer.net trong tab hoạt động
driver.switch_to.new_window('tab') # Tạo một tab mới và chuyển sang nó
driver.get(url='https://browserleaks.com/js') # Mở browserleaks.com/js trong tab hoạt động
# Bạn có thể thêm bất kỳ hành động nào khác ở đây
sleep(5) # Đợi 5 giây
requests.get(f'http://{address}:{port_from_settings_browser}/profile/stop/{profile_id}') # Dừng hồ sơ