Добавить в корзинуПозвонить
Найти в Дзене
Lamkon

3x-ui подключение по API Python

Всем привет! Недавно у меня появилась потребность во взаимодействие с api 3x-ui, но как я посмотрел по документации, она не совсем правильно работает и порой выдает ошибки. Поэтому я решил поделиться с вами готовыми функциями взаимодействия с 3x-ui по API с помощью Python. Функции работают асинхронно. async def add_client(id_client, email_id, time, subid): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36', 'Accept': 'application/json' } url = f"{hostname_panel}/panel/api/inbounds/addClient" payload = { "id": 11, "settings": "{\"clients\":" "[{\"id\":\"" + str(id_client) + "\",\"flow\": \"xtls-rprx-vision\",\"email\":\"" + str(email_id) + "\",\"limitIp\": 0,\"totalGB\": 0,\"expiryTime\":" + str(time) + ",\"enable\": true,\"tgId\": \"\",\"subId\":\"" + str(subid) + "\",\"reset\": 0}]}" } autoriz_data = { 'username': login_panel, 'password': password_panel } async with aiohttp.ClientSession() as sess
Оглавление

Всем привет! Недавно у меня появилась потребность во взаимодействие с api 3x-ui, но как я посмотрел по документации, она не совсем правильно работает и порой выдает ошибки.

Поэтому я решил поделиться с вами готовыми функциями взаимодействия с 3x-ui по API с помощью Python.

Функции работают асинхронно.

Добавление пользователя

async def add_client(id_client, email_id, time, subid):

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',

'Accept': 'application/json'

}

url = f"{hostname_panel}/panel/api/inbounds/addClient"

payload = {

"id": 11,

"settings":

"{\"clients\":"

"[{\"id\":\"" + str(id_client) + "\",\"flow\": \"xtls-rprx-vision\",\"email\":\"" + str(email_id) + "\",\"limitIp\": 0,\"totalGB\": 0,\"expiryTime\":" + str(time) + ",\"enable\": true,\"tgId\": \"\",\"subId\":\"" + str(subid) + "\",\"reset\": 0}]}"

}

autoriz_data = {

'username': login_panel,

'password': password_panel

}

async with aiohttp.ClientSession() as session:

await session.post(f"{hostname_panel}/login", data=autoriz_data)

await session.post(url, headers=headers, data=payload)

для начала нужно подключиться к нашему личному кабинету к 3x-ui с помощью post запроса с логином и паролем, а потом уже отправлять запрос на добавление клиента

Обновление времени действия подписки клиента

async def update_client(key_id, email_id, subid, time):

# time = 86400000 * (кол-во дней) - чтобы выставить время

headers = {

'Accept': 'application/json'

}

url = f"{hostname_panel}/panel/api/inbounds/updateClient/{key_id}"

payload = {

"id": 11,

"settings":

"{\"clients\":"

"[{\"id\":\"" + str(key_id) + "\",\"flow\": \"xtls-rprx-vision\",\"email\":\"" + str(email_id) + "\",\"limitIp\": 0,\"totalGB\": 0,\"expiryTime\":" + str(time) + ",\"enable\": true,\"tgId\": \"\",\"subId\":\"" + str(subid) + "\",\"reset\": 0}]}"

}

autoriz_data = {

'username': login_panel,

'password': password_panel

}

async with aiohttp.ClientSession() as session:

await session.post(f"{hostname_panel}/login", data=autoriz_data)

await session.post(url, headers=headers, data=payload)

return True

Получение оставшегося времени действия подписки клиента

async def time_subscribe_userid(user_id):

headers = {

'Accept': 'application/json'

}

url = f"{hostname_panel}/panel/api/inbounds/getClientTrafficsById/{user_id}"

autoriz_data = {

'username': login_panel,

'password': password_panel

}

async with aiohttp.ClientSession() as session:

await session.post(f"{hostname_panel}/login", data=autoriz_data)

response = await session.get(url, headers=headers)

a = await response.json()

a = a['obj']

for i in a:

m = i['expiryTime']

time_subscribe_seconds = (int(m) // 1000) - (int(time.time()))

timesub_user_result = str(datetime.timedelta(seconds=time_subscribe_seconds))

timesub_user_result = timesub_user_result.replace("days", "дней")

timesub_user_result = timesub_user_result.replace("day", "день")

if '-' in timesub_user_result:

timesub_user_result = str(datetime.timedelta(seconds=(time_subscribe_seconds- (time_subscribe_seconds*2)) - int(time.time())))

timesub_user_result = timesub_user_result.replace("days", "дней")

timesub_user_result = timesub_user_result.replace("day", "день")

return timesub_user_result

else:

return timesub_user_result

Реализация функций была разработана для телеграм бота, который дает доступ к VPN.

Исходный код продается, пишите в комментарии.