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


この記事は信州大学 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をWEATHERAPPID,
天気予報して欲しい地域のエリア名をWEATHERPLACEという名前の環境変数で記録しておいてください.
天気予報して欲しい地域のエリア名の例はこちらのページで設定してみたい地域を調べて,出てきた結果に応じてやって見てください.

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

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

お疲れ様でした.