텔레그램 챗 그룹에 ‘weather’ 혹은 ‘날씨’ 라고 입력하면 현재 날씨를 추력해주는 예제입니다. 파이썬을 이용해서 텔레그램 Cli 를 제어하는 방법을 설명하는 기초 예제입니다.

날씨 데이터는 OpenWeatherMap 에서 제공하는 날씨를 사용합니다. 이미 이 데이터를 쓰기 편하도록 라이브러리가 만들어져 있습니다. PyOWM 입니다.

 

PyOWM 설치

  • sudo aptget install python-pip
  • sudo pip install pyowm

 

OpenWeatherMap 에서 데이터를 가져오기 위해서는 API_key 가 필요합니다. 아래 링크로 들어가서 간단한 회원 가입 후 API key를 적어둡니다.

http://openweathermap.org/register

 

PyOWM 라이브러리를 사용하는 방법은 아래 링크에서 확인.

PyOWM 참고자료 링크, API document

 

소스코드는 아래와 같습니다.

 

#!/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)

 

참고자료