본문 바로가기
SW programming/Telegram bot 프로젝트

[Python 텔레그램 봇] - 원하는 지역의 날씨 정보 알림

by 고뭉나무 2021. 5. 2.

 

프로그램 컨셉

- Weather bot 채팅 창에 '/날씨 부산'를 치면 원하는 결과를 알려준다.

- 그 결과는 네이버 검색에서 마치 '부산 날씨'를 검색해서 해당 날씨 정보이다.

- 날씨 정보로 현재 온도, 미세먼지(indicator), 어제 온도와 비교(cast)를 알려준다.

텔레그램 봇 weather 채팅창
네이버 - 부산 날씨 검색 결과

 

HTML 정보 읽어오기

today_area > main_info 박스 안에 아래 3가지 정보를 추출할 것이다.

- todaytemp (형식: span)

- cast_txt (형식: p)

- indicator (형식: span)

 

설치 라이브러리

총 4개를 설치해야 한다.

1) pip install telepot

2) pip install requests

3) pip install BeautifulSoup

4) pip install lxml

 

 

 

소스 코드

import telepot
import requests
from bs4 import BeautifulSoup

def get_weather(where):
     weather = ""
     #url의 where에 사용자 채팅에 보내는 지역이 들어간다.
     url = "https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query={}+날씨".format(where)
     r = requests.get(url)
     bs = BeautifulSoup(r.text, "lxml")
     weather_info = bs.select("div.today_area > div.main_info")

     if len(weather_info) > 0:
        temperature = bs.select("span.todaytemp")
        cast_text = bs.select("p.cast_txt")
        indicator = bs.select("span.indicator")

        if len(temperature) > 0 and len(cast_text) > 0 and len(indicator) > 0:
           temperature = temperature[0].text.strip()
           indicator = indicator[0].text.strip()
           txt = cast_text[0].text.strip()

           print(temperature, indicator, txt)
           #채팅창 답장으로 올 내용
           weather = "{}도\r\n{}\r\n{}".format(temperature, indicator, txt)
        return weather

Telegram_token = "개인 Token 정보"

def handler(msg):
	content_type, chat_type, chat_id, msg_date, msg_id = telepot.glance(msg, long=True)
    
    print(msg)
    
    #채팅 창에 문자열을 입력해야 하며 '/날씨 (지역)'을 쳤을 때 스페이스바 앞부분은 버림
    if content_type == "text":
       str_message = msg["text"]
       if str_message[0:1] == "/":
          args = str_message.split(" ")
          command = args[0]
          del args[0]
          
          #입력한 (지역)을 get_weather함수에 넘겨서 정보를 찾아 출력시킴
          if command == "/날씨":
             w = " ".join(args)
             weather = get_weather(w)
             bot.sendMessage(chat_id, weather)
             
bot = telepot.bot(Telegram_token)
bot.message_loop(handler, run_forever=True)
         

 

iterm 컴파일 결과

 

 

Telegram 결과

텔레그램 봇 weather 채팅창

 

위 글이 도움이 되셨나면, 아래 하트를 눌러주세요↓

감사합니다 \( ˆoˆ )/​

반응형

댓글