텔레그램 Cli – 파이썬 – 날씨 가져오기
텔레그램 챗 그룹에 ‘weather’ 혹은 ‘날씨’ 라고 입력하면 현재 날씨를 추력해주는 예제입니다. 파이썬을 이용해서 텔레그램 Cli 를 제어하는 방법을 설명하는 기초 예제입니다.
날씨 데이터는 OpenWeatherMap 에서 제공하는 날씨를 사용합니다. 이미 이 데이터를 쓰기 편하도록 라이브러리가 만들어져 있습니다. PyOWM 입니다.
PyOWM 설치
- sudo apt–get install python-pip
- sudo pip install pyowm
OpenWeatherMap 에서 데이터를 가져오기 위해서는 API_key 가 필요합니다. 아래 링크로 들어가서 간단한 회원 가입 후 API key를 적어둡니다.
http://openweathermap.org/register
PyOWM 라이브러리를 사용하는 방법은 아래 링크에서 확인.
소스코드는 아래와 같습니다.
#!/usr/bin/env python # -*- coding: utf-8 -*- """ An example to create a telegram bot which response to ping message in a specified chat group with flood control. The bot will exit when receive quit command from a specified user id. """ import sys from datetime import datetime, timedelta import pytg from pytg.utils import coroutine, broadcast from pytg.tg import ( dialog_list, chat_info, message, user_status, ) import pyowm # Global variables # Use your own settings grpname = 'Pi_test' username = 'YoungBae_Suh' weather_api_key = '96af81ab7e4c79776dd2304623d76e40' weather_location = 'Seoul,kr' telegram_path = '/home/pi/tg/telegram' pubkey = 'tg.pub' QUIT = False @coroutine def command_parser(chat_group, tg): global QUIT last_ping = None # To avoid ping flood attack, we'll respond to ping once every 10 sec mydelta = timedelta(seconds=10) try: while True: msg = (yield) # Only process if the group name match if msg['group'] == chat_group: cmd = msg['message'].strip().split(' ') if len(cmd) == 1: # ping command if cmd[0].lower() == 'ping': now = datetime.now() # simple ping flood control if not last_ping or (now - last_ping) >= mydelta: last_ping = now # Send pong respond to this chat group tg.msg(msg['cmdgroup'], 'pong') # weather command elif cmd[0].lower() == 'weather' or cmd[0] == '날씨': owm = pyowm.OWM(weather_api_key) obs = owm.weather_at_place(weather_location) w = obs.get_weather() report_str = w.get_detailed_status() report_str += ", " report_str += str(w.get_temperature(unit='celsius')['temp']) report_str += "'C, " report_str += str(w.get_humidity()) report_str += "%" tg.msg(msg['cmdgroup'], report_str) # quit command elif cmd[0].lower() == 'quit' and msg['cmduser'] == username: tg.msg(msg['cmdgroup'], 'HomeChat service ended by admin request.') QUIT = True except GeneratorExit: pass if __name__ == '__main__': # Instantiate Telegram class tg = pytg.Telegram(telegram_path, pubkey) # Create processing pipeline # Bot will respond to command the posted in this chat group pipeline = message(command_parser(grpname, tg)) # Register our processing pipeline tg.register_pipeline(pipeline) # Start telegram cli tg.start() while True: # Keep on polling so that messages will pass through our pipeline tg.poll() if QUIT == True: break # Quit gracefully tg.quit()
소스코드에서 pubkey, grpname, username, weather_api_key, weather_location 등의 변수 값은 자신의 설정에 맞게 변경해서 사용하세요.
# Global variables # Use your own settings grpname = 'Pi_test' username = 'YoungBae_Suh' weather_api_key = '96af81ab7e4c79776dd2304623d76e40' weather_location = 'Seoul,kr' telegram_path = '/home/pi/tg/telegram' pubkey = 'tg.pub' QUIT = False
‘weather’ 또는 ‘날씨’ 라는 단어에 반응하도록 추가한 코드는 아래와 같습니다.
# weather command elif cmd[0].lower() == 'weather' or cmd[0] == '날씨': owm = pyowm.OWM(weather_api_key) obs = owm.weather_at_place(weather_location) w = obs.get_weather() report_str = w.get_detailed_status() report_str += ", " report_str += str(w.get_temperature(unit='celsius')['temp']) report_str += "'C, " report_str += str(w.get_humidity()) report_str += "%" tg.msg(msg['cmdgroup'], report_str)
참고자료
- PyOWM official : https://github.com/csparpa/pyowm
- PyOWM example : https://github.com/csparpa/pyowm/wiki/Usage-examples