Repo Health

← К списку

mao5mao/new1

from flask import Flask, render_template, request, jsonify import requests from datetime import datetime app = Flask(__name__) WEATHER_API_KEY = "cff439b820e8da9c997c063affc07f18" # ВСТАВЬ СВОЙ РАБОЧИЙ КЛЮЧ WEATHER_URL = "https://api.openweathermap.org/data/2.5/weather" WEATHER_TRANSLATIONS = { "clear sky": "ясное небо", "few clouds": "малооблачно", "scattered clouds": "облачно с прояснениями", "broken clouds": "облачно", "overcast clouds": "пасмурно", "light rain": "небольшой дождь", "moderate rain": "умеренный дождь", "heavy intensity rain": "сильный дождь", "rain": "дождь", "light snow": "небольшой снег", "snow": "снег", "heavy snow": "сильный снег", "thunderstorm": "гроза", "mist": "туман", "fog": "туман", "haze": "дымка" } def get_mood_by_weather(weather_id, temperature): if temperature is None: temperature = 0 if weather_id == 800: if temperature > 25: return { "bg_start": "#FF6B35", "bg_end": "#F7931E", "icon": "☀️🔥", "mood_text": "Очень жарко! Солнце печёт вовсю!", "suggestion": "Пей больше воды и избегай солнца с 12 до 16 часов" } elif temperature > 15: return { "bg_start": "#4A90E2", "bg_end": "#87CEEB", "icon": "☀️", "mood_text": "Солнечно и радостно! Хорошее настроение!", "suggestion": "Отличный день для прогулки!" } else: return { "bg_start": "#89CFF0", "bg_end": "#B0E0E6", "icon": "☀️❄️", "mood_text": "Солнце светит, но на улице прохладно", "suggestion": "Оденься теплее, несмотря на солнце" } elif 200 <= weather_id < 300: return { "bg_start": "#2C3E50", "bg_end": "#1A1A2E", "icon": "⛈️⚡", "mood_text": "Гроза! Лучше остаться дома с чашкой чая", "suggestion": "Отключи электроприборы от сети" } elif 300 <= weather_id < 600: if temperature < 10: return { "bg_start": "#4A5568", "bg_end": "#2D3748", "icon": "🌧️❄️", "mood_text": "Холодный дождь. Время для тёплого пледа", "suggestion": "Пей горячий чай и укройся пледом" } else: return { "bg_start": "#5B86E5", "bg_end": "#36D1DC", "icon": "🌧️☔", "mood_text": "Дождливо. Можно почитать книгу", "suggestion": "Не забудь зонт!" } elif 600 <= weather_id < 700: return { "bg_start": "#B0D4E8", "bg_end": "#E8F4FD", "icon": "❄️⛄", "mood_text": "Снегопад! Можно лепить снеговика!", "suggestion": "Оденься тепло и непромокаемо" } elif 700 <= weather_id < 800: return { "bg_start": "#A0AAB5", "bg_end": "#C5C9CC", "icon": "🌫️", "mood_text": "Туманно и загадочно", "suggestion": "Будь аккуратен на дорогах" } elif 801 <= weather_id <= 804: if temperature < 5: return { "bg_start": "#6B7B8D", "bg_end": "#4A5568", "icon": "☁️❄️", "mood_text": "Облачно и холодно. Одевайтесь теплее!", "suggestion": "Шапка и шарф обязательны" } else: return { "bg_start": "#9EBAE5", "bg_end": "#B8D0F0", "icon": "☁️", "mood_text": "Облачно, но приятно", "suggestion": "Хороший день для прогулки" } else: return { "bg_start": "#667EEA", "bg_end": "#764BA2", "icon": "🌍", "mood_text": "Интересная погода сегодня", "suggestion": "Следи за прогнозом" } def get_clothing_advice(temperature, humidity, wind_speed, weather_type, feels_like): advice_text = "" advice_icon = "" if temperature > 30: advice_text = "Очень жарко! Надень футболку, шорты и кепку." advice_icon = "🩳🧢" elif temperature > 25: advice_text = "Тепло и солнечно. Футболка и шорты — отличный выбор." advice_icon = "👕🩳" elif temperature > 20: advice_text = "Приятная тёплая погода. Футболка и джинсы." advice_icon = "👕👖" elif temperature > 15: advice_text = "Прохладно. Надень кофту или лёгкую куртку." advice_icon = "🧥👖" elif temperature > 10: advice_text = "Холодновато. Надень тёплую кофту и куртку." advice_icon = "🧥🧣" elif temperature > 5: advice_text = "Холодно! Нужна тёплая куртка, шапка и шарф." advice_icon = "🧤🧣" elif temperature > 0: advice_text = "Очень холодно! Одевайся максимально тепло." advice_icon = "🧥🧤" else: advice_text = "Мороз! Пуховик, тёплая шапка, варежки и шарф!" advice_icon = "❄️🧥🧤" if weather_type == "Rain": advice_text += " ☔ Не забудь зонт!" advice_icon = "☔ " + advice_icon elif weather_type == "Snow": advice_text += " ⛄ Надень непромокаемую обувь!" advice_icon = "❄️ " + advice_icon elif weather_type == "Thunderstorm": advice_text += " ⚡ Оставайся дома!" advice_icon = "⚡ " + advice_icon if wind_speed > 10: advice_text += f" 💨 Сильный ветер ({wind_speed} м/с)!" elif wind_speed > 5: advice_text += f" 🌬️ Ветер ({wind_speed} м/с), будет холоднее." if humidity > 80: advice_text += " 💧 Высокая влажность." elif humidity < 30: advice_text += " 🔥 Сухой воздух, пей воду." return { "icon": advice_icon[:8], "text": advice_text } def translate_weather_description(english_desc): english_desc_lower = english_desc.lower() if english_desc_lower in WEATHER_TRANSLATIONS: return WEATHER_TRANSLATIONS[english_desc_lower] else: return english_desc_lower def get_wind_direction(degrees): if degrees is None: return "неизвестно" directions = ["северный", "северо-восточный", "восточный", "юго-восточный", "южный", "юго-западный", "западный", "северо-западный"] idx = round(degrees / 45) % 8 return directions[idx] def get_weather_from_api(city_name): params = { "q": city_name, "appid": WEATHER_API_KEY, "units": "metric", "lang": "ru" } try: response = requests.get(WEATHER_URL, params=params) if response.status_code != 200: print("Ошибка API:", response.status_code, response.text) return None data = response.json() result = {} result["city"] = data["name"] result["country"] = data["sys"]["country"] result["temperature"] = round(data["main"]["temp"]) result["feels_like"] = round(data["main"]["feels_like"]) result["temp_min"] = round(data["main"]["temp_min"]) result["temp_max"] = round(data["main"]["temp_max"]) result["humidity"] = data["main"]["humidity"] result["pressure"] = round(data["main"]["pressure"] * 0.750064) result["wind_speed"] = round(data["wind"]["speed"]) result["wind_deg"] = data["wind"].get("deg", 0) result["wind_direction"] = get_wind_direction(result["wind_deg"]) result["clouds"] = data["clouds"]["all"] result["weather_id"] = data["weather"][0]["id"] result["weather_main"] = data["weather"][0]["main"] weather_desc = data["weather"][0]["description"] result["weather_description_ru"] = translate_weather_description(weather_desc) result["visibility"] = data.get("visibility", 10000) / 1000 return result except Exception as e: print("Ошибка при запросе:", e) return None @app.route('/') def index(): return render_template('index.html') @app.route('/api/weather') def api_weather(): city = request.args.get('city', '') if not city: return jsonify({"success": False, "error": "Укажите название города"}) weather_data = get_weather_from_api(city) if weather_data is None: return jsonify({"success": False, "error": f"Город '{city}' не найден"}) mood = get_mood_by_weather(weather_data["weather_id"], weather_data["temperature"]) weather_data["mood"] = mood advice = get_clothing_advice( weather_data["temperature"], weather_data["humidity"], weather_data["wind_speed"], weather_data["weather_main"], weather_data["feels_like"] ) weather_data["advice"] = advice weather_data["success"] = True return jsonify(weather_data) @app.route('/api/weather/by-coordinates') def api_weather_by_coords(): lat = request.args.get('lat') lon = request.args.get('lon') if not lat or not lon: return jsonify({"success": False, "error": "Не указаны координаты"}) try: lat = float(lat) lon = float(lon) except ValueError: return jsonify({"success": False, "error": "Неверный формат координат"}) params = { "lat": lat, "lon": lon, "appid": WEATHER_API_KEY, "units": "metric", "lang": "ru" } try: response = requests.get(WEATHER_URL, params=params) if response.status_code != 200: return jsonify({"success": False, "error": "Не удалось получить погоду"}) data = response.json() result = {} result["city"] = data["name"] result["country"] = data["sys"]["country"] result["temperature"] = round(data["main"]["temp"]) result["feels_like"] = round(data["main"]["feels_like"]) result["temp_min"] = round(data["main"]["temp_min"]) result["temp_max"] = round(data["main"]["temp_max"]) result["humidity"] = data["main"]["humidity"] result["pressure"] = round(data["main"]["pressure"] * 0.750064) result["wind_speed"] = round(data["wind"]["speed"]) result["wind_deg"] = data["wind"].get("deg", 0) result["wind_direction"] = get_wind_direction(result["wind_deg"]) result["clouds"] = data["clouds"]["all"] result["weather_id"] = data["weather"][0]["id"] result["weather_main"] = data["weather"][0]["main"] weather_desc = data["weather"][0]["description"] result["weather_description_ru"] = translate_weather_description(weather_desc) result["visibility"] = data.get("visibility", 10000) / 1000 mood = get_mood_by_weather(result["weather_id"], result["temperature"]) result["mood"] = mood advice = get_clothing_advice( result["temperature"], result["humidity"], result["wind_speed"], result["weather_main"], result["feels_like"] ) result["advice"] = advice result["success"] = True return jsonify(result) except Exception as e: print("Ошибка:", e) return jsonify({"success": False, "error": "Ошибка соединения"}) if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=5000)

язык не указан · рейтинг 0 · 👍 0 · ❤️ 0 · 💎 0 · 0 форков · ссылка на SourceCraft

Дата анализа: 29.09.2026 22:54

20
Repo Health Score
Скачать Markdown

Почему такой балл

Категории без данных не обнуляют итог: их вес перераспределяется между категориями, где балл есть.

Сильные и слабые стороны

Слабые: Документация: 0, Активность: 0, Issues: нет данных, Проект давно не проявлял активность, Не найдено тестов, Отсутствует README, Мало релизов за последние 30 дней, Мало merge requests за последние 30 дней

Сводка YandexGPT

Находки и рекомендации

История проверок

  1. 29.09.2026 22:54 — 20

Безопасность (AppSec) и CI/CD здесь не оцениваются: к ним есть доступ только по PAT владельца репозитория.