본문 바로가기
개발노트/기타 개발

텔레그램 봇 만들기 (2) - 텔레그램 봇 메세지핸들러 추가, 비동기 메인함수 사용

by 정느 2025. 3. 25.

기존에 혼자 텔레그램 봇을 가지고 놀 때

while(true)와 여러 꼼수를 사용해서 놀았었는데

이럴수가. 제공하는 핸들러 함수가 이미 있었다.

 

사실 라이브러리가 있는 시점에 없을리가 없긴 했지만

오늘 이것저것 손보다가 핸들러 함수를 찾게 되어 추가.

아래는 코드 예시이다.

 

요즘 GPT 겁나 좋다. 다 알려준다. 검색시간이 확 줄어듦. 와...

import asyncio
import pytz
from telegram import Bot
from telegram.ext import Application, CommandHandler
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.daily import DailyTrigger
from datetime import datetime

# 봇 설정
TOKEN = "YOUR_BOT_TOKEN"  # 실제 봇 토큰으로 교체
CHAT_ID = "YOUR_CHAT_ID"  # 알람을 보낼 채팅 ID (예: -1001234567890)

# 텔레그램 메시지 전송 함수
async def send_alarm():
    bot = Bot(token=TOKEN)
    await bot.send_message(chat_id=CHAT_ID, text="알람: 특정 시간이 되었습니다!")

# 알람 설정 함수 (예: 매일 10시 30분)
def schedule_alarm():
    scheduler = AsyncIOScheduler(timezone=pytz.timezone('Asia/Seoul'))  # 서울 시간대 설정
    scheduler.add_job(send_alarm, DailyTrigger(hour=10, minute=30))  # 매일 10:30에 알람 전송
    scheduler.start()

# /start 명령어 처리 함수
async def start(update, context):
    await update.message.reply_text('알람 봇에 오신 것을 환영합니다!')

# 비동기 main 함수
async def main():
    application = Application.builder().token(TOKEN).build()

    # /start 명령어 핸들러 등록. 테스트용임 이런식으로 추가하면 됩니다.
    application.add_handler(CommandHandler("start", start))

    # 알람 스케줄 설정
    schedule_alarm()

    # 폴링 시작 (봇이 메시지를 계속 듣게 함)
    await application.run_polling()
    
    # Graceful shutdown 처리 (필요시)
    await application.shutdown()  # 종료 시 shutdown 호출
    
if __name__ == '__main__':
    # 이미 실행 중인 이벤트 루프가 있을 때, 새로운 루프를 생성하지 않도록 처리
    import nest_asyncio
    nest_asyncio.apply()  # 이미 실행 중인 이벤트 루프에서 비동기 코드 실행 허용

    # 기존 이벤트 루프에서 main 함수 실행
    asyncio.get_event_loop().run_until_complete(main())

댓글