見出し画像

APIを使って天気情報を取得する!

初めまして、ゆらと申します。今回は外部サービスからAPIを用いて天気情報を取得する方法を備忘録として整理しました。
※本記事はchatGPTを用いて作成しています。


1. OpenWeatherMapでアカウントを作成し、APIキーを取得

  1. OpenWeatherMapにアクセスしてアカウントを作成する。

  2. アカウントができたら、APIキーを取得する。通常、登録後にAPIキーがすぐに利用可能になるけど、反映までに数時間かかる場合があるから注意してね。

2. requestsライブラリを準備

PythonでOpenWeatherMapのAPIを叩くにはrequestsライブラリが便利だから、これがまだインストールされていない場合は、以下のコマンドでインストールしてね。

[ゆらコメント]
requestsモジュールはpython標準モジュールではないらしく、インストールせず3.を実行するとエラーを吐きました。このモジュールは、コマンドプロンプトに下記コマンドを入力するとインストールできました。

pip install requests

3. コードを書く

APIキーを取得したら、以下のようなPythonスクリプトを書いてみよう。このコードは東京の天気を取得して表示するもの。your_api_key_hereの部分は、取得したAPIキーに置き換えてね。

import requests
from datetime import datetime, timedelta

# APIキーと都市名を設定
API_KEY = "your_api_key_here"
CITY = "Tokyo"

# 明日の日付を取得
tomorrow = datetime.now() + timedelta(days=1)
date_str = tomorrow.strftime('%Y-%m-%d')

# OpenWeatherMapのAPIエンドポイント
url = f"http://api.openweathermap.org/data/2.5/forecast?appid={API_KEY}&q={CITY}&units=metric"

# APIにリクエストを送る
response = requests.get(url)
data = response.json()

# 明日の天気を探して表示
for item in data['list']:
    if date_str in item['dt_txt']:
        weather = item['weather'][0]['description']
        temp = item['main']['temp']
        print(f"東京の{date_str}の天気: {weather}, 温度: {temp}°C")
        break


[追記] response.json()について

response.json()っていうのは、Pythonのrequestsライブラリを使ってWeb APIから受け取ったレスポンス(HTTP応答)を、JSON形式からPythonの辞書型(dict)に変換するためのメソッドだよ。簡単に言うと、Web APIからの応答をプログラムで扱いやすい形にするためのもの。

Web APIからのレスポンスは通常、JSON形式のテキストで返ってくる。JSON(JavaScript Object Notation)は、データを簡潔に記述するための軽量なフォーマットで、様々なプログラミング言語で扱うことができるんだ。ただ、そのままだとテキストとしての情報であって、Pythonで直接「辞書としてアクセスしたいキーの値を取り出す」とか「リストとして順に処理する」といったことができない。だから、response.json()を使って、そのJSONテキストをPythonで扱いやすい辞書型やリスト型に変換するわけ。

例えば、天気情報のAPIを叩いたときのレスポンスをresponseとした場合、response.json()によって、そのデータをPythonの辞書型で取得できる。すると、天気の状態を示すキー'weather'や気温を示すキー'temp'などに、Pythonのコードから直接アクセスできるようになるんだ。

import requests

# 仮のURLでAPIを叩く
response = requests.get('http://example.com/api/data')
data = response.json()  # JSONレスポンスを辞書型に変換

# 辞書型のデータから特定の情報を取り出す
weather = data['weather']
temp = data['temp']

print(f"天気: {weather}, 気温: {temp}度")

このようにして、APIからのレスポンスをプログラムで直接扱える形に変換して、必要なデータを取り出したり、加工したりできるわけ。だから、response.json()はAPIを使ったプログラミングにおいてめちゃくちゃ便利なメソッドなんだよ。


[追記] JSON形式と辞書型(dict)について

JSONとPythonの辞書型(dict)は、データを格納するフォーマットが似ていて、キーと値のペアで情報を管理する点では共通しているよ。でも、扱われる環境(JSONは言語に依存しないデータフォーマットで、辞書型はPython独自のデータ型)や使い方に少し違いがあるんだ。ここで、視覚的な違いを含めて説明してみるね。

①JSON(JavaScript Object Notation)

  • 形式:テキストベース。プログラミング言語に依存しない。

  • 目的:データの交換。Web APIなどを通じて異なるシステム間でデータをやり取りするときに使われる。

  • 記述法:キーはダブルクォーテーション("")で囲む。値は文字列、数値、配列(リスト)、真偽値、null(PythonでいうNone)などが使える。

{
  "name": "Taro",
  "age": 30,
  "isStudent": false,
  "skills": ["Python", "JavaScript"]
}

②Pythonの辞書型(dict)

  • 形式:Pythonのデータ型。Python内でのみ使われる。

  • 目的:データの格納とアクセス。プログラム内でデータを効率的に扱うために使われる。

  • 記述法:キーはダブルクォーテーション("")かシングルクォーテーション('')で囲む(Pythonではどちらも文字列として認識される)。値はPythonで扱える任意のオブジェクトが使える。

