상세 컨텐츠

본문 제목

파이썬으로 텔레그램 봇 만들기 [3]

코딩/파이썬

by 몽당. 2023. 1. 1. 17:46

본문

2편에서는 파이썬을 통해 텔레그램 봇에서 메세지를 보내는 기능까지 구현해 보았습니다.

이번에는 저번에 이어 텔레그램 봇에게 어떠한 채팅을 치면 원하는 받아온 데이터를 답장해주는 기능을 만들어 보겠습니다!

일단 이번 포스팅에서는 채팅에 '달러'라는 단어가 들어있으면 봇이 인터넷에서 현재의 달러 환율 정보를 가져와 알려주는 기능을 구현해 보겠습니다.

 

인터넷에서 현재 달러 환율 데이터 받아오기

우선 가장 먼저 봇이 현재 환율을 알려주려면 인터넷에서 정보를 가져와야겠죠?

이것은 파이썬에서 인터넷의 정보를 받아오는 웹 스크래핑 기능을 이용해야합니다.

#requests 모듈, BeautifulSoup 모듈 불러오기

import requests 
from bs4 import BeautifulSoup 

#웹 스크래핑 기본 틀

#정보를 가져오려는 사이트 주소
url = "https://wise.com/kr/currency-converter/usd-to-krw-rate?amount=1" 
#requests 모듈을 통해 url 주소에서 정보를 모두 받아옴
req = requests.get(url)
#정보를 받아오는데 문제가 있으면 알려줌 (문제 없으면 그냥 진행)
req.raise_for_status()
#받아온 정보를 BeautifulSoup 모듈로 깔끔하게 정리
soup = BeautifulSoup(req.text,"html.parser")
#받아온 정보중 현재 달러값에 해당하는 부분 데이터를 dollar 변수에 저장
dollar = soup.find("td",class_="CurrencyConversionTable_CurrencyConversionTable
__Cell__7F10V CurrencyConversionTable_CurrencyConversionTable__Value__DqPpm").get_text()[:7]
 

이것이 파이썬에서 웹 스크래핑을 통해 달러 정보를 받아오는 코드입니다.

pip install requests
pip install bs4
 

웹 스크래핑을 하기 위해서는 위의 'requests', 'bs4(BeautifulSoup)' 2가지 모듈이 필요합니다. 따라서 이 모듈을 설치하기 위해 터미널에 위의 코드를 쳐서 다운로드 받아줍니다.

requests 모듈 다운로드

각 코드의 뜻은 주석에 달아놓았습니다. 이정도는 완전 기본 틀이라 인터넷 검색해보면 바로 이해하실 수 있을겁니다 :)

#받아온 정보중 현재 달러값에 해당하는 부분 데이터를 dollar 변수에 저장
dollar = soup.find("td",class_="CurrencyConversionTable_CurrencyConversionTable
__Cell__7F10V CurrencyConversionTable_CurrencyConversionTable__Value__DqPpm").get_text()[:7]
 

마지막 줄만 좀 더 알아보겠습니다.

정보를 가져오려는 주소에 들어가 F12를 눌러 개발자 모드를 열고 위의 빨간 네모 부분의 환율 정보를 클릭하면 오른쪽의 저 부분에 정보가 있는 것을 확인할 수 있습니다. 저 부분의 데이터를 가져오기 위해

1. 'td'라는 태그의 class가 "CurrencyConversionTable_CurrencyConversionTable__Cell__7F10V CurrencyConversionTable_CurrencyConversionTable__Value__DqPpm" 인 부분을 찾습니다.

 

2. .get_text()를 통해 데이터 값인 "1258.77000 KRW" 부분만 뽑아 줍니다.

 

3. 그후 [:7] 인덱싱을 통해 처음부터 7번째 글자까지의 정보만 잘라주었습니다. 이러면 "1258.77000 KRW" 중 "1258.77" 부분만 남게 됩니다.

 

그리고 이 "1258.77" 값은 dollar라는 변수에 담기게 됩니다.

 

텔레그램 봇을 이용해 얻어온 달러 데이터를 답장하는 기능

 

이제 텔레그램 봇에서 어떠한 단어를 전송하면 dollar값을 답장해주는 기능을 구현해봅시다.

#여러가지 텔레그램 관련 모듈 불러오기
from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
import logging

#자신의 봇 API키 값 저장
accessToken = "자신의 API키 값" 

#로깅
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.DEBUG)
logger = logging.getLogger(__name__)

