• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

텔레그램 봇에 기능을 추가하고 싶은데 잘 안되네요.. 도움을 요청 드립니다.

20.05.14 22:15 작성 조회수 336

1

안녕하세요.

파이썬 강의 잘 듣고 있습니다. 감사합니다.

텔레그램봇 만드는 수업을 토대로 제가 구현하고 싶은 기능이 있는데, 그게 잘 안되어서.... 혹시 한번 봐주실 수 있을까 하여

이렇게 질문을 드리게 되었습니다.

현재 구현된 상황은

1. 강좌를 따라서 텔레그램 봇은 만들어서 /weather은 작동 됨

2. 매일 중앙일보 사설 제목+링크를 출력하는 파이썬 파일 하나는 만듦

입니다.

여기서 제가 의견 말씀을 여쭙고자 하는 부분은

1. 아래의 코드를 토대로 모듈(클래스)만들기

2. 만들어진 모듈을 /weather과 마찬가지로 /ja 라고 치면 아래 내용 그대로 텔레그램에서 출력되도록 하기

입니다. 

원활하게 파이썬, 웹크롤러를 다루고 싶은 마음이 큰데요,

좋은 강의를 만들어주신 덕분에 한 발짝씩 나아가고 있는 것 같습니다.

강사님 강의를 통해서 웹크롤링한 내용을 파이썬+장고+몽고db로 만든 웹사이트에 올리는 것

까지 해볼 수 있으면 좋겠네요 ㅎㅎ...

감사합니다!

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"})

    for li in lists:
        title = li.find("a").text
        link = li.find("a")['href']

        news = title, "https://news.joins.com"+link
        print(news)
        print("-"*20)

    return news

if __name__=="__main__":
    get_news()


답변 3

·

답변을 작성해보세요.

0

응용의 영역은 끝도 없습니다. 궁금하신게 해결되셨고 기쁨을 느끼셨다니 제가 더 기쁜것 같습니다. 

벌써 여러가지 계획이 있으신걸 보니 앞으로 더 기대됩니다. ^^

0

이준열님의 프로필

이준열

질문자

2020.05.19

아! 정말 감사합니다!!

자꾸 안되다가 왜 안되지 싶어서 한참을 찾아봤는데,

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 에 그대로 복사 붙여넣기 하시면 될듯 합니다. 구조가 복잡하거나 큰 사이즈가 아니라서 굳이 클래스로 만들필요까진 없어보입니다. 꼭 그래도 클래스로 구현해보고 싶다 하시면 다시 질문 주시기 바랍니다.

from modules import *

텔레그램 봇 파일에서 위처럼 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() 에 넘기시면 될듯 합니다.

다른 궁금하신 사항이 있거나 답변이 부족하면 또 질문주시기 바랍니다.