본문으로 바로가기

파이썬 텔레그램 봇 만들기 -3 : 날씨 검색봇

category Bot 2020. 7. 22. 22:27

 

사용할 코드

 

파이썬 구글 날씨 검색기(크롤러)를 만들기 : 모듈화와 핵심 팁

모듈 설치 요청 및 응답 등의 통신을 위한 requests 모듈을 설치합니다. pip install requests (crawling_blog) PS C:\Users\Desktop\pyqt\Example\begin_for_blog\2> pip install requests Collecting requests..

jvvp.tistory.com

지난 포스팅에 사용한 코드를 가지고 왔습니다.

더보기
import datetime
import requests
from bs4 import BeautifulSoup as bs

class GoogleWeather():
    url = 'https://www.google.com/search?q={}&rlz=1C1EJFA_enKR770KR770&oq=%EC%86%A1%ED%8C%8C%EA%B5%AC+%EB%82%A0%EC%94%A8&aqs=chrome..69i57.2835j0j8&sourceid=chrome&ie=UTF-8'
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
    }
    result = []
    def __init__(self, keyword=None):
        self.keyword = keyword

    def set_keyword(self, keyword):
        self.keyword = keyword
    
    def run(self):
        res = requests.get(self.url.format(self.keyword), headers=self.headers)
        self.parse_html(res.text)
        return res

    def parse_html(self, text):
        html = bs(text, 'html.parser')
        loc = html.find('div', {'id': 'wob_loc'})
        loc = loc.string if loc else loc
        time = html.find('div', {'id': 'wob_dts'})
        time = time.string if time else time
        status = html.find('span', {'id': 'wob_dc'})
        status = status.string if status else status

        now = datetime.datetime.now().replace(microsecond=0)
        self.result.append({
            'search_time': str(now),
            'loc': loc,
            'time': time,
            'status': status
        })

    def get_result(self):
        if self.result:
            return self.result[-1]
        else:
            return None

if __name__ == '__main__':
    crawler = GoogleWeather()
    while True:
        k = input('지역명 >> ')
        crawler.set_keyword(k + ' 날씨')
        crawler.run()
        r = crawler.get_result()
        for v in r.values(): print(v)
        print('-'*50)

 

 

 

파이썬 텔레그램 봇 만들기 -2 : 패키지 설치 및 에코봇 구현하기

telegram.ext.Updater — Python Telegram Bot 12.8 documentation The update queue that can be filled from the main thread. python-telegram-bot.readthedocs.io 파이썬 텔레그램 봇 만들기 -1 : API 토큰 발..

jvvp.tistory.com

간단하게 에코봇 만드는 것도 했었죠.

더보기
from telegram.ext import Updater, MessageHandler, Filters

def get_message(bot, update):
    chat_id = bot.message.chat.id
    msg = bot.message.text
    update.bot.send_message(chat_id, msg)
    

if __name__ == '__main__':
    token = '1305621209:AAHmugmzbjB1T7KcZmYe5nPuDEdk-MMdSSg'
    updater = Updater(token, use_context=True)

    message_handler = MessageHandler(Filters.text, get_message)
    updater.dispatcher.add_handler(message_handler)

    updater.start_polling()
    updater.idle()

 

구글 날씨 검색기(크롤러)와 연동 

다음과 같이 메시지를 처리하시면 되겠습니다.

 

1. /start 메시지 처리 -> 안내

2. 크롤러 수행

 1) 크롤러 정상적인 응답 -> 응답 데이터 전달

 2) 비정상적인 응답 -> 안내

 

 

같은 내용이어서 다른 포스팅의 사진을 가져왔습니다.

 

https://jvvp.tistory.com/1051?category=881176

 

크롤러의 결과 데이터가 None 이면 지역명을 다시 입력하라고 전달합니다.

 

전체 코드

from telegram.ext import Updater, MessageHandler, Filters
from crawler import *

def get_message(bot, update):
    chat_id = bot.message.chat.id
    msg = bot.message.text
    if msg == '/start':
        update.bot.send_message(chat_id, '날씨를 알려드립니다.')
        update.bot.send_message(chat_id, '지역명을 입력하세요.')
        return

    crawler.set_keyword(msg + ' 날씨')
    crawler.run()
    r = crawler.get_result()
    print(r)
    if r and r['loc']:
        send_msg = []
        for k, v in r.items():
            if k == 'loc':
                send_msg.append(f'지역명 : {v}')
            elif k == 'time':
                send_msg.append(f'시간대 : {v}')
            elif k == 'status':
                send_msg.append(f'날씨 : {v}')
        update.bot.send_message(chat_id, '\n'.join(send_msg))
    else:
        update.bot.send_message(chat_id, '검색 결과가 없습니다.')
        update.bot.send_message(chat_id, '지역명을 입력하세요.')

if __name__ == '__main__':
    crawler = GoogleWeather()
    
    token = 'Input your token'
    updater = Updater(token, use_context=True)
    message_handler = MessageHandler(Filters.text, get_message)
    updater.dispatcher.add_handler(message_handler)
    updater.start_polling()
    updater.idle()