mcp-server-strava

  • scripts
import logging import os import webbrowser from http.server import BaseHTTPRequestHandler, HTTPServer from pathlib import Path from urllib.parse import parse_qs, urlparse import requests from dotenv import load_dotenv, set_key # Настройка логирования logger = logging.getLogger(__name__) # Загрузка .env файла env_path = Path(__file__).parents[1] / ".env" load_dotenv(env_path) SUCCESS_HTML = """ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Strava Authorization</title> <style> body { font-family: Arial, sans-serif; text-align: center; padding: 40px; } .success { color: green; } </style> </head> <body> <h1 class="success">Авторизация успешна!</h1> <p>Можете закрыть это окно.</p> </body> </html> """ ERROR_HTML = """ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Strava Authorization Error</title> <style> body { font-family: Arial, sans-serif; text-align: center; padding: 40px; } .error { color: red; } </style> </head> <body> <h1 class="error">Ошибка авторизации</h1> <p>{error_message}</p> </body> </html> """ class AuthHandler(BaseHTTPRequestHandler): def do_GET(self): """Обработка ответа от Strava OAuth""" try: query = parse_qs(urlparse(self.path).query) code = query.get("code", [None])[0] if code: response = requests.post( "https://www.strava.com/oauth/token", data={ "client_id": os.getenv("STRAVA_CLIENT_ID"), "client_secret": os.getenv("STRAVA_CLIENT_SECRET"), "code": code, "grant_type": "authorization_code", }, ) response.raise_for_status() data = response.json() set_key(env_path, "STRAVA_ACCESS_TOKEN", data["access_token"]) set_key(env_path, "STRAVA_REFRESH_TOKEN", data["refresh_token"]) set_key(env_path, "STRAVA_TOKEN_EXPIRES_AT", str(data["expires_at"])) self.send_response(200) self.send_header("Content-type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(SUCCESS_HTML.encode("utf-8")) logger.info("Токены успешно обновлены и сохранены в .env") else: raise ValueError("Код авторизации не получен") except Exception as e: logger.error(f"Ошибка авторизации: {e}") self.send_response(500) self.send_header("Content-type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(ERROR_HTML.format(error_message=str(e)).encode("utf-8")) def main(): client_id = os.getenv("STRAVA_CLIENT_ID") client_secret = os.getenv("STRAVA_CLIENT_SECRET") if not client_id or not client_secret: logger.error("STRAVA_CLIENT_ID или STRAVA_CLIENT_SECRET не найдены в .env") return server = HTTPServer(("localhost", 8000), AuthHandler) auth_url = ( "https://www.strava.com/oauth/authorize" f"?client_id={client_id}" "&response_type=code" "&redirect_uri=http://localhost:8000" "&scope=activity:read_all" ) logger.info("Открываем браузер для авторизации в Strava...") webbrowser.open(auth_url) try: logger.info("Ожидаем ответ от Strava...") server.handle_request() finally: server.server_close() if __name__ == "__main__": main()