{
  'name': 'Taro',
  'age': 30,
  'isStudent': False,
  'skills': ['Python', 'JavaScript']
}


視覚的には非常に似ているけど、JSONは厳格にダブルクォーテーションを使う点、そしてテキストベースである点がPythonの辞書型との主な違いだね。Pythonの辞書型では、ダブルクォーテーションかシングルクォーテーションどちらでもキーを囲むことができ、値としてPythonのあらゆるオブジェクトを使用できる(例えば、関数やクラスのインスタンスなども)。一方、JSONはテキストフォーマットなので、文字列や数値、配列、オブジェクト(辞書型に相当)、真偽値、nullのみを扱えるよ。
要は、JSONはデータをやり取りするための共通言語のようなもので、Pythonの辞書型はPython内でデータを効率的に扱うための仕組みってこと。この違いを押さえておくと、いろいろな場面で役立つよ!


[追記] テキストベースとバイナリベース

「テキストベース」というのは、データや情報が人間が読める文字(テキスト)で表されているという意味だよ。具体的には、アルファベット、数字、記号など、キーボードで入力できる文字によって情報が記述されている状態のことを指すんだ。

たとえば、JSONはテキストベースのデータフォーマットで、Web APIを通じてデータをやり取りするときによく使われる。JSONフォーマットで記述されたデータは、テキストエディタで開いたり、Webページ上で直接見たりすることができる。これが「テキストベース」の典型的な例。

{
  "name": "Taro",
  "age": 30,
  "isStudent": false
}

このJSONデータは、カッコやダブルクォーテーション、コロン、コンマなどのテキスト(文字)で構成されていて、人が読んでも何を表しているか理解できるよね。

対照的に、「バイナリベース」のデータは、直接人間が読むことを意図していない。バイナリデータは0と1のみで構成されていて、写真、音楽ファイル、実行可能ファイルなど、コンピュータが解釈して初めて何を表しているのかわかる形式のこと。バイナリデータをテキストエディタで開くと、人には理解できない文字が表示されることが多いよ。

つまり、「テキストベース」のデータは人間にも読みやすく、プログラム間でのデータ交換に適している。一方で、「バイナリベース」のデータは、人間には直接読めない形式だけど、データをコンパクトに保存したり、特定の処理を効率的に行うために使われるんだ。


[追記] 「キーと値のペアで情報を管理する」とは

"name": "Taro"という部分では、"name"がキーで、"Taro"が値になっている。キーと値のペアで情報を管理するというのは、まさにこのことを指していて、このようにしてデータを構造化することで、特定の情報を簡単に見つけたり、アクセスしたりできるようになるんだ。
JSONやPythonの辞書型(dict)では、このキーと値のペアを使って、データを「マップ」のように扱う。キーはそのデータの「名前」みたいなもので、値はその名前に関連づけられた「内容」を表している。例えば、人物の情報を扱う場合、名前、年齢、学生かどうか、という情報をキーとして持ち、それぞれに対応する値を設定するわけ。

{
  "name": "Taro",
  "age": 30,
  "isStudent": false
}

この例で言えば、

  • nameというキーには"Taro"が値として関連づけられている。

  • ageというキーには30が値として関連づけられている。

  • isStudentというキーにはfalseが値として関連づけられている。

この方式は、データを整理して扱いやすくするのに非常に便利で、プログラミングではよく使われる方法なんだ。キーを指定することで、関連する値に簡単にアクセスできるからね。


[追記] APIキーを環境変数に格納する

環境変数っていうのは、オペレーティングシステムでプログラムの実行環境に関する情報を格納するための変数のことだよ。要するに、プログラムが実行される環境における設定やシステム情報を保持している場所ってわけ。これを使うと、プログラム内にハードコードされたパスや設定値、セキュリティに敏感な情報(APIキーとかパスワードとかね)を直接書かずに済むから、セキュリティ面でのリスクを減らすことができるの。

例えば、Pythonで環境変数を使いたい場合は、osモジュールのgetenv関数を使って、こんな感じで環境変数の値を取得できるんだ:

import os

api_key = os.getenv('API_KEY')

ここで'API_KEY'は事前に設定しておいた環境変数の名前ね。この方法なら、APIキーをソースコード内に直接書く必要がなくなるから、もしソースコードが外部に漏れてもAPIキー自体は安全、ってわけ。

環境変数の設定方法は、使っているオペレーティングシステムによって違うから、Windowsだったらシステムのプロパティから、LinuxやmacOSだったら.bashrc.zshrcみたいなシェルの設定ファイルに書くことになるよ。


[ゆらコメント]
環境変数は、「コントロールパネル」→「システムとセキュリティ」→「システム」→「システムの詳細設定」→「環境変数」から設定でき、具体的には「変数名」とそれに対応する「変数値」を設定します。
なお、「ユーザー環境変数」と「システム環境変数」という2種類がありますが、PCを共用してなければどちらで設定しても大丈夫だと思います。

ユーザー環境変数
ログイン中のユーザのみ使えます。

システム環境変数
そのPCを使用する全てのユーザが使えます。


この記事が気に入ったらサポートをしてみませんか?