파이썬으로 일기 예보를 LINE 알림

18169 단어 파이썬Line

개요


  • 일기 예보를 LINE으로 통지해 보았을 때의 메모입니다.
  • 사용한 언어는 Python3입니다.

  • 사용한 서비스 등


  • Python3
  • Weather Hacks
  • LINE Notify

  • 날씨 예보


  • livedoor의 Weather Hacks가 사전 등록 불필요하고 편했기 때문에 이용했습니다.

  • ぇ tp // 우아아테 r. 아오오오 r. 코 m/후우레카 st/우ぇb세 rゔぃ세/j 그런/v1 에 도시 코드를 쿼리하여 날씨 예보를 얻을 수 있습니다.
  • 취득 가능한 정보는 ぇ tp : // 우우 아테아 r. 아오오오 r. 코 m / 우에 아테 r_는 cks / 우에 bse r ゔ 를 참고로 했습니다.
  • 도시 코드는 h tp // w w. 뭐야. 이 m/에 tc/ぃゔぇㅇㅜㅜㅜㅜㅜㅜㅜ HTML 를 참고로 했습니다.
  • 일기 예보를 얻기위한 코드는 다음과 같습니다.
  • 
    WEATHER_URL="http://weather.livedoor.com/forecast/webservice/json/v1?city=%s"
    CITY_CODE="130010" # TOKYO
    
    def get_weather_info():
        try:
            url = WEATHER_URL % CITY_CODE
            html = urllib.request.urlopen(url)
            html_json = json.loads(html.read().decode('utf-8'))
        except Exception as e:
            print ("Exception Error: ", e)
            sys.exit(1)
        return html_json
    
  • 취득한 일기 예보를 LINE 통지용으로 성형하는 코드는 이하.
  • 예외 처리는 최저 기온이 돌아오지 않는 경우가 있었기 때문에.
  • 
    def set_weather_info(weather_json, day):
        max_temperature = None
        min_temperature = None
        try:
            date = weather_json['forecasts'][day]['date']
            weather = weather_json['forecasts'][day]['telop']
            max_temperature = weather_json['forecasts'][day]['temperature']['max']['celsius']
            min_temperature = weather_json['forecasts'][day]['temperature']['min']['celsius']
        except TypeError:
            # temperature data is None etc...
            pass
        msg = "%s\nweather: %s\nmin: %s\nmax: %s" % \
                   (date, weather, min_temperature, max_temperature)
        return msg
    

    LINE 알림


  • LINE Notify를 사용하여 LINE 알림을 실행합니다.

  • htps : // 후 fy 보 t. 네. 메/그럼/ 에서 등록하여 알림을 위한 토큰을 가져옵니다.

  • htps : // 나중에 fy-ap. 네. 메 / 아피 / 후 fy 에 토큰 및 알림 메시지를 POST합니다.
  • 
    LINE_TOKEN="xxxxxxxxxxxxxxxxxxxxx"
    LINE_NOTIFY_URL="https://notify-api.line.me/api/notify"
    
    def send_weather_info(msg):
        method = "POST"
        headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
        payload = {"message": msg}
        try:
            payload = urllib.parse.urlencode(payload).encode("utf-8")
            req = urllib.request.Request(
                url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
            urllib.request.urlopen(req)
        except Exception as e:
            print ("Exception Error: ", e)
            sys.exit(1)
    
    

    요약



    상기 내용을 정리한 코드는 하기

    weather.py
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import json
    import sys
    import urllib.parse
    import urllib.request
    
    # weather's API
    WEATHER_URL="http://weather.livedoor.com/forecast/webservice/json/v1?city=%s"
    CITY_CODE="130010" # TOKYO
    TODAY=0
    TOMMOROW=1
    
    # LINE notify's API
    LINE_TOKEN="xxxxxxxxxxxxxxxxxxxxx"
    LINE_NOTIFY_URL="https://notify-api.line.me/api/notify"
    
    def get_weather_info():
        try:
            url = WEATHER_URL % CITY_CODE
            html = urllib.request.urlopen(url)
            html_json = json.loads(html.read().decode('utf-8'))
        except Exception as e:
            print ("Exception Error: ", e)
            sys.exit(1)
        return html_json
    
    def set_weather_info(weather_json, day):
        min_temperature = None
        max_temperature = None
        try:
            date = weather_json['forecasts'][day]['date']
            weather = weather_json['forecasts'][day]['telop']
            max_temperature = weather_json['forecasts'][day]['temperature']['max']['celsius']
            min_temperature = weather_json['forecasts'][day]['temperature']['min']['celsius']
        except TypeError:
            # temperature data is None etc...
            pass
        msg = "%s\nweather: %s\nmin: %s\nmax: %s" % \
                   (date, weather, min_temperature, max_temperature)
        return msg
    
    def send_weather_info(msg):
        method = "POST"
        headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
        payload = {"message": msg}
        try:
            payload = urllib.parse.urlencode(payload).encode("utf-8")
            req = urllib.request.Request(
                url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
            urllib.request.urlopen(req)
        except Exception as e:
            print ("Exception Error: ", e)
            sys.exit(1)
    
    def main():
        weather_json = get_weather_info()
        for day in [TODAY, TOMMOROW]:
            msg = set_weather_info(weather_json, day)
            send_weather_info(msg)
    
    if __name__ == '__main__':
        main()
    

    실행 결과



    위의 코드를 실행하면 LINE Notify에서 아래와 같이 알림을 받을 수 있습니다.

    좋은 웹페이지 즐겨찾기