#채팅을 치면 답장해주는 함수 만들기
def echo(update: Update, context: CallbackContext) -> None:
    text = update.message.text
    reply = "현재 환율을 보려면 '달러'를 입력해주세요."
    if '달러' in text:
        reply = "달러 환율 : " + dollar
      
    update.message.reply_text(reply)

#텔레그램 봇 기본 코드 (echo 함수 실행 및 계속 입력 대기)
updater = Updater(accessToken)
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.text, echo))
updater.start_polling()
updater.idle()
 

나머지는 거의 텔레그램 봇 기본 틀이고 echo 함수 쪽만 보겠습니다.

#채팅을 치면 답장해주는 함수 만들기
def echo(update: Update, context: CallbackContext) -> None:
    text = update.message.text
    reply = "현재 환율을 보려면 '달러'를 입력해주세요."
    if '달러' in text:
        reply = "달러 환율 : " + dollar
      
    update.message.reply_text(reply)
 

echo 함수를 지정해주고 유저가 채팅을 치면 그 데이터를 text라는 변수에 저장합니다. 그리고 "현재 환율을 보려면 '달러'를 입력해주세요." 라는 기본 답장을 reply 변수에 저장해둡니다.

 

if문을 통해 만약 유저가 친 채팅에 '달러'라는 단어가 포함되어있으면 reply 변수를 "달러 환율 : dollar 변수"로 바꿔줍니다. 이렇게 해주면 채팅에 '달러'라는 단어가 있으면 환율을 답장해주고 없으면 기본 답장인 "현재 환율을 보려면 '달러'를 입력해주세요." 를 답장합니다.

 

마지막으로 reply 값을 전달받아 reply_text 를 통해 답장하는 기능을 실행합니다.

 

최종 코드

 

이제 마지막으로 이 2개의 코드를 합쳐 봅시다!

from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
import logging
from bs4 import BeautifulSoup
import requests

url = "https://wise.com/kr/currency-converter/usd-to-krw-rate?amount=1"
req = requests.get(url)
req.raise_for_status()
soup = BeautifulSoup(req.text,"html.parser")

dollar = soup.find("td",class_="CurrencyConversionTable_CurrencyConversionTable__Cell__
7F10V CurrencyConversionTable_CurrencyConversionTable__Value__DqPpm").get_text()[:7]

accessToken = "자신의 봇 API키 값" 

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.DEBUG)
logger = logging.getLogger(__name__)

def echo(update: Update, context: CallbackContext) -> None:
    text = update.message.text
    reply = "현재 환율을 보려면 '달러'를 입력해주세요."
    if '달러' in text:
        reply = "달러 환율 : " + dollar
      
    update.message.reply_text(reply)

updater = Updater(accessToken)
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.text, echo))
updater.start_polling()
updater.idle()
 

최종 코드입니다! 두둥

근데 저는 이 코드를 비주얼 스튜디오 코드로 실행시키면 이렇게 계속 오류가 나서 온라인으로 실행시키니까 오류가 안뜨고 되더라구요..?? Filters를 import 할 수 없다는데 왜 그런지 아직도 모르겠습니다..ㅠ (아시는분은 댓글 부탁드려요..)

 

https://replit.com/~

 

Log In

Run code live in your browser. Write and run code in 50+ languages online with Replit, a powerful IDE, compiler, & interpreter.

replit.com

저는 온라인 컴파일러는 replit 사용합니다. (깔끔쓰 그잡채)

 

여기서 위의 코드를 실행시키면 뭔가 다라락 뜨면서 실행이 됩니다.

그리고 다시 저희가 만들었던 봇으로 돌아가서 채팅을 쳐봅시다ㅎ

그럼 이렇게 채팅에 '달러'가 있으면 달러 정보를, 없으면 기본 답장을 보내는 것을 확인할 수 있습니다!

 

이제 이 기능을 응용해서 다양하게 사용하면 여러가지 봇들을 만들어 볼 수 있을 것 같습니다ㅎ

테스트 삼아 네이버 증권 사이트에서 거래량 상위 종목들을 받아오는 봇도 한번 만들어 봤습니다.

 

이제 이 기능들을 어떻게 실제로 투자에 써먹을 수 있을지 고민좀 해봐야겠습니다ㅎ

 

그럼 좀 더 공부하고 새로운 기능으로 돌아오겠습니다.

 

뿅!

 

✔몽당의 코인 정보 텔레그램✔

https://t.me/mongdangcoin

 

몽당의 코인판 데굴데굴

크립토 정보와 투자일지 :) 블로그 https://blog.naver.com/mungyo7 일기장, 생각들 https://t.me/mongdangcoin

t.me

 

 

 

 

관련글 더보기

댓글 영역