Railwayで無料の天気予報Discord Botを実装した
開発目的
家と学校が遠く、天気が異なることがあった。とはいえ毎朝天気を確認するのも面倒なので、毎朝定刻に両地点の天気を一括して取得し通知するbotを作ろうと考えた。
動作環境
windows 11
Ubuntu 24.04.01 LTS
python 3.12.3
開発の流れ
githubでリポジトリを作成
Railwayにデプロイするときgithubのリポジトリからcloneすることが出来ます。
この方法が他の方法に比べ圧倒的に楽なので作っておくことを推奨します。
この際.gitignore
に環境変数を保存する.env
ファイルと仮想環境のディレクトリを入れておきましょう。
.envを使用しないと天気予報のデータを取得するためのデータから住所などが特定されてしまうおそれがあります。
またUbuntuだとpipコマンドがつかえないことがある(?)ので仮想環境を使って、その中でインストールしましょう。
.envファイルについて
仮想環境について
Discord botの導入
以下のサイトを参考に作成しました。
こちらのサイトはGlitchでデプロイしているのに対し、当記事ではRailwayで行っています。
天気情報の入手
天気予報を教えてくれるAPIを入手します。
Open-Meteoというサイトを利用しました。
こちらのサイトは無料利用できるうえ、APIキーの取得なども必要ないので此方のサイトをお勧めします。
このサイトにアクセスしてヘッダーのAPI Docs
をクリックします。
API Docs
でLocation and Time
のScrachをクリックします。
天気情報を入手したい地点を下図のように英語で打ち込みます。
(今回は千代田区)
Tokyoと出ているやつをクリックすることで東京都千代田区を選択できます。
またTimezoneをAsia/Tokyo
にしておきましょう。
複数の地点の情報が欲しい場合はSearchの右の+を押して同様の操作をすることで追加できます。
つづいて、どのくらいの期間の情報が欲しいかをForecast days
で指定します。
今回の開発目的は朝にその日の天気予報を知ることなので1日で十分でしょう。
1 dayを選びます。
次にHourly, Daily Weather Varuables
をそれぞれ選びます。
今回知りたいのは天気、厳密には雨が降るかどうか、つまり降水確率
それに加えて最高気温、最低気温程度なので
HourlyからPrecipitation probability
,
Daily からMaximum Temperature
, Minimum Temperature
を選択します。
後の設定は特に変更しないで大丈夫だと思います。
ほしいデータがある場合は各々その値を選択してください。
上記の設定をすると以下のようなグラフを得ることが出来ると思います。
グラフが表示されない場合はReload Chartを押してください。
このグラフの下にあるAPI URL(Open in new tab.....)の文をクリックすると以下のような.json形式のデータを入手することが出来ると思います。
実装
pythonで実装します。
Open-MeteoではPython形式のテンプレートが提供されています。
こちらを利用すると効率的に開発できると思います。
実装する際の注意点
指定した時間にメッセージを送るとき、サーバーの時刻は標準時であることに注意してください。
日本は標準時から9時間進んでいるので、指定した時間-9するか、
timezoneを使って時間を日本に合わせてください。
デプロイ
Railwayを利用しました。
制限はありますが、無料枠で利用することが出来ます。
今回のレベルのbotでしたら制限下でも十分に動きます。
下記サイトがとても参考になりました。
そのまま実行していただければデプロイできると思います。
完成
指定した日時に指定したチャンネルにメッセージが来たら完成です。
最後に
最後まで読んでいただきありがとうございました。
Open-Meteoは比較的簡単にデータを入手できるので初めて開発をしてみようという方におすすめです。
またRailwayも他と比べて簡単に使うことが出来るのでサーバーに迷っている人はぜひ使ってみてください。
Discussion