Сьогодні зробимо щось справді класне! Ми зареєструємося для отримання облікового запису Open Weather і використаємо їхній відкритий API для отримання результатів в нашому AWS S3 бакеті. Звучить складно, правда? Але дозвольте провести вас через цей процес, щоб ви могли краще зрозуміти, як все працює, і, можливо, ви захочете дослідити інші API в мережі! Тож давайте почнемо, гаразд?
Інструменти для цього проєкту
- Обліковий запис AWS
- VS Code
- Python
- Open Weather API
- Github
Перше, що ми зробимо, це створимо наші каталоги.
Я створив папку, в якій буду зберігати свої проєкти — "Python Projects", а всередині цієї папки ми створимо середовище, де зберігатимемо все й писатимемо наш скрипт. Папка називатиметься “weather-dashboard”. Потім ми створимо підкаталоги “src, tests, data” в цій папці. Далі в папці “src” створимо наші .py файли, а також за допомогою команди “touch” створимо файли requirements і readme, а також .env.
mkdir weather-dashboard
cd weather-dashboard
mkdir src tests data
touch src/ __init__.py src/weather_dashboard.py
touch requirements.txt Readme.md .env
Після цього ми створимо файл gitignore за допомогою команди “echo”. Файли gitignore потрібні для ігнорування важливих даних, таких як ваші паролі, щоб вони не потрапили у ваші файли при завантаженні на ваш обліковий запис Github. Потім встановимо бібліотеку boto3 та додамо наш запит до файлу requirements.txt.
Тепер ми додамо наш API до .env, а також наш бакет до .env.
echo "AWS_BUCKET_NAME=" >> .env
echo "OPENWEATHER_API_KEY=" >> .env
Тепер імпортуємо наш код до файлу weatherdashboard.py. Щоб почати працювати з змінними середовища та сервісами AWS в Python, можна імпортувати необхідні модулі. Наприклад, _os і json допомагають управляти файлами та маніпулювати даними, відповідно, а boto3 використовується для взаємодії з сервісами AWS. Модуль request допомагає робити HTTP запити, а random генерує випадкові числа.
datetime дозволяє працювати з датами та часом, а також форматувати їх, а loaddotenv_ з бібліотеки dotenv завантажує змінні середовища з файлу .env, щоб зберігати чутливі дані в безпеці.
import os
import json
import boto3
import requests
import random
from datetime import datetime
from dotenv import load_dotenv
# Завантажуємо змінні середовища
load_dotenv()
class WeatherDashboard:
def __init__(self):
self.api_key = os.getenv("OPENWEATHER_API_KEY")
self.bucket_name = os.getenv("AWS_BUCKET_NAME")
self.s3_client = boto3.client('s3')
# Додаємо випадкові числа для кращого забезпечення доступності назви S3 бакета
random_ints = random.randint(100, 300)
self.bucket_name = f"{self.bucket_name}-{random_ints}"
def create_bucket_if_not_exists(self):
"""Створюємо S3 бакет, якщо його ще немає"""
try:
self.s3_client.head_bucket(Bucket=self.bucket_name)
print(f"Бакет {self.bucket_name} існує")
except:
print(f"Створення бакета {self.bucket_name}")
try:
# Просте створення для us-east-1
self.s3_client.create_bucket(Bucket=self.bucket_name)
print(f"Успішно створено бакет {self.bucket_name}")
except Exception as e:
print(f"Помилка при створенні бакета: {e}")
def fetch_weather(self, city):
"""Отримуємо дані про погоду з OpenWeather API"""
base_url = "https://api.openweathermap.org/data/2.5/weather?"
params = {
"q": city,
"appid": self.api_key,
"units": "imperial"
}
try:
response = requests.get(base_url, params=params)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"Помилка при отриманні даних погоди: {e}")
return None
def save_to_s3(self, weather_data, city):
"""Зберігаємо дані погоди в S3 бакет"""
if not weather_data:
return False
timestamp = datetime.now().strftime('%Y%m%d-%H%M%S')
file_name = f"weather-data/{city}-{timestamp}.json"
try:
weather_data['timestamp'] = timestamp
self.s3_client.put_object(
Bucket=self.bucket_name,
Key=file_name,
Body=json.dumps(weather_data),
ContentType='application/json'
)
print(f"Успішно збережено дані для {city} в S3")
return True
except Exception as e:
print(f"Помилка при збереженні в S3: {e}")
return False
def main():
dashboard = WeatherDashboard()
# Створюємо бакет, якщо потрібно
dashboard.create_bucket_if_not_exists()
cities = ["Seattle", "New York", "Philadelphia"]
for city in cities:
print(f"\nОтримуємо погоду для {city}...")
weather_data = dashboard.fetch_weather(city)
if weather_data:
temp = weather_data['main']['temp']
feels_like = weather_data['main']['feels_like']
humidity = weather_data['main']['humidity']
description = weather_data['weather'][0]['description']
print(f"Температура: {temp}°F")
print(f"Відчувається як: {feels_like}°F")
print(f"Вологість: {humidity}%")
print(f"Умови: {description}")
# Зберігаємо в S3
success = dashboard.save_to_s3(weather_data, city)
if success:
print(f"Дані погоди для {city} збережено в S3!")
else:
print(f"Не вдалося отримати дані погоди для {city}")
if __name__ == "__main__":
main()
Якщо ми завершимо наш код, ми можемо запустити його, щоб перевірити, чи працює він, і якщо все правильно, ви побачите такий результат, а також зможете перевірити ваш AWS, щоб переконатися, що все вірно. Тож давайте запустимо код за допомогою python3 src/.
БУМ! МИ ЗРОБИЛИ ЦЕ, ДИТИНКО! ТЕПЕР ВИ ЗНАЄТЕ, ЯК ВИКОРИСТОВУВАТИ ВІДКРИТІ API ДЛЯ РІЗНИХ САЙТІВ! Тепер давайте ще раз перевіримо наш обліковий запис AWS, і ви повинні побачити ці результати у вашому S3 бакеті! Я так пишаюсь вами!
Будь ласка, не соромтеся підписатися на мене для отримання нових уроків та гайдів.
Дякую, що повернулися, сподіваюся побачити вас ще не раз!
Ось посилання на мій репозиторій і мою сторінку
[
GitHub - TechboyBrandon/Weather-Dashboard: Як створити Weather Dashboard
Як створити Weather Dashboard. Сприяйте розвитку TechboyBrandon/Weather-Dashboard, створивши обліковий запис на…
github.com
](https://github.com/TechboyBrandon/Weather-Dashboard/tree/main?source=post_page-----1a7258fdb60e--------------------------------)
[
TechboyBrandon - Огляд
TechboyBrandon має 10 доступних репозиторіїв. Слідуйте за його кодом на GitHub.
github.com
](https://github.com/TechboyBrandon?source=post_page-----1a7258fdb60e--------------------------------)
Перекладено з: How To Operate The Open Weather API Like A Boss!