🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【コピペで動く】PythonとAPIで天気予報CLIアプリを作ろう!初心者でも安心のステップ・バイ・ステップ解説

「プログラミングを始めたけど、何を作ればいいかわからない…」「勉強しているけど、実際に動くものが作れなくて挫折しそう…」

ほんの数ヶ月前の僕も、全く同じ悩みを抱えていました。プログラミング知識ゼロからAIの力を借りて独学を始め、今ではWebサイトを運営できるまでになりましたが、学習初期に一番大事だと感じたのは、「とにかく何かを自分の手で作り上げ、動かす体験」です。

この記事では、プログラミング初心者の方が「動いた!楽しい!」を実感できるよう、Pythonを使って天気予報を教えてくれるシンプルなコマンドライン(CLI)アプリの作り方を、どこよりも丁寧に解説します。

完成イメージはこんな感じです。ターミナル(黒い画面)でコマンドを打つと…?

$ python weather.py Tokyo

[ 東京 (JP) の天気 ]
天気: 晴れ ☀️
気温: 28.5℃ (体感: 29.1℃)
湿度: 65%
風速: 3.1 m/s

難しいことは一切ありません!コピペするだけで、あなたのパソコンでもすぐにこれが動きます。僕が実際につまずいたポイントも正直に共有しながら進めるので、安心してついてきてくださいね。

STEP 1: 冒険の準備をしよう! - 天気APIのキーを手に入れる

まず、天気情報をどこから持ってくるのか?という問題があります。私たちがテレビやスマホで見る天気予報も、気象庁などの専門機関が観測したデータが元になっていますよね。

今回は、OpenWeatherMapというサービスを使います。このサービスが提供するAPIという仕組みを利用することで、世界中の天気データを私たちのプログラムで自由に取得できるようになります。

「APIって何?」と難しく考える必要はありません。今は「プログラムから天気データを取得するための合言葉(鍵)」のようなものだと思ってください。この鍵(APIキー)を手に入れるための手順を解説します。

  1. OpenWeatherMapのAPIページにアクセスし、「Current Weather Data」の「Subscribe」ボタンをクリックします。
  2. 無料プランの「Get API key」ボタンを押して、アカウントを作成します(メールアドレスとパスワードなどを設定)。
  3. 登録が完了すると、ダッシュボードの「API keys」タブに、あなたの専用APIキーが発行されています。この32桁くらいの英数字の文字列が、先ほど説明した「合言葉」です。

【超重要】APIキーは絶対に他人に教えたり、SNSやGitHubで公開したりしないでください!
このキーはあなた専用のものです。もし悪意のある人に知られてしまうと、不正に大量のアクセスをされてしまい、あなたが料金を請求される可能性があります。大切な家の鍵と同じように、厳重に管理しましょう。


STEP 2: 必要な道具を揃えよう! - `requests`ライブラリ

APIキーが手に入ったら、次はPythonからAPIを利用するための道具を準備します。それが`requests`というライブラリです。

ライブラリとは、便利な機能があらかじめセットになった「道具箱」のようなもの。`requests`を使えば、たった数行のコードでWebサイトやAPIにアクセスできます。

お使いのPCのターミナル(WindowsならコマンドプロンプトやPowerShell、Macならターミナル)を開いて、以下のコマンドを実行してください。

pip install requests

`Successfully installed...`のようなメッセージが出れば成功です。これで、天気APIと通信する準備が整いました!

STEP 3: まずはシンプルに動かしてみよう!

いよいよコーディングです。まずは、特定の都市(ここでは東京)の天気を取得する、ごくごく簡単なコードを書いてみましょう。お手元のエディタで`weather.py`という名前のファイルを作成し、以下のコードを貼り付けてください。

import requests
import json

# STEP1で取得したあなたのAPIキーに書き換えてください
API_KEY = "あなたのAPIキーをここに貼り付け"
CITY_NAME = "Tokyo"

# APIリクエストURLを組み立て
api_url = f"https://api.openweathermap.org/data/2.5/weather?q={CITY_NAME}&appid={API_KEY}&units=metric&lang=ja"

