텔레그램 봇에 기능을 추가하고 싶은데 잘 안되네요.. 도움을 요청 드립니다.
455
작성한 질문수 3
안녕하세요.
파이썬 강의 잘 듣고 있습니다. 감사합니다.
텔레그램봇 만드는 수업을 토대로 제가 구현하고 싶은 기능이 있는데, 그게 잘 안되어서.... 혹시 한번 봐주실 수 있을까 하여
이렇게 질문을 드리게 되었습니다.
현재 구현된 상황은
1. 강좌를 따라서 텔레그램 봇은 만들어서 /weather은 작동 됨
2. 매일 중앙일보 사설 제목+링크를 출력하는 파이썬 파일 하나는 만듦
입니다.
여기서 제가 의견 말씀을 여쭙고자 하는 부분은
1. 아래의 코드를 토대로 모듈(클래스)만들기
2. 만들어진 모듈을 /weather과 마찬가지로 /ja 라고 치면 아래 내용 그대로 텔레그램에서 출력되도록 하기
입니다.
원활하게 파이썬, 웹크롤러를 다루고 싶은 마음이 큰데요,
좋은 강의를 만들어주신 덕분에 한 발짝씩 나아가고 있는 것 같습니다.
강사님 강의를 통해서 웹크롤링한 내용을 파이썬+장고+몽고db로 만든 웹사이트에 올리는 것
까지 해볼 수 있으면 좋겠네요 ㅎㅎ...
감사합니다!
답변 3
0
아! 정말 감사합니다!!
자꾸 안되다가 왜 안되지 싶어서 한참을 찾아봤는데,
telegram.py 에서도 datetime 같은 모듈을 다 불러와야 했군요 ㅎㅎㅎ
텔레그램으로 딱 메세지가 보내지는 걸 보고 얼마나 기쁘던지ㅠㅠ 정말 감사합니다.
요걸 좀 더 응용해서, 매일 모든 신문의 사설을 쭉 볼 수 있게끔도 해보고
aws 서버라던가 라즈베리 파이에서 파이썬 서버 구동하는것 등등도 좀 찾아봐야 겠습니다.
감사합니다!
0
올려주신 코드를 실행해보니 문제없이 잘 동작합니다. 잘 하신거 같은데요..
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() 에 넘기시면 될듯 합니다.
다른 궁금하신 사항이 있거나 답변이 부족하면 또 질문주시기 바랍니다.
38강 = 연산자 더하고 빼기
0
60
2
주석처리
0
116
1
함수의 파라미터값 msg
0
155
1
강의자료 이미지 안나옴
0
239
3
강의자료 질문 두번째
0
165
3
강의자료 관련 질문
0
116
1
파이썬 예외 처리 try / except 파일 처리 코드가 실행이 안됩니다.
0
235
1
소수 너무 어려워요
0
245
1
imagefont 함수 사용
0
239
1
pylint
0
357
1
add 함수 문의 ㅠㅠ
0
283
1
형식 문의드립니다.
0
209
1
변수 명을 왜 src, tar로 하셨는지 궁금합니다.
0
602
1
숫자야구 코드를 짜 봤는데 뭔가 이상합니다.
0
253
1
zsh: command not found: pylint
0
269
1
텔레그램 봇 만들기 코드 실행이 안됩니다 박사님..ㅠ
0
546
1
질문드립니다.
1
374
2
list.reverse() 출력에 대해서 질문있습니다.
1
433
1
데코레이터 함수 및 동작시간 질문입니다.~
1
323
2
opencv 사용하면서 궁금한점 (해상도)
1
781
1
질문드립니다.
1
299
1
아래 오류가 뜨면서 vscode가 컴파일이 되지 않는데.. 혹시 왜이럴까요?
1
445
1
크롤링안되는 현상 문의 드립니다.
1
421
1
파이썬 크롤링 관련 문의
1
277
1





