API엔드포인트 & API매개변수 - ISS머리 위 알리미
애플리케이션 프로그래밍 인터페이스(API)란?
- 일련의 명령, 함수, 프로토콜, 객체로 구성
- 프로그래머는 API를 이용해서 소프트웨어를 생성하거나 외부 시스템과 상호작용할 수 있음
- 프로그램과 외부 시스템 사이에 있는 일종의 장벽
- 외부 시스템과 상호작용하기 위해 우리가 할 수 있는 모든 것
ex)
식당 : 웹사이트
주방 : 데이터
메뉴 : API
API엔드포인트와 API호출하기
API엔드포인트
- 어떤 위치라고 생각할 수 있음
- 특정한 외부 서비스에서 데이터를 얻으려면 저장된 위치를 알고 있어야 함
- 보통은 그냥 URL
ISS API 가져오기
JSON Viewer Awesome설치
- 설치 후 트리 구조로 표시
- JSON 형태가 가볍고 빠르게 데이터를 다룰 수 있음
1️⃣ install after import requests
2️⃣ get메소드를 이용해 URL을 argument에 넣어주고 response에 저장
응답 다루기 : HTTP 코드, 예외, JSON데이터
우리가 API로부터 받을 수 있는 응답코드
- 404 : 우리가 찾는 것이 존재하지 않음
- 1XX : 뭔가 진행되고 있고 아직 최종이 아니라는 의미
- 2XX : 모든 게 잘 되었고 기대한 데이터를 받을 것이라는 의미
- 3XX : 권한이 없다는 뜻
- 4XX : 우리가 뭔가 잘못됐음
- 5XX : 요청을 한 서버가 잘못되었다는 의미(서버가 다운되었거나 다른 이슈가 있을 수 있음)
예외처리하기
모든 상태 코드 하나하나에 대해 예외를 생성하는 대신 간단히 requests모듈을 사용해서 처리
JSON데이터 받기
Kanye Rest API로 칸예 명언 앱 함수생성
1️⃣ import requests
2️⃣ requests.get()메소드로 API요청
3️⃣ response.raise_for_status()로 예외처리
4️⃣ JSON데이터 저장
5️⃣ quote 키 값 가져와서 적용
API 매개변수 이해하기: 일몰 시각과 현재 시각 매칭하기
- API 매개변수
ISS 머리 위 알리미 프로젝트
1️⃣ ISS 위치와 우리 위치를 비교
- 함수 생성
2️⃣ 현재 시간이 밤 시간인지 확인
- 함수 생성
3️⃣ 두 함수 반환값이 모두 True면 이메일 보내기
4️⃣ while 반복문으로 ISS가 머리 위에 있고 밤인지 계속 확인
- time모듈을 이용해 속도를 늦출 수 있음
Final Code
import requests
from datetime import datetime
import smtplib
import time
MY_EMAIL = "dahna0915@gmail.com"
MY_PASSWORD = "****************"
MY_LAT = 33.837805 # Your latitude
MY_LONG = -602.426264 # Your longitude
def is_iss_overhead():
response = requests.get(url="http://api.open-notify.org/iss-now.json")
response.raise_for_status()
data = response.json()
iss_latitude = float(data["iss_position"]["latitude"])
iss_longitude = float(data["iss_position"]["longitude"])
#Your position is within +5 or -5 degrees of the ISS position.
if MY_LAT-5 <= iss_longitude <= MY_LAT+5 and MY_LONG-5 <= iss_longitude <= MY_LONG+5:
return True
def is_night():
parameters = {
"lat": MY_LAT,
"lng": MY_LONG,
"formatted": 0,
}
response = requests.get("https://api.sunrise-sunset.org/json", params=parameters)
response.raise_for_status()
data = response.json()
sunrise = int(data["results"]["sunrise"].split("T")[1].split(":")[0])
sunset = int(data["results"]["sunset"].split("T")[1].split(":")[0])
time_now = datetime.now().hour
if time_now >= sunset or time_now <= sunrise:
return True
while True:
time.sleep(60)
if is_iss_overhead() and is_night():
connection = smtplib.SMTP("smtp.gmail.com")
connection.starttls()
connection.login(MY_EMAIL, MY_PASSWORD)
connection.sendmail(
from_addr=MY_EMAIL,
to_addrs=MY_EMAIL,
msg="Subject:Look Up\n\nThe ISS is avobe you in the sky."
)