try:
    # 実際にAPIにリクエストを送信
    response = requests.get(api_url)
    response.raise_for_status() # エラーがあれば例外を発生させる

    # 結果をJSON形式からPythonの辞書型に変換
    data = response.json()

    # データを分かりやすく表示
    print(json.dumps(data, indent=2, ensure_ascii=False))

except requests.exceptions.RequestException as e:
    print(f"通信エラーが発生しました: {e}")
except Exception as e:
    print(f"予期せぬエラーが発生しました: {e}")

コードを貼り付けたら、`API_KEY = "あなたのAPIキーをここに貼り付け"` の部分を、先ほど取得したご自身のAPIキーに書き換えるのを忘れないでくださいね。

書き換えたら、ターミナルでこのファイルを実行してみましょう。

$ python weather.py

どうでしょうか?下のような、たくさんの文字(データ)が表示されたら成功です!

{
  "coord": {
    "lon": 139.6917,
    "lat": 35.6895
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "晴れ",
      "icon": "01d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 28.5,
    "feels_like": 29.1,
    "temp_min": 27.21,
    "temp_max": 29.58,
    "pressure": 1012,
    "humidity": 65
  },
  "visibility": 10000,
  "wind": {
    "speed": 3.09,
    "deg": 190
  },
  // ...まだまだ続く
}

これが、OpenWeatherMapから送られてきた「東京の現在の天気データ」の生の状態です。このJSONという形式のデータから、必要な情報だけを抜き出していくのが次のステップです。

【つまづきポイント解説】JSONデータの読み方
JSONは、`{}`(波括弧)と `[]`(角括弧)の組み合わせでできています。

Pythonでは、JSONの`{}`は「辞書」、`[]`は「リスト」として扱えるので、非常に相性が良いのです。例えば、気温(`temp`)を取得したい場合は、`main`という大きな括りの中にある`temp`にアクセスすれば良いので、`data['main']['temp']` のように書きます。簡単ですよね!

STEP 4: アプリを本格的に改造しよう!

さて、ここからが本番です。毎回コードを書き換えるのではなく、ユーザーが都市名を入力できるようにし、必要な情報だけを見やすく表示する、CLIアプリらしい形に進化させていきましょう。

今回は、より本格的なCLIアプリを作るため、Pythonの標準ライブラリである `argparse` を使います。これを使うと、`python weather.py Tokyo` のように、実行時に情報を渡せるようになります。

`weather.py` を以下の内容で完全に書き換えてください。APIキーの管理方法も、より安全な形に変えています。

import requests
import argparse
import os

def get_weather_emoji(weather_main):
    """天気の英語名から絵文字を返す"""
    if weather_main == "Clear":
        return "☀️"
    elif weather_main == "Clouds":
        return "☁️"
    elif weather_main == "Rain":
        return "🌧️"
    elif weather_main == "Drizzle":
        return "🌦️"
    elif weather_main == "Thunderstorm":
        return "⛈️"
    elif weather_main == "Snow":
        return "❄️"
    else:
        return "🌫️" # Mist, Smoke, Haze, Dust, Fog, Sand, Ash, Squall, Tornado

def format_weather_data(data):
    """APIレスポンスを整形して文字列で返す"""
    try:
        city_name = data["name"]
        country = data["sys"]["country"]
        weather_description = data["weather"][0]["description"]
        weather_main = data["weather"][0]["main"]
        emoji = get_weather_emoji(weather_main)
        temp = data["main"]["temp"]
        feels_like = data["main"]["feels_like"]
        humidity = data["main"]["humidity"]
        wind_speed = data["wind"]["speed"]

        # 見やすいように出力文字列を組み立てる
        output = f"[ {city_name} ({country}) の天気 ]\n"
        output += f"天気: {weather_description} {emoji}\n"
        output += f"気温: {temp}°C (体感: {feels_like}°C)\n"
        output += f"湿度: {humidity}%\n"
        output += f"風速: {wind_speed} m/s"
        
        return output
    except KeyError:
        return "天気データの解析に失敗しました。レスポンスの形式が不正な可能性があります。"

