-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
미해결
텔레그램 봇에 기능을 추가하고 싶은데 잘 안되네요.. 도움을 요청 드립니다.
20.05.14 22:15 작성 조회수 336
1
안녕하세요.
파이썬 강의 잘 듣고 있습니다. 감사합니다.
텔레그램봇 만드는 수업을 토대로 제가 구현하고 싶은 기능이 있는데, 그게 잘 안되어서.... 혹시 한번 봐주실 수 있을까 하여
이렇게 질문을 드리게 되었습니다.
현재 구현된 상황은
1. 강좌를 따라서 텔레그램 봇은 만들어서 /weather은 작동 됨
2. 매일 중앙일보 사설 제목+링크를 출력하는 파이썬 파일 하나는 만듦
입니다.
여기서 제가 의견 말씀을 여쭙고자 하는 부분은
1. 아래의 코드를 토대로 모듈(클래스)만들기
2. 만들어진 모듈을 /weather과 마찬가지로 /ja 라고 치면 아래 내용 그대로 텔레그램에서 출력되도록 하기
입니다.
원활하게 파이썬, 웹크롤러를 다루고 싶은 마음이 큰데요,
좋은 강의를 만들어주신 덕분에 한 발짝씩 나아가고 있는 것 같습니다.
강사님 강의를 통해서 웹크롤링한 내용을 파이썬+장고+몽고db로 만든 웹사이트에 올리는 것
까지 해볼 수 있으면 좋겠네요 ㅎㅎ...
감사합니다!
답변을 작성해보세요.
0
남박사
지식공유자2020.05.21
응용의 영역은 끝도 없습니다. 궁금하신게 해결되셨고 기쁨을 느끼셨다니 제가 더 기쁜것 같습니다.
벌써 여러가지 계획이 있으신걸 보니 앞으로 더 기대됩니다. ^^
0
이준열
질문자2020.05.19
아! 정말 감사합니다!!
자꾸 안되다가 왜 안되지 싶어서 한참을 찾아봤는데,
telegram.py 에서도 datetime 같은 모듈을 다 불러와야 했군요 ㅎㅎㅎ
텔레그램으로 딱 메세지가 보내지는 걸 보고 얼마나 기쁘던지ㅠㅠ 정말 감사합니다.
요걸 좀 더 응용해서, 매일 모든 신문의 사설을 쭉 볼 수 있게끔도 해보고
aws 서버라던가 라즈베리 파이에서 파이썬 서버 구동하는것 등등도 좀 찾아봐야 겠습니다.
감사합니다!
0
남박사
지식공유자2020.05.16
올려주신 코드를 실행해보니 문제없이 잘 동작합니다. 잘 하신거 같은데요..
import requests
from bs4 import BeautifulSoup
from datetime import datetime
def get_news():
date = datetime.today().strftime("%Y-%m-%d")
url = "https://news.joins.com/opinion/editorialcolumn/list/1?filter=OnlyJoongang&date={}".format(date)
r = requests.get(url)
bs = BeautifulSoup(r.text, "lxml")
lists = bs.find_all("h2", {"class": "headline mg"})
results = []
for li in lists:
title = li.find("a").text
link = li.find("a")['href']
results.append((title, "https://news.joins.com" + link))
return results
if __name__ == "__main__":
get_news()
get_news() 함수의 리턴값을 작성하신것 처럼 그냥 문자열로 하셔도 상관없고 위처럼 title, 링크를 튜플로 묶어서 리스트에 추가 후 리스트를 리턴하는 형식으로 구현해도 됩니다. 튜플대신 dict 를 사용해도 되고 뭐 그 부분은 해당 데이터를 추후 어떻게 사용할지에 따라 좀 더 쉬운 구조를 선택하는게 좋습니다.
어쨌든 위 코드를 module.py 에 그대로 복사 붙여넣기 하시면 될듯 합니다. 구조가 복잡하거나 큰 사이즈가 아니라서 굳이 클래스로 만들필요까진 없어보입니다. 꼭 그래도 클래스로 구현해보고 싶다 하시면 다시 질문 주시기 바랍니다.
텔레그램 봇 파일에서 위처럼 module.py 의 전체(*) 를 import 하고 있기 때문에 특별히 따로 해줄건 없습니다.
if command == "/weather" or command == "/날씨":
# args 는 현재 리스트 형태기 때문에 리스트를 합쳐 하나의 str 변수로 만듭니다.
# 만약 사용자가 /weather 경 기 도 라고 입력했어도 문제없이 처리 할 수 있습니다.
args = " ".join(args)
# modules.py 에 선언된 get_weather 함수를 호출하여 결과를 받습니다.
weather = get_weather(args)
# 텔레그램으로 결과를 전송합니다.
bot.sendMessage(chat_id, weather)
elif command == "/ja" or command == "/뉴스":
news = get_news()
str_news = ""
for n in news:
str_news += "{}, {}\n".format(n[0], n[1])
bot.sendMessage(chat_id, str_news)
위처럼 기존의 명령어를 처리하는 코드에 elif 구문을 하나 추가하시고 해당 get_news() 함수를 호출해서 결과를 원하는 형태로 만들어서 bot.sendMessage() 에 넘기시면 될듯 합니다.
다른 궁금하신 사항이 있거나 답변이 부족하면 또 질문주시기 바랍니다.
답변 3