Python으로 텔레그램 봇 만들기: 초보자를 위한 상세 가이드

오늘은 특별한 여정을 함께 떠나려 합니다. 바로 Python의 마법과 텔레그램(Telegram)의 강력한 API를 결합하여 여러분만의 지능적인 디지털 비서, 그러니까 '봇'을 창조하는 비밀에 대해 알아볼 거예요. 이 여정은 코드 한 줄, 아이디어 하나가 어떻게 실시간으로 소통하는 디지털 생명체로 변신하는지 지켜보는 흥미진진한 모험이 될 것입니다!
텔레그램은 단순한 메신저가 아니라 개발자들의 놀이터입니다. 256비트 암호화로 무장한 보안성, 클라우드 기반의 빠른 응답 속도, 그리고 무엇보다 개발자 친화적인 API가 여러분의 상상력을 현실로 구현할 수 있는 완벽한 환경을 제공합니다. 전 세계 7억 명 이상의 사용자와 소통할 수 있는 플랫폼, 그 중심에 여러분의 봇이 자리할 수 있다고 상상해 보세요!
여러분은 이 여정을 통해 날씨를 알려주는 친절한 비서, 영어 단어를 가르쳐주는 언어 선생님, 매일 아침 긍정적인 명언으로 하루를 시작하게 해주는 동기부여 코치를 만들 수도 있습니다. 또는 복잡한 데이터베이스와 연동하여 주식 정보를 실시간으로 제공하거나, AI 모델과 결합해 지능적인 대화가 가능한 디지털 친구를 만들 수도 있어요. 가능성은 무한합니다!
"하지만 저는 코딩을 잘 모르는데요..." 걱정 마세요! 이 여정은 초보자도 쉽게 따라올 수 있도록 가장 기초적인 단계부터 차근차근 안내해 드릴 예정입니다. Python의 우아한 문법과 텔레그램 API의 직관적인 구조 덕분에, 복잡한 프로그래밍 지식 없이도 멋진 봇을 만들 수 있답니다.
여러분의 첫 봇이 "안녕하세요!"라고 인사할 때의 그 짜릿함, 친구들이 여러분이 만든 봇과 대화하며 놀라워할 때의 그 뿌듯함을 함께 경험해보실래요?
지금 바로 키보드와 마우스를 준비하세요. Python과 텔레그램의 세계로 뛰어들어, 여러분만의 디지털 조수를 탄생시키는 마법 같은 여정이 시작됩니다. 이 모험에서 배우게 될 기술은 봇 개발을 넘어, 여러분의 프로그래밍 역량 전체를 한 단계 끌어올릴 것입니다.
-
텔레그램 계정: 텔레그램 앱을 설치하고 계정을 만드세요. (이미 있다면 바로 다음 단계로!)
-
텔레그램 봇 라이브러리: 우리는 python-telegram-bot라는 편리한 라이브러리를 사용할 거예요.
-
코딩 환경: 터미널과 코드 편집기(VS Code, PyCharm 등)를 준비하세요.
-
텔레그램 앱을 열고 검색창에 @BotFather를 입력하세요.
-
대화를 시작한 뒤 /start를 입력합니다.
-
/newbot 명령어를 입력하면 봇 이름을 물어볼 거예요. 예를 들어 "MyFirstBot"이라고 지어줄게요.
-
다음으로 봇의 사용자 이름을 설정합니다. 반드시 Bot으로 끝나야 해요. 예: @MyFirstBot.
-
성공하면 @BotFather가 API 토큰을 줍니다. 이 토큰은 봇과 텔레그램 서버를 연결하는 열쇠니 꼭 저장해두세요! 예시 토큰: 123456789:ABCDEF...
pip install python-telegram-bot
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
# BotFather에서 받은 토큰을 여기에 넣으세요
TOKEN = '123456789:ABCDEF...' # 여러분의 토큰으로 교체!
# 봇 객체 생성
updater = Updater(token=TOKEN, use_context=True)
dispatcher = updater.dispatcher
# /start 명령어에 반응하는 함수
def start(update, context):
context.bot.send_message(chat_id=update.effective_chat.id, text="안녕하세요! 저는 에코 봇이에요. 메시지를 보내면 똑같이 돌려줄게요!")
# 일반 메시지에 반응하는 함수
def echo(update, context):
message = update.message.text
context.bot.send_message(chat_id=update.effective_chat.id, text=message)
# 핸들러 추가
start_handler = CommandHandler('start', start)
echo_handler = MessageHandler(Filters.text & ~Filters.command, echo)
dispatcher.add_handler(start_handler)
dispatcher.add_handler(echo_handler)
# 봇 시작
updater.start_polling()
updater.idle()
-
TOKEN: BotFather에게 받은 API 토큰을 넣습니다.
-
Updater: 텔레그램 서버에서 메시지를 받아오는 역할을 합니다.
-
start(): 사용자가 /start를 입력하면 인사말을 보냅니다.
-
echo(): 사용자가 보낸 텍스트를 그대로 돌려줍니다.
-
start_polling(): 봇이 메시지를 계속 확인하도록 합니다.
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
# /start 명령어에 버튼 추가
def start(update, context):
keyboard = [
[InlineKeyboardButton("안녕!", callback_data='hello'),
InlineKeyboardButton("잘가!", callback_data='bye')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
context.bot.send_message(chat_id=update.effective_chat.id,
text="안녕하세요! 버튼을 눌러보세요.",
reply_markup=reply_markup)
# 버튼 클릭 처리
def button(update, context):
query = update.callback_query
query.answer() # 클릭 확인
if query.data == 'hello':
query.edit_message_text(text="안녕! 반갑습니다!")
elif query.data == 'bye':
query.edit_message_text(text="잘가요! 다음에 봐요!")
# 핸들러 추가
dispatcher.add_handler(CallbackQueryHandler(button))
# 나머지 코드는 그대로 (start_handler, echo_handler 등 추가 후 polling 시작)
-
InlineKeyboardButton: 버튼을 만듭니다. callback_data는 버튼을 구분하는 값이에요.
-
button(): 사용자가 버튼을 누르면 해당 데이터에 따라 메시지를 변경합니다.
-
CallbackQueryHandler: 버튼 클릭을 처리하는 핸들러를 추가했어요.
-
Heroku 계정을 만들고 CLI를 설치하세요.
-
프로젝트 폴더에 Procfile을 만들고 worker: python bot.py를 입력하세요.
-
requirements.txt에 python-telegram-bot를 추가하세요.
-
git init, heroku create, git push heroku main으로 배포합니다.
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
import requests
import random
# BotFather에서 받은 토큰
TOKEN = '123456789:ABCDEF...' # 여러분의 토큰으로 교체!
# OpenWeatherMap API 키 (무료로 가입 후 발급받아 사용하세요: https://openweathermap.org/)
WEATHER_API_KEY = 'your_openweathermap_api_key'
# 봇 객체 생성
updater = Updater(token=TOKEN, use_context=True)
dispatcher = updater.dispatcher
# 명언 리스트 (랜덤으로 선택될 예정)
QUOTES = [
"삶이 있는 한 희망은 있다 - 키케로",
"오늘을 붙잡아라 - 호라티우스",
"미래는 현재 우리가 무엇을 하느냐에 달려 있다 - 간디",
"가장 큰 위험은 위험을 감수하지 않는 것이다 - 마크 저커버그",
]
# /start 명령어에 반응
def start(update, context):
welcome_message = (
"안녕하세요! 저는 날씨와 명언을 알려주는 봇이에요.\n"
"명령어:\n"
"/weather <도시> - 해당 도시의 날씨를 알려줍니다 (예: /weather Seoul)\n"
"/quote - 랜덤 명언을 보내드려요!"
)
context.bot.send_message(chat_id=update.effective_chat.id, text=welcome_message)
# /weather 명령어로 날씨 정보 제공
def weather(update, context):
try:
# 사용자가 입력한 도시 이름 가져오기
city = " ".join(context.args) # 예: /weather Seoul
if not city:
context.bot.send_message(chat_id=update.effective_chat.id, text="도시 이름을 입력해주세요! 예: /weather Seoul")
return
# OpenWeatherMap API 호출
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={WEATHER_API_KEY}&units=metric&lang=ko"
response = requests.get(url).json()
if response.get("cod") != 200:
context.bot.send_message(chat_id=update.effective_chat.id, text="도시를 찾을 수 없어요. 다시 확인해주세요!")
return
# 날씨 정보 파싱
temp = response["main"]["temp"]
description = response["weather"][0]["description"]
message = f"{city}의 현재 날씨:\n온도: {temp}°C\n상태: {description}"
context.bot.send_message(chat_id=update.effective_chat.id, text=message)
except Exception as e:
context.bot.send_message(chat_id=update.effective_chat.id, text="오류가 발생했어요. 다시 시도해주세요!")
# /quote 명령어로 랜덤 명언 제공
def quote(update, context):
random_quote = random.choice(QUOTES)
context.bot.send_message(chat_id=update.effective_chat.id, text=random_quote)
# 알 수 없는 명령어 처리
def unknown(update, context):
context.bot.send_message(chat_id=update.effective_chat.id, text="알 수 없는 명령어예요. /start를 눌러 도움말을 확인하세요!")
# 핸들러 추가
start_handler = CommandHandler('start', start)
weather_handler = CommandHandler('weather', weather)
quote_handler = CommandHandler('quote', quote)
unknown_handler = MessageHandler(Filters.command, unknown)
dispatcher.add_handler(start_handler)
dispatcher.add_handler(weather_handler)
dispatcher.add_handler(quote_handler)
dispatcher.add_handler(unknown_handler)
# 봇 시작
updater.start_polling()
print("봇이 시작되었습니다!")
updater.idle()
-
새로운 기능:
-
/weather <도시>: OpenWeatherMap API를 사용해 실시간 날씨 정보를 가져옵니다. 예를 들어 /weather Seoul을 입력하면 서울의 현재 온도와 날씨 상태를 알려줍니다.
-
/quote: 미리 정의된 명언 리스트에서 랜덤으로 하나를 골라 사용자에게 보냅니다.
-
-
외부 API 활용:
-
requests 모듈을 사용해 OpenWeatherMap API에서 데이터를 가져옵니다. 이 API를 사용하려면 OpenWeatherMap에 가입해 무료 API 키를 발급받아 WEATHER_API_KEY에 넣어야 합니다.
-
-
에러 처리:
-
도시 이름을 잘못 입력하거나 API 호출이 실패하면 사용자에게 친절한 오류 메시지를 보냅니다.
-
알 수 없는 명령어가 입력되면 /start로 안내합니다.
-
-
필요한 설치:
-
pip install python-telegram-bot requests를 실행해 필요한 라이브러리를 설치하세요.
-
-
OpenWeatherMap에서 API 키를 발급받아 WEATHER_API_KEY에 입력합니다.
-
BotFather에서 받은 토큰을 TOKEN에 넣습니다.
-
python bot.py로 실행한 뒤, 텔레그램에서 봇을 찾아 /start, /weather Seoul, /quote를 테스트해보세요!
-
단순히 메시지를 되돌리는 대신 실생활에 유용한 날씨 정보와 영감을 주는 명언을 제공합니다.
-
외부 API를 연동해 동적인 데이터를 가져오며, 사용자가 입력한 값에 따라 반응이 달라지는 상호작용을 추가했습니다.
-
확장 가능성: 명언 리스트를 데이터베이스로 교체하거나, 다른 API(예: 뉴스, 환율)를 추가할 수 있습니다.