get_token

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

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

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