Перейти к содержанию

Использование

Инициализация клиента

from outline_vpn_api_client import OutlineClient

client = OutlineClient(management_url="your.management.url")

Примечание: По умолчанию проверка SSL-сертификата отключена (ssl_verify=False). Это сделано намеренно, так как Outline серверы обычно используют самоподписанные сертификаты. Вы можете включить проверку, передав ssl_verify=True, если ваш сервер имеет валидный сертификат.


Сервер

Получить информацию о сервере

info = client.server.get_information()
print(info.serverId)
print(info.name)

Переименовать сервер

client.server.rename("Мой VPN сервер")

Изменить хостнейм

client.server.change_hostname("vpn.example.com")

Изменить порт по умолчанию для новых ключей доступа

client.server.change_default_port_for_new_keys(12345)

Установить лимит трафика по умолчанию для всех ключей

client.server.set_server_default_limits(10 ** 9)  # 1 ГБ

Убрать лимит трафика по умолчанию

client.server.remove_server_default_limits()

Ключи доступа

Список всех ключей доступа

keys = client.access_keys.get_all()
for key in keys.accessKeys:
    print(key.id, key.name)

Получить конкретный ключ доступа

key = client.access_keys.get(0)
print(key.accessUrl)

Создать ключ доступа

# Минимальный вариант
key = client.access_keys.create(name="Алиса")

# С лимитом трафика (в байтах)
key = client.access_keys.create(name="Боб", limit=10 ** 9)

# С произвольным паролем и портом
key = client.access_keys.create(name="Вася", password="MyPass123", port=12345)

Создать ключ доступа с определённым ID

key = client.access_keys.create_with_special_id(
    id=42,
    name="Петя",
    password="MyPass123",
    port=12345,
    limit=10 ** 9,
)

Переименовать ключ доступа

client.access_keys.rename(42, "Петя Переименованный")

Установить лимит трафика на ключ доступа

client.access_keys.change_data_limit(42, 5 * 10 ** 9)  # 5 ГБ

Убрать лимит трафика с ключа доступа

client.access_keys.remove_data_limit(42)

Удалить ключ доступа

client.access_keys.delete(42)

Метрики

Проверить, включена ли передача метрик

print(client.metrics.check_enabled())

Включить или отключить передачу метрик

client.metrics.change_enabled_state(True)   # включить
client.metrics.change_enabled_state(False)  # отключить

Получить объём переданных данных по ключам доступа

transfer = client.metrics.get_data_transfer()
for key_id, bytes_used in transfer.bytesTransferredByUserId.items():
    print(f"Ключ {key_id}: {bytes_used / 10**6:.1f} МБ")

Получить подробные метрики сервера (экспериментально)

from datetime import datetime, timezone, timedelta

metrics = client.metrics.get_server_metrics(
    since=datetime.now(timezone.utc) - timedelta(days=30)
)

print(metrics.server.dataTransferred.bytes)
print(metrics.server.bandwidth.peak.data.bytes)

for key in metrics.accessKeys:
    bytes_used = key.dataTransferred.bytes if key.dataTransferred else 0
    print(f"Ключ {key.accessKeyId}: {bytes_used / 10**6:.1f} МБ")

Примечание: Этот endpoint является экспериментальным и может измениться в будущих версиях Outline сервера.


Асинхронное использование

Установите пакет с поддержкой async:

pip install outline-vpn-api-client[async]

Все методы идентичны синхронному клиенту, но требуют await:

import asyncio
from datetime import datetime, timezone, timedelta
from outline_vpn_api_client.async_client import AsyncOutlineClient

client = AsyncOutlineClient(management_url="your.management.url")

async def main():
    # Информация о сервере
    info = await client.server.get_information()
    print(info.serverId)

    # Создать ключ
    key = await client.access_keys.create(name="Алиса", limit=10 ** 9)
    print(key.accessUrl)

    # Подробные метрики
    metrics = await client.metrics.get_server_metrics(
        since=datetime.now(timezone.utc) - timedelta(days=30)
    )
    print(metrics.server.dataTransferred.bytes)

asyncio.run(main())

Обработка ошибок

Все методы выбрасывают ResponseNotOkException при ошибках на стороне сервера:

from outline_vpn_api_client import OutlineClient, ResponseNotOkException

client = OutlineClient(management_url="your.management.url")

try:
    key = client.access_keys.get(999)
except ResponseNotOkException as e:
    print(e)
    # An error occurred: 404 - {'code': 'NotFound', 'message': 'Access key "999" not found'}