世界の天気情報を取得してTwitterにあげるようにした話①

# Twitterに天気情報を投稿しよう！

前回のTwitter投稿で気をよくしたわたくし
(大したことはやってないのに)
今度は何をやろうかなと思って思いついたのが
海外の天気予報サイトから情報を引っ張ってきて
Twitterに投稿すること。

## なんで作ったか
今はコロナで全然ですが
海外旅行が好きな我が家、年1回の頻度で海外に行ってました(主にヨーロッパ)。
現地の気候は事前にガイドブックやネットなどをチェックしてるのだけど
2015年7月にフィンランドのロヴァニエミに行った時のこと
ネットで見ると、最高18℃最低11℃ぐらいと。
最低は夜中だろうし、ちょっと厚手のアウターぐらいあればいいでしょ、と行ってみたら
乗り継ぎの飛行機に乗ってるみなさま、ダウンジャケット着てる…
着いてみたらめっちゃ寒い
気温見たら8℃

そりゃそうだ
平均はあくまで平均
暑い時もあれば寒い時もある

それからは旅行に行く前から現地の気温をチェックするようにしてたのだけど
毎日毎日チェックするのめんどくさい
しかも何箇所か行く場合、その分確認する回数増えてめんどくさい
さらに天気によって気温も変わるからその日だけ見ても予測しづらい

よし、じゃあTwitterに投稿して見返せるようにしよう

ということで作ったのでした。


## 天気情報をどうやって収集するか
知りたいところの天気情報を取得する方法について
Seleniumでスクレイピングするというのを最初に考えたけど
そこは非力なRaspberry pi zero。
ブラウザ立ち上げただけで動作がもっさりするので即却下。

その時たまたま業務でJSONデータ解析する仕事をしてまして
JSON取得できるAPIがある天気予報サイト使えばCUIでもできるね！
できれば世界各国の天気予報が見れるところがいいね！
と探して見つけたのがOpenWeatherというサイト
[OpenWeather](https://openweathermap.org/)

JSONやXMLで取得する方法はこちら
当時よりめっちゃ使いやすくなってるなぁ…
[OpenWeather API](https://openweathermap.org/current)

さて、こちらもTwitter同様API Keyが必要になるので
アカウントが必要です。
無料アカウントがあって、月1,000,000件まで使えるので
個人利用程度なら全然問題ないと思います。

[OpenWeather Price](https://openweathermap.org/price)

## OpenWeatherのアカウントを作成する
Sign inをクリックするとCreate An Accountという項目が表示されるので
新規アカウントを作成すします。

![D697212E-F041-411C-AAA1-8136601103BE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007033/44f39d62-ab04-4b39-2615-fc2a9033e46c.jpeg)


アカウント作成で以下の情報を入力する

1. ユーザー名
1. メールアドレス
1. パスワード
1. パスワードの確認
1. 16歳以上かのチェック
1. プライバシポリシー、利用規約、Webサイトに使用条件に同意
1. ニュースレターを受けるとるかチェック(不要ならチェックなしでOK)
1. ロボットではないことの証明にチェック

![825BA1FB-F53C-4179-A6AF-5566C97C971F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007033/1d148ae9-f133-7094-fef8-ebc711b5b420.jpeg)

APIの用途について聞かれますが、Companyは空白
PurposeはOtherで大丈夫です！

![D1A33775-13AC-4173-8C47-98EFB82ACED9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007033/3777c34f-1c32-2c0d-f9e8-151cf6ccff4a.jpeg)

Saveをクリックすると登録したメールアドレスに認証メールが届くので
クリックして認証を終了します。


## APIキーを取得する

登録したメールアドレスとパスワードでアカウントにログインします。

画面右上に表示されている自分のアカウント名をクリックすると
My API Keysという項目が出て来るのでクリックします。

![C830DB41-3FBC-4917-8493-28B0796A72EE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007033/b1ab9c54-fd11-c121-7634-6f44d2af34e9.jpeg)

DefaultのKeyが表示されるのでコピーして保存しておきましょう！
もしなかったらCreate KeyでForTwitterとか何とか
適当な名前を入力してGenerateボタンを押すと
Keyが作成されます。


## JSONデータを取得してみる
以下のパラメータを指定して、APIを叩きます。


|パラメータ|必須かどうか|説明|
|:-:|:-:|:-:|
| q |必須|都市名(英語のみ)や都市コード|
| appid  |必須|API Key|
| mode |オプション|"xml","html"が指定できる。指定しない場合はJSON|
| units|オプション|"metric":摂氏 "imperial":華氏 "standard":ケルビン|
| lang|オプション|言語設定。日本語の場合は"ja"|

下はAPIを叩いてJSONデータを取得するプログラムです。
OPENWEATHER_APIは取得したAPI Keyを入力してください。
get_jsondata("tokyo")はsapporoでもsendaiでもlondonでも
好きな都市名を入力してみてください。英語のみなので注意。


~~~python
#!/usr/bin/env python
# -*- coding:utf-8 -*-

# JSONデータ取得

import json
import requests
import pprint

OPENWEATHER_API = ""

def get_jsondata(city):

    response = requests.get(
        "https://api.openweathermap.org/data/2.5/weather",
        params={
            ## 都市名で取得する場合
            "q": city,
            "appid": OPENWEATHER_API,
            "units": "metric",
            "lang": "ja",
        },
    )
    ret = json.loads(response.text)
    pprint.pprint(ret)



def main():
    get_jsondata("tokyo")


if __name__ == '__main__':
    main()

~~~

すると以下のようにJSONデータが表示されます。


![6AC614B2-66BA-4ABE-9B82-B1AAAED2B414.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007033/949fe5d6-2072-17e3-a102-8d816be8f31b.jpeg)


さて、このJSONデータをどう料理するか。それはまた次回！