def main():
    # 1. APIキーを環境変数から取得する
    #    より安全にキーを管理するため
    api_key = os.getenv("OPENWEATHERMAP_API_KEY")
    if not api_key:
        print("エラー: 環境変数 'OPENWEATHERMAP_API_KEY' が設定されていません。")
        print("APIキーを設定してから再度実行してください。")
        return # プログラムを終了

    # 2. コマンドライン引数を設定する
    parser = argparse.ArgumentParser(description="指定された都市の現在の天気情報を表示します。")
    parser.add_argument("city", help="天気情報を取得したい都市名 (例: Tokyo)")
    parser.add_argument("-u", "--units", choices=["metric", "imperial"], default="metric", 
                        help="温度の単位を指定します ('metric' for Celsius, 'imperial' for Fahrenheit)")
    
    args = parser.parse_args()
    
    # 3. APIにリクエストを送信する
    base_url = "https://api.openweathermap.org/data/2.5/weather"
    params = {
        "q": args.city,
        "appid": api_key,
        "units": args.units,
        "lang": "ja"
    }

    try:
        response = requests.get(base_url, params=params)
        # 4xx, 5xx のエラーコードが返ってきた場合に例外を発生させる
        response.raise_for_status()

        weather_data = response.json()
        
        # 4. 結果を表示する
        formatted_output = format_weather_data(weather_data)
        print(formatted_output)

    except requests.exceptions.HTTPError as e:
        if e.response.status_code == 401:
            print("エラー: APIキーが無効です。正しいAPIキーが設定されているか確認してください。")
        elif e.response.status_code == 404:
            print(f"エラー: 都市 '{args.city}' が見つかりませんでした。都市名を確認してください。")
        else:
            print(f"HTTPエラーが発生しました: {e}")
    except requests.exceptions.RequestException as e:
        print(f"通信エラーが発生しました: {e}")
    except Exception as e:
        print(f"予期せぬエラーが発生しました: {e}")


if __name__ == "__main__":
    main()

【重要】APIキーの安全な設定方法(環境変数)

コード内に直接APIキーを書くのは危険だとお伝えしました。そこで、プロの現場でも使われる「環境変数」という仕組みを使います。これは、お使いのPC自体にAPIキーを覚えさせておく方法です。

Mac / Linux の場合:

export OPENWEATHERMAP_API_KEY="あなたのAPIキー"

Windows (コマンドプロンプト) の場合:

set OPENWEATHERMAP_API_KEY="あなたのAPIキー"

Windows (PowerShell) の場合:

$Env:OPENWEATHERMAP_API_KEY="あなたのAPIキー"

上記のコマンドをターミナルで実行してください(ターミナルを閉じると設定はリセットされます)。これで、`os.getenv("OPENWEATHERMAP_API_KEY")` というコードがPCに設定したキーを読み込んでくれるようになります。

準備ができたら、実行してみましょう!

$ python weather.py Osaka

見事に大阪の天気が表示されたでしょうか?

今度は、アメリカのニューヨークの天気を華氏(Fahrenheit)で表示させてみましょう。

$ python weather.py "New York" -u imperial

都市名にスペースが含まれる場合は、`"`(ダブルクォーテーション)で囲むのを忘れないでくださいね。温度が華氏(°F)で表示されれば成功です!

わざと間違った都市名を入力したり、APIキーを間違えて設定したりすると、ちゃんとエラーメッセージが表示されることも確認してみてください。これが「堅牢なエラーハンドリング」です。

まとめ: 「動いた!」のその先へ

お疲れ様でした! これで、あなただけのオリジナル天気予報CLIアプリが完成しました。単にコードをコピペするだけでなく、以下の点を学べたはずです。

プログラミングの学習は、こうした「小さな成功体験」を積み重ねることが何よりも大切です。今日作ったこのアプリをベースに、「次は複数の都市を一度に表示させてみよう」「一時間ごとの予報も追加してみよう」「結果をLINEに通知してみよう」など、どんどん自分だけのアイデアで改造してみてください。

「動くものを作る楽しさ」を燃料に、これからもプログラミングの世界を冒険していきましょう!

次のステップへ

Pythonプログラミングで誰もが一度は遭遇する「インデントのエラー」。なぜ起こるのか、どう直せばいいのかを徹底解説した記事もぜひ読んでみてください。

IndentationError(インデントエラー)の原因と対処法