API엔드포인트 & API매개변수 - ISS머리 위 알리미

애플리케이션 프로그래밍 인터페이스(API)란?

  • 일련의 명령, 함수, 프로토콜, 객체로 구성
  • 프로그래머는 API를 이용해서 소프트웨어를 생성하거나 외부 시스템과 상호작용할 수 있음
  • 프로그램과 외부 시스템 사이에 있는 일종의 장벽
  • 외부 시스템과 상호작용하기 위해 우리가 할 수 있는 모든 것 ex)
    식당 : 웹사이트
    주방 : 데이터
    메뉴 : API



API엔드포인트와 API호출하기

API엔드포인트

  • 어떤 위치라고 생각할 수 있음
  • 특정한 외부 서비스에서 데이터를 얻으려면 저장된 위치를 알고 있어야 함
  • 보통은 그냥 URL



ISS API 가져오기

JSON Viewer Awesome설치

1


  • 설치 후 트리 구조로 표시

2


  • JSON 형태가 가볍고 빠르게 데이터를 다룰 수 있음

1️⃣ install after import requests

2️⃣ get메소드를 이용해 URL을 argument에 넣어주고 response에 저장

3



응답 다루기 : HTTP 코드, 예외, JSON데이터

우리가 API로부터 받을 수 있는 응답코드

  • 404 : 우리가 찾는 것이 존재하지 않음
  • 1XX : 뭔가 진행되고 있고 아직 최종이 아니라는 의미
  • 2XX : 모든 게 잘 되었고 기대한 데이터를 받을 것이라는 의미
  • 3XX : 권한이 없다는 뜻
  • 4XX : 우리가 뭔가 잘못됐음
  • 5XX : 요청을 한 서버가 잘못되었다는 의미(서버가 다운되었거나 다른 이슈가 있을 수 있음)

HTTP Status Codes Glossary


예외처리하기

모든 상태 코드 하나하나에 대해 예외를 생성하는 대신 간단히 requests모듈을 사용해서 처리

4


JSON데이터 받기

5

🌏경도,위도 지도



Kanye Rest API로 칸예 명언 앱 함수생성

1️⃣ import requests

2️⃣ requests.get()메소드로 API요청

3️⃣ response.raise_for_status()로 예외처리

4️⃣ JSON데이터 저장

5️⃣ quote 키 값 가져와서 적용

6



API 매개변수 이해하기: 일몰 시각과 현재 시각 매칭하기

  • API 매개변수

7

8

9



ISS 머리 위 알리미 프로젝트

1️⃣ ISS 위치와 우리 위치를 비교

  • 함수 생성

2️⃣ 현재 시간이 밤 시간인지 확인

  • 함수 생성

10

3️⃣ 두 함수 반환값이 모두 True면 이메일 보내기

4️⃣ while 반복문으로 ISS가 머리 위에 있고 밤인지 계속 확인

  • time모듈을 이용해 속도를 늦출 수 있음

11



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."
        )