104 lines
3.8 KiB
Python
104 lines
3.8 KiB
Python
|
|
import aiohttp
|
|||
|
|
import asyncio
|
|||
|
|
import json
|
|||
|
|
|
|||
|
|
class V2rayAController:
|
|||
|
|
def __init__(self, host='http://localhost:2017', username='admin', password='admin'):
|
|||
|
|
self.host = host
|
|||
|
|
self.username = username
|
|||
|
|
self.password = password
|
|||
|
|
self.token = None
|
|||
|
|
self.session = None
|
|||
|
|
|
|||
|
|
async def authenticate(self):
|
|||
|
|
"""Аутентификация и получение токена"""
|
|||
|
|
self.session = aiohttp.ClientSession()
|
|||
|
|
auth_url = f"{self.host}/api/login"
|
|||
|
|
credentials = {
|
|||
|
|
'username': self.username,
|
|||
|
|
'password': self.password
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
async with self.session.post(auth_url, json=credentials) as response:
|
|||
|
|
if response.status == 200:
|
|||
|
|
data = await response.json()
|
|||
|
|
self.token = data.get('data').get('token')
|
|||
|
|
print("V2RayA auth OK")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
print(f"Ошибка аутентификации: {response.status}")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"Ошибка при аутентификации: {e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
async def enable_proxy(self):
|
|||
|
|
"""Включение прокси"""
|
|||
|
|
if not self.token:
|
|||
|
|
print("Не выполнен вход. Пожалуйста, сначала выполните аутентификацию")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
url = f"{self.host}/api/v2ray"
|
|||
|
|
headers = {'Authorization': f"Bearer {self.token}"}
|
|||
|
|
data = {}
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
async with self.session.post(url, headers=headers, json=data) as response:
|
|||
|
|
if response.status == 200:
|
|||
|
|
print("Прокси успешно включен")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
print(f"Ошибка при включении прокси: {response.status}")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"Ошибка при включении прокси: {e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
async def disable_proxy(self):
|
|||
|
|
"""Выключение прокси"""
|
|||
|
|
if not self.token:
|
|||
|
|
print("Не выполнен вход. Пожалуйста, сначала выполните аутентификацию")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
url = f"{self.host}/api/v2ray"
|
|||
|
|
headers = {'Authorization': f"Bearer {self.token}"}
|
|||
|
|
data = {'operation': 'stop'}
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
async with self.session.delete(url, headers=headers, json=data) as response:
|
|||
|
|
if response.status == 200:
|
|||
|
|
print("Прокси успешно выключен")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
print(f"Ошибка при выключении прокси: {response.status}")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"Ошибка при выключении прокси: {e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
async def close(self):
|
|||
|
|
"""Закрытие сессии"""
|
|||
|
|
if self.session:
|
|||
|
|
await self.session.close()
|
|||
|
|
|
|||
|
|
async def main():
|
|||
|
|
# Инициализация контроллера
|
|||
|
|
controller = V2rayAController(
|
|||
|
|
host='http://localhost:2017',
|
|||
|
|
username='admin123',
|
|||
|
|
password='admin123'
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# Аутентификация
|
|||
|
|
if await controller.authenticate():
|
|||
|
|
# Примеры использования
|
|||
|
|
await controller.enable_proxy()
|
|||
|
|
await asyncio.sleep(20) # Пауза для демонстрации
|
|||
|
|
await controller.disable_proxy()
|
|||
|
|
|
|||
|
|
# Закрытие сессии
|
|||
|
|
await controller.close()
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
asyncio.run(main())
|