본문 바로가기
프로그래밍/Python

[TELEGRAM BOT] 기상청의 위성 영상을 가져와서 Telegram bot에 보내기

by Ohdumak 2018. 10. 25.

[TELEGRAM BOT] 기상청의 위성 영상을 가져와서 Telegram bot 에 보내기


목표

아래 기상청 웹페이지의 위성 - 기본영상을 공공데이터포털을 이용하여 가져와서 Telegram bot에 보내는 방법을 설명한다.

http://www.weather.go.kr/weather/images/satellite_basic03.jsp


1. 공공데이터포털 가입 및 활용신청


위성영상정보조회서비스를 이용하기위해 아래 사이트에 접속하여 활용신청을 한다.

https://www.data.go.kr/dataset/15000363/openapi.do?mypageFlag=Y

여기서 발급되는 일반 인증키가 중요하다.



2. 위성 이미지 리스트를 요청해서 해당 최근 10개의 이미지를 GIF로 생성하여 파일로 떨어뜨린다.


이미지를 GIF로 변경하는 라이브러리는 images2gif를 이용하였다.

아래 웹사이트 참고

https://github.com/isaacgerg/images2gif



Python 구현

# -*- coding: utf-8 -*

import urllib.request
from urllib.parse import urlencode, quote_plus

# 위성 영상 이미지를 요청하기 위한 xml을 가져온다.
def getSateliteImageXml(dataStr, areaStr, dateStr):
    url = 'http://newsky2.kma.go.kr/FileService/SatlitVideoInfoService/InsightSatelite?'
    servicekey = 'ServiceKey=일반 인증키'

    queryParams = urlencode(
        {quote_plus('sat'): 'C', quote_plus('data'): dataStr, quote_plus('area'): areaStr, quote_plus('time'): dateStr})
    # 개발가이드의 방식을 동일하게 하면 %가 %25로 변경되어 정상 동작이 이뤄지지 않는다.
    # queryParams = '?' + urlencode({ quote_plus('ServiceKey') : '일반 인증키', quote_plus('sat') : 'C', quote_plus('data') : 'ir1', quote_plus('area') : 'cf', quote_plus('time') : '20151013' })
    request = urllib.request.Request(url + servicekey + queryParams)
    request.get_method = lambda: 'GET'
    response_body = urllib.request.urlopen(request).read().decode("utf-8")
    print(response_body)
    return response_body


# 위성 영상 이미지 URL을 가져온다. 기상청에서는 8개의 이미지를 사용하지만, 10개의 이미지를 사용한다.
def getSateliteImagesUrl(imagesUrl, response_body):
    from xml.etree.ElementTree import fromstring
    root = fromstring(response_body)
    for parent in root.getiterator():
        for child in parent:
            if child.tag == 'satImgC-file':
                print(child.tag, child.text)
                imagesUrl.append(child.text)
                count = len(imagesUrl)
                if count > 10:
                    imagesUrl.popleft()

# 위성 영상 이미지를 GIF로 변경한다.
def getSatelitGif(data, area):
    import datetime
    from collections import deque

    today = datetime.date.today()
    yesterday = today - datetime.timedelta(1)
    today.strftime('%Y%m%d')
    yesterday.strftime('%Y%m%d')

    imagesUrl = deque()
    # 영상구분(data) -적외영상(ir1), -가시영상(vis), -수증기영상(wv), -단파적외영상(swir), -합성영상(com), -적외강조영상(eir)
    # 지역구분(area) -전지구(cf), -아시아(a), -한반도(k), -한반도지역(lk)
    response_body = getSateliteImageXml(data, area, yesterday.strftime('%Y%m%d'))
    getSateliteImagesUrl(imagesUrl, response_body)
    response_body = getSateliteImageXml(data, area, today.strftime('%Y%m%d'))
    getSateliteImagesUrl(imagesUrl, response_body)

    from images2gif import writeGif
    import io
    from PIL import Image

    images = []
    for imageUrl in imagesUrl:
        file = io.BytesIO(urllib.request.urlopen(imageUrl).read())
        images.append(Image.open(file))

    filename = data + area + "_satelite_gif.gif"
    # GIF 파일 생성
    writeGif(filename, images, duration=0.5)
    return filename

getSatelitGif('ir1', 'k')
# getSatelitGif('vis', 'k')
# getSatelitGif('wv', 'k')
# getSatelitGif('swir', 'k')
# getSatelitGif('com', 'k')
# getSatelitGif('eir', 'k')


3. 해당 GIF 파일을 Telegram bot에 전달하는 방법


bot.sendVideo를 이용해서 GIF파일을 전달 할 수 있다.

def satelite_command(bot, update) :
    filename = InsightSatelite.getSatelitGif('ir1', 'k')
    # sendVideo를 사용해야 움직이는 영상이 전달 된다.
    bot.sendVideo(chat_id=update.message.chat_id, video=open(filename, 'rb'))
    # 아래 시도해 보았던 함수들에 정리
    # bot.sendPhoto(chat_id=update.message.chat_id, photo=open(filename, 'rb'))
    # bot.sendAnimation(chat_id=update.message.chat_id, animation=open(filename, 'rb'))
    # bot.sendDocument(chat_id=update.message.chat_id, document=open(filename, 'rb'))


4. 생성된 위성 GIF 파일 확인



728x90

'프로그래밍 > Python' 카테고리의 다른 글

[기상청 데이터 가져오기]  (0) 2018.08.13
BeautifulSoup 에러 발생 시 조치 방법  (0) 2018.08.09

댓글