DAY33 APIからデータをもらってISSが頭上に来た時にメールして知らせるアプリを作る!
今回のレッスンはAPIを呼び出してデータを取得し、
自分のプログラムに活用する練習としてISSが見えそうな時にメールをする簡易アプリを作成します。
このサイトの時間帯近くにメールが送られると思います。
ではやってみます。
このコードの流れは
こんな感じです。
今回使うAPIを2つ紹介しておきます。
日の出日の入りのわかるAPI
緯度と経度を
https://api.sunrise-sunset.org/json
の後ろにパラメーターで入れることで日の出日の入りをjsonで出力してくれます。
ISS LOCATION NOWのリンクで常に今どこにいるかが緯度経度でjson出力されます。
まずこのサイトとかで自分の場所の緯度経度を取得します。
今回は大阪駅を観測場所にしています。
準備から。
import time
import requests
import datetime
import smtplib
import os
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
password = os.environ.get("PASSWORD") # 環境変数
my_email = os.environ.get("MY_EMAIL")
LAT = 34.700836
LON = 135.493179
params = {
"lat": LAT,
"lon": LON
}
今回もセキュリティとか実務も考えて環境変数を使っています。
dotenvはターミナルでpip install python-dotenv でインストールします。
requestsはapiからデータを取得する際に使うモジュール。
paramsは日の出日の入りの時間をapiから取得する際にいるリストです。
ISSの緯度経度の時にも使うため固定変数として格納しています。
夜の時間に限定した機能を実装
def night_time():
now = datetime.datetime.now()
response2 = requests.get(url="https://api.sunrise-sunset.org/json", params=params).json()
sunset_hour = response2["results"]["sunset"].split(":")[0]
sunrise_hour = response2["results"]["sunrise"].split(":")[0]
if now.hour > int(sunset_hour) or now.hour < int(sunrise_hour):
return True
夜じゃないと見えないので、夜だけの条件をファンクションとしています。
datetimeで今の日付を取得し、apiで日の出日の入り時間を取得しています。
●時だけわかればいいので、splitで:のつくところで分けて最初の数字だけ取得します。
今の時間が24時間換算で日の入り時刻よりあと、日の出時刻より前であれば
1つ目の上件が当てはまる= Trueというようにしています。
ISSが見える場所ならTrueを出力する機能を実装
def iss_overhead():
response = requests.get(url="http://api.open-notify.org/iss-now.json").json()
iss_lat = float(response["iss_position"]["latitude"])
iss_lon = float(response["iss_position"]["longitude"])
if LAT - 3 <= iss_lat <= LAT + 3 and LON - 3 <= iss_lon <= LON + 3:
return True
apiからjsonで取得したデータを緯度と経度の変数で格納したあと、
現在地とISSの緯度経度の差異が+-3の範囲でならTrueというようにしています。
60秒ごとにプログラムを回して該当したらメールを送る
while True:
time.sleep(60)
if night_time() and iss_overhead():
with smtplib.SMTP("smtp.gmail.com", port=587) as connection:
connection.starttls()
connection.login(user=my_email, password=password)
connection.sendmail(
from_addr=my_email,
to_addrs=my_email,
msg=f"Subject:find ISS!\n\nLook Up!")
break
whileを使って、2つの条件が重なったらメールを送るようにしています。
レッスンではbreakがなかったので、breakなかったら該当の時間になったら
1分ごとにメールが送られるんじゃないか?と思ったのですがどうなんでしょう。
テストしていないのでわかりませんが…
一応今回はPCで起動した場合でのコーディングですが、
毎日このプログラムを起動させるのであれば前回記事に書いた
pythonanywhereに登録するとPCを起動させずともクラウド上で動いてくれます。
Gitはこちら。