みなさんは忙しい朝、アラームを止めて、後20秒目を瞑っていたい、そんな気持ちになりませんか?
僕はなるんですが、そんな20秒で天気と気温を読み上げてくれたらいいな〜というiPhone使いのあなたにおすすめ、iOSアプリ「ショートカット」と「pythonista3 」を使って朝アラームを止めたら自動で天気と最高気温、最低気温を読み上げさせ、天気の画像を出力させてやろう!という記事です。
久しぶりの投稿になりすみません。ここ数日pythonの勉強をしていたら「ショートカット」と「pythonista3」を使って朝アラームを止めたら自動で天気を読み上げさせることが出来るのではないか?と思ってやってみたら出来てしまったのでこの記事を書くことにしました。思いの外難しくて時間がかかってしまいました。
フォルダの整備
pythonista3 を起動、This iPhoneの中にweatherというフォルダを作り、その中に以下のコードをweather.pyとして貼ります。このweatherというフォルダの中に天気に応じて出力したい画像をimportしてweather.py内の.JPGや.PNGの名前を写真の名前に変更します。(写真を参考にしてください)
pythonista3 内でプログラムの作成
pythonista3のソースコードは以下のようになります。
import requests import speech import time import datetime from PIL import Image speech.say("おはようございます。","ja-JP",0.5) dt_now = datetime.datetime.now() hour=dt_now.hour minute=dt_now.minute str1="ただいまの時刻は{}時{}分です。".format(hour,minute) speech.say(str1,"ja-JP",0.5) url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=130010' api_data1 = requests.get(url).json() data1 = api_data1['forecasts'][0]['telop'] if "雨" in data1: rainy=Image.open('rainy.PNG') rainy.show() elif "晴" in data1: sunny=Image.open('sunny.JPG') sunny.show() elif "雪" in data1: snowy=Image.open('snowy.PNG') snowy.show() else: cloudy=Image.open('cloudy.JPG') cloudy.show() tmp_max=api_data1['forecasts'][0]['temperature']['max'] if tmp_max is not None: tmp_max_cel = api_data1['forecasts'][0]['temperature']['max']['celsius'] tmp_min=api_data1['forecasts'][0]['temperature']['min'] if tmp_min is not None: tmp_mic_cel=api_data1['forecasts'][0]['temperature']['min']['celsius'] tokyo_w="今日の東京の天気は{}".format(data1) tokyo_t="最高気温は{}度".format(tmp_max_cel) tokyo_t_="最低気温は{}度です。".format(tmp_min_cel) speech.say(tokyo_w ,"ja-JP",0.5) time.sleep(0.3) speech.say(tokyo_t, "ja-JP",0.5) time.sleep(0.3) speech.say(tokyo_t_ ,"ja-JP",0.5) time.sleep(0.3) else: tokyo_w="今日の東京の天気は{}".format(data1) tokyo_t="最高気温は{}度です".format(tmp_max_cel) speech.say(tokyo_w, "ja-JP",0.5) time.sleep(0.3) speech.say(tokyo_t ,"ja-JP",0.5) time.sleep(0.3) else: tokyo_w="今日の東京の天気は{}です。".format(data1) speech.say(tokyo_w,"ja-JP",0.5) time.sleep(0.3) url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=110010' api_data2 = requests.get(url).json() data2 = api_data1['forecasts'][0]['telop'] if "雨" in data1 or "雨" in data2: speech.say("傘が必要です。","ja-JP",0.5)
requestsライブラリについてはStashからインストールしなければならないので注意。やり方は結構長いので別の方のブログにお任せします。
細かいコードの説明は省きます(いろんなブログを参考にしました。そちらの方がどう足掻いても詳しいので、キーワードを入れて検索してみると良いと思います)が、datetimeライブラリを使って時間を取得、requestsライブラリを使って天気や気温の情報を取得、speechライブラリを使って自動音声化しながら、timeライブラリを用いて発語タイミングを調節する感じです。この辺はうまくやる方法がありそう。このコードでは東京の天気を取得していますが他の都市にお住まいの方は取得対象のURLのcity=130010の6桁の数字を他の数字に変えます。livedoorこれを参考にしてください。PCからならうまく開けると思います。
また、最初に得た天気の情報に従って画像を出力するコードを書いています。
中盤のif 分岐は最低気温や最高気温は1日の中で5時14時くらいに取ることが多いですが、この時刻を過ぎるとデータが取得できないためエラーを吐いてしまう対策です。毎朝3時位に起きる方々はいらないと思います。
ショートカットの作成
これができたらショートカットを起動し、下部タブのオートメーションをタップ、オートメーションを下の写真のように作成します。
個人用オートメーションを作成→イベント内のアラームをタップ→スヌーズか停止かは好きな方を選択(僕は両方制作しました)→アクションを追加→スクリプティングから音量とpythonista3を開く、pythonistaでのスクリプトの実行が選択できます。
音量を100%に設定は自分の好きな音量に設定してください。この手順を入れることにより就寝前の設定音量が0でも爆音で喋ってくれます。オートメーションからpythonista3のスクリプトを実行させる際はThis iPhoneのフォルダからの相対PATHをちゃんと通してあげなければいけないみたいです。この場合は/weather/weather.pyでよさげ。今回のスクリプトは引数がいらないので空欄にしています。引数設定する際はなんか実行してくれないバグがあるとか聞いたことがあります。よく知らないですけど工夫すれば解決するみたいです。
課題
pythonista3はマナーモードだと音が出ないので寝る前にマナーモードを解除する必要がある。ショートカットはマナーモードオンオフには対応してないので手動でやる必要がある。通知がきたらうるさいのでおやすみモード併用が推奨。
やってみて
思ったより上手くいって感動しています。朝天気を調べる手間が要らないのは素敵ですね。ここ最近の自粛生活で天気関係ないのが欠点ですが、、
補足
pythonista3はあまり発展が少なく、勉強している人も少ないです。もっと発展的なUIの稼働やアプリの運用をしたい方は
amzn.to
がおすすめです。pythonista3の基本操作からちょっとした応用まで網羅的に記載されています。
Pythonista3で競技プログラミングを初めてみませんか?
syleir.hatenablog.com
pythonista3とショートカットの連携についてはこちらの記事もオススメです。
syleir.hatenablog.com