iTerm2
Python3

ポケモンターミナルを天気予報化する

この記事は信州大学 kstm Advent Calendar 2018の6日目の記事として書いています.


はじめに

皆さん,唐突ですが,ポケモンターミナルというものをご存知でしょうか.

iTerm2等で背景画像をポケモンにすることができるものです.

しかも,そのポケモンの数は719種類対応しており,ほとんどのポケモンを網羅しています.

話は変わりますが,最近,異常気象多いですよね.

研究室の学生をやっていると「雨が降る」とか「雷雨になりそう」となった時は早く帰りたくなるものです.

そこで,普段使うターミナルが「天気によって背景が変わるといいな」と思ったので今回の記事に至りました.

(要は暇つぶしです.)


準備

ポケモンターミナルをインストールしてください.

注意点として,Python 3.6以上の環境でないと動かないようです.

事前に環境を整えておくと良いでしょう.

詳しくはリンク先にインストール方法,より詳しい注意点などが書いてあるのでそれを参照して下さい.

筆者はiTerm2とTilix(OSはArchLinux)上での駆動を確認しています.


天気を取得する準備

今回は天気を取得する上でOpenWeatherMapsというサイトで提供されているAPIを使用します.

注意点として無料プランではAPIを叩くのは1分間60回までが上限とされています.

後々コードは示しますがコード自体はターミナルのタブを1つ開く毎に1回コールします.

1分間に連続して,タブ60個も開かないよね!?


1. こちらからアカウント登録して下さい.無料なので安心して下さい.

2. 登録完了後,ユーザーページに行くと下の項目にAPI Keyという項目(下の画像の黒いバーの部分)があります.この項目を控えて置いて下さい.あとで使用します.

api key.png


天気予報化のコード

まず,先ほど控えたAPI KeyをWEATHERAPPID,

天気予報して欲しい地域のエリア名をWEATHERPLACEという名前の環境変数で記録しておいてください.

天気予報して欲しい地域のエリア名の例はこちらのページで設定してみたい地域を調べて,出てきた結果に応じてやって見てください.

Screen Shot 2018-12-05 at 14.48.33.png

東京の場合は環境変数が以下のようになります.

WEATHERPLACE="Tokyo, JP"

下記コードについて,簡単に説明します.

実装時に天気で姿が変わるポケモンが適していると思ったので,

快晴:ポワルン 晴れの姿

曇り:ポワルン 普通の姿

雨・霧雨:ポワルン 雨の姿

雷雨:サンダー(伝説のポケモンだし,低確率でいいよね?

雪:ポワルン 雹の姿

その他:ポワルン 普通の姿

という感じにテキトーに組みました.

見にくいとか気に食わない点があれば,自分で別ポケモンの画像に差し替えてください.

あまりにもテキトーに組んだので文字が見にくいとかが発生してる.自分でも別ポケモンの背景選定している最中.


pokemonTerminalByweather.py

# -*- coding:utf-8 -*-

import os
import subprocess
import shlex
import urllib.request
import json

if __name__ == "__main__":
api_key = os.environ.get('WEATHERAPPID')
area_name = os.environ.get('WEATHERPLACE')
url = "http://api.openweathermap.org/data/2.5/forecast?"+"q="+area_name+"&units=metric"+"&appid="+api_key
source = urllib.request.urlopen(url)
data = json.loads(source.read())
num = data['list'][2]['weather'][0]['id']
if num/100 == 8:
if num%100:
cmd = "pokemon castform" #cloud
else:
cmd = "pokemon castform-sun" #clear
elif num/100 == 6:
cmd = "pokemon castform-hail" #snow
elif num/100 == 5 or num/100 == 3:
cmd = "pokemon castform-rain" #rain or drizzle
elif num/100 == 2:
cmd = "pokemon Zapdos" #thunderstorm
else:
cmd = "pokemon castform" #other
cmd = shlex.split(cmd)
ret = subprocess.check_output(cmd)
print(ret)


上記のコードを利用する場合,.zshrcや.bashrcへ以下を記入して終了です.

python pokemonTerminalByWeather.py

お疲れ様でした.