UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY33 APIからデータをもらってISSが頭上に来た時にメールして知らせるアプリを作る!

今回のレッスンはAPIを呼び出してデータを取得し、

自分のプログラムに活用する練習としてISSが見えそうな時にメールをする簡易アプリを作成します。

 

 

このサイトの時間帯近くにメールが送られると思います。

lookup.kibo.space

 

 

ではやってみます。

このコードの流れは

  • 日の出日の入り時間をAPIで取得し、変数に入れる
  • ISSが自分の場所から見えそうな場所になるのを確認する
  • 時刻が夜かつISSが見えそうな場合にメールを送る

 

こんな感じです。

 

今回使うAPIを2つ紹介しておきます。

 

日の出日の入りのわかるAPI

sunrise-sunset.org

 

緯度と経度を

https://api.sunrise-sunset.org/json

の後ろにパラメーターで入れることで日の出日の入りをjsonで出力してくれます。

 

api.open-notify.org

 

ISS LOCATION NOWのリンクで常に今どこにいるかが緯度経度でjson出力されます。

 

 

 

まずこのサイトとかで自分の場所の緯度経度を取得します。

user.numazu-ct.ac.jp

 

今回は大阪駅を観測場所にしています。

 

準備から。

 

 

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はこちら。

github.com