get_token

Скрипт для получения OAuth-токена Яндекс Умного дома.

Выполняет OAuth-авторизацию: открывает браузер для подтверждения, запрашивает код и обменивает его на токен доступа.

 1"""
 2Скрипт для получения OAuth-токена Яндекс Умного дома.
 3
 4Выполняет OAuth-авторизацию: открывает браузер для подтверждения,
 5запрашивает код и обменивает его на токен доступа.
 6"""
 7
 8import os
 9import sys
10import webbrowser
11import requests
12
13CLIENT_ID_ENV = "YANDEX_OAUTH_CLIENT_ID"
14CLIENT_SECRET_ENV = "YANDEX_OAUTH_CLIENT_SECRET"
15
16
17def get_yandex_token(client_id: str | None = None, client_secret: str | None = None) -> str | None:
18    """Получает OAuth-токен для Яндекс Умного дома.
19
20    Выполняет двухшаговую OAuth-авторизацию:
21    1. Открывает браузер для получения authorization code.
22    2. Обменивает код на access token.
23
24    Args:
25        client_id: Client ID Яндекс OAuth (из переменной YANDEX_OAUTH_CLIENT_ID).
26        client_secret: Client Secret Яндекс OAuth (из переменной YANDEX_OAUTH_CLIENT_SECRET).
27
28    Returns:
29        str: Полученный OAuth-токен или None при ошибке.
30    """
31
32    client_id = client_id or os.getenv(CLIENT_ID_ENV)
33    client_secret = client_secret or os.getenv(CLIENT_SECRET_ENV)
34
35    if not client_id or not client_secret:
36        print(f"❌ Задайте переменные окружения {CLIENT_ID_ENV} и {CLIENT_SECRET_ENV}")
37        print("   или передайте их аргументами: python get_token.py <client_id> <client_secret>")
38        print("   Получить Client ID и Secret: https://oauth.yandex.ru/client/new")
39        return None
40
41    # Шаг 1: Получение authorization code
42    auth_url = (
43        f"https://oauth.yandex.ru/authorize?"
44        f"response_type=code&"
45        f"client_id={client_id}&"
46        f"force_confirm=yes"
47    )
48
49    print("1. Открываю браузер для авторизации...")
50    print(f"2. Если браузер не открылся, перейдите по ссылке:\n{auth_url}")
51    webbrowser.open(auth_url)
52
53    print("3. После авторизации вы получите код в адресной строке")
54    print("4. Введите код из адресной строки:")
55    auth_code = input("Код: ").strip()
56
57    # Шаг 2: Обмен code на token
58    token_url = "https://oauth.yandex.ru/token"
59
60    data = {
61        "grant_type": "authorization_code",
62        "code": auth_code,
63        "client_id": client_id,
64        "client_secret": client_secret,
65    }
66
67    try:
68        response = requests.post(token_url, data=data)
69        response.raise_for_status()
70
71        token_data = response.json()
72        access_token = token_data.get("access_token")
73
74        print("✅ Токен получен успешно!")
75        print(f"🔑 Ваш токен: {access_token}")
76        print("\nДобавьте этот токен в .env:")
77        print(f"YANDEX_TOKEN='{access_token}'")
78
79        return access_token
80
81    except requests.exceptions.RequestException as e:
82        print(f"❌ Ошибка при получении токена: {e}")
83        return None
84
85
86if __name__ == "__main__":
87    args = sys.argv[1:]
88    client_id = args[0] if len(args) > 0 else None
89    client_secret = args[1] if len(args) > 1 else None
90    get_yandex_token(client_id, client_secret)
CLIENT_ID_ENV = 'YANDEX_OAUTH_CLIENT_ID'
CLIENT_SECRET_ENV = 'YANDEX_OAUTH_CLIENT_SECRET'
def get_yandex_token( client_id: str | None = None, client_secret: str | None = None) -> str | None:
18def get_yandex_token(client_id: str | None = None, client_secret: str | None = None) -> str | None:
19    """Получает OAuth-токен для Яндекс Умного дома.
20
21    Выполняет двухшаговую OAuth-авторизацию:
22    1. Открывает браузер для получения authorization code.
23    2. Обменивает код на access token.
24
25    Args:
26        client_id: Client ID Яндекс OAuth (из переменной YANDEX_OAUTH_CLIENT_ID).
27        client_secret: Client Secret Яндекс OAuth (из переменной YANDEX_OAUTH_CLIENT_SECRET).
28
29    Returns:
30        str: Полученный OAuth-токен или None при ошибке.
31    """
32
33    client_id = client_id or os.getenv(CLIENT_ID_ENV)
34    client_secret = client_secret or os.getenv(CLIENT_SECRET_ENV)
35
36    if not client_id or not client_secret:
37        print(f"❌ Задайте переменные окружения {CLIENT_ID_ENV} и {CLIENT_SECRET_ENV}")
38        print("   или передайте их аргументами: python get_token.py <client_id> <client_secret>")
39        print("   Получить Client ID и Secret: https://oauth.yandex.ru/client/new")
40        return None
41
42    # Шаг 1: Получение authorization code
43    auth_url = (
44        f"https://oauth.yandex.ru/authorize?"
45        f"response_type=code&"
46        f"client_id={client_id}&"
47        f"force_confirm=yes"
48    )
49
50    print("1. Открываю браузер для авторизации...")
51    print(f"2. Если браузер не открылся, перейдите по ссылке:\n{auth_url}")
52    webbrowser.open(auth_url)
53
54    print("3. После авторизации вы получите код в адресной строке")
55    print("4. Введите код из адресной строки:")
56    auth_code = input("Код: ").strip()
57
58    # Шаг 2: Обмен code на token
59    token_url = "https://oauth.yandex.ru/token"
60
61    data = {
62        "grant_type": "authorization_code",
63        "code": auth_code,
64        "client_id": client_id,
65        "client_secret": client_secret,
66    }
67
68    try:
69        response = requests.post(token_url, data=data)
70        response.raise_for_status()
71
72        token_data = response.json()
73        access_token = token_data.get("access_token")
74
75        print("✅ Токен получен успешно!")
76        print(f"🔑 Ваш токен: {access_token}")
77        print("\nДобавьте этот токен в .env:")
78        print(f"YANDEX_TOKEN='{access_token}'")
79
80        return access_token
81
82    except requests.exceptions.RequestException as e:
83        print(f"❌ Ошибка при получении токена: {e}")
84        return None

Получает OAuth-токен для Яндекс Умного дома.

Выполняет двухшаговую OAuth-авторизацию:

  1. Открывает браузер для получения authorization code.
  2. Обменивает код на access token.

Args: client_id: Client ID Яндекс OAuth (из переменной YANDEX_OAUTH_CLIENT_ID). client_secret: Client Secret Яндекс OAuth (из переменной YANDEX_OAUTH_CLIENT_SECRET).

Returns: str: Полученный OAuth-токен или None при ошибке.