728x90
[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 |
댓글