본문 바로가기

개발새발/Python

[Python] Telegram 메일 알람 챗봇 만들기 (2) : 텔레그램 챗봇 만들기

1편 링크 : https://dog-foooot.tistory.com/9

 

[Python] Telegram 메일 알람 챗봇 만들기 (1) : 네이버 메일 연동해서 제목, 내용 가져오기.

회사 동료분들과의 내기 덕분에 드디어 쓰는 메일 알람 챗봇 개발기. 2달 전 개발했던 코드라 잘 기억은 안 나지만 코드를 더듬어 보면서 다시 개발하는 기분을 느껴봅시다. imaplib 을 이용해서 메일 알람 봇을..

dog-foooot.tistory.com

1편에 이어서 2편에서 다뤄볼 내용은 텔레그램 챗봇과 관련된 부분이다.

 

전체 소스코드는 아래 링크를 참고하길 바랍니다.

https://github.com/Junnis0123/ChatBot

 

Junnis0123/ChatBot

Teletgram Bot. Contribute to Junnis0123/ChatBot development by creating an account on GitHub.

github.com

[소스코드]

import telegram
from telegram.ext import Updater, MessageHandler, Filters, CommandHandler  # import modules
import ParsingMail
from time import sleep
import threading, time

token = ''
chat_id = ''

# start
def start(bot, update) :
    global chat_id
    chat_id = update.message.chat.id
    update.message.reply_text('start to read mail.' )
        
    t = threading.Thread(target=Check_mail)
    t.daemon = True
    t.start()


# change from people
def chnage_from_people(bot, update) :
    name = update.message.text.split()
    if len(name) == 1:
        update.message.reply_text('Command is /change newName')
        return
    ParsingMail.change_from_name(name[1])
    update.message.reply_text('{}{}{}'.format('from person is  changed by ', name[1], ' ))


# print from people
def print_from_people(bot, update) :
    update.message.reply_text('{}{}{}'.format('To person is ', ParsingMail.get_name(), ' ))


#check Mail
def Check_mail():
    while True:
        count, data = ParsingMail.ConnectMailSvr()
        if count == 0:
            sleep(20)
            continue
        else:
            bot = telegram.Bot(token = token)
            bot.sendMessage(chat_id = chat_id, text='unseen mail is {}, new is {}'.format(count, len(data)))

            for mail in data:
                bot.sendMessage(chat_id = chat_id, text='subject : {}\ncontext : {}'.format(mail[0],mail[1]))
            sleep(60)
            

if __name__ == "__main__":

    updater = Updater(token)

    print_handler = CommandHandler('print', print_from_people)
    updater.dispatcher.add_handler(print_handler)

    change_handler = CommandHandler('change', chnage_from_people)
    updater.dispatcher.add_handler(change_handler)

    start_handler = CommandHandler('start', start)
    updater.dispatcher.add_handler(start_handler)

    updater.start_polling(timeout=3, clean=True)
    updater.idle()

텔레그램 봇을 이용하기 위해서는 토큰과 아이디가 필요하기 떄문에 전역변수로 선언했다.

토큰 같은 경우는 텔레그램을 설치하고 BotFather를 친구추가하면 발급받을 수 있다.

봇파더 친구추가후 /start 명령어를 입력하면 설명을해준다.

 

무수히 많은 메일봇 아이디 정하기 시도...

봇파더를 친구추가 하고 봇의 이름(중복허용)과 봇의 아이디(중복불가)를 정한다.

아무도 안 쓸 것 같은 아이디를 잘 찾아내면 Done! 과 함께 토큰을 날려준다. 안전하게 보관하라고도 말해준다.

이제 해당 토큰을 코드 빈 자리 토큰 란에 입력하면 된다.

 

챗봇 명령어들은 전부 함수로 나누어 작성했다.

커맨드 핸들러를 명령어, 함수로 생성하고 updater.dispacher에 핸들러를 등록해주면 해당 봇의 명령어가 추가된다.

핸들러, 업데이터 등은 텔레그램 lib에서 제공해주는 것을 가져다 사용했다.

 

나는 start 명령어를 입력받았을 때 수신자로부터 chat_id를 받아와 저장하고 저번 편에서 만들었던 ParseMail을 사용한 무한 루프 메일체크 함수를 구동하게 만들었다. 원하는 방식대로 사용하면 좋을 듯 하다.

챗봇의 구동 결과는 아래와 같다.