[Python] 파이썬으로 텔레그램에 문자 보내보기 Develop Tip

지난번에 파이썬으로 Slack으로 메시지 보내보기페이스북에 메시지 보내보기를 알아보았었습니다.
이번에는 텔레그램에 보내는 시도를 해 보았습니다.

페이스북에서 보내는 경우가 가장 쉬운 경우이고,
슬랙은 자신의 API 키와 특정 채널 별 웹훅을 이용하는 방법이었습니다.
하지만 텔레그램은 또 다른 방식의 챗봇 이라는 개념을 이용하더군요.
(아마 카톡의 플러스친구(구 옐로우아이디)도 같은 방법이 아닐까 싶습니다)

최근까지 Web API 3.0 이 텔레그램에서 발표되었는데
역시나 파이썬으로 잘 Wrapping 되어 있는 telepot 이라는 모듈을 이용하면 됩니다.

우선 텔레그램에서 봇을 만드는 방법을 살펴봅니다.


봇아버지를 이용해서 만들라고 되어 있습니다.
즉 아버지봇을 이용하여 봇을 만들고 그 봇을 이용하는 것이네요.

https://core.telegram.org/bots 링크를 누르면


위와 같이 텔레그램 앱을 띄운다고 나옵니다.
(이미 로컬에 텔레그램 앱이 설치되어 있다고 가정합니다)

그러면 BotFather에 접속되고 하단에 "start"를 누르면 채팅 창이 나옵니다.
이곳에 다음과 같은 방식으로 봇을 생성합니다.

제일 먼저 

/newbot

이라고 입력하고 엔터를 누르면, 봇을 뭐로 부를까 또 물어봅니다.

파이썬테스트봇 이라고 이름을 넣어주었습니다.

이제 id를 넣는데 bot으로 끝나는 것을 넣으라 하네요.

my_pytest_bot
이라고 주었습니다.

그러면 하단부에 빨간 부분으로 접근 토큰을 넣어줍니다.
시작부의 36... 숫자는 봇의 id가 됩니다.

이제는 링크에 보이는 것처럼

를 누르면 생성한 봇에 접근이 되는데 그 전에 파이썬 프로그램을 살펴보겠습니다.

다음과 같이 파이썬 프로그램을 작성해서 돌립니다.


#!/usr/bin/env python
# encoding=utf-8

from telepot import Bot, glance
from telepot.loop import MessageLoop
from time import sleep
import pprint


################################################################################
class MyPrettyPrinter(pprint.PrettyPrinter):
    def format(self, _object, context, maxlevels, level):
        if isinstance(_object, unicode):
            return "'%s'" % _object.encode('utf8'), True, False
        elif isinstance(_object, str):
            _object = unicode(_object,'utf8')
            return "'%s'" % _object.encode('utf8'), True, False
        return pprint.PrettyPrinter.format(self, _object, context,
                                           maxlevels, level)


################################################################################
def my_pprint(d):
    MyPrettyPrinter().pprint(d)


################################################################################
def handle(msg):
    my_pprint(msg)
    content_type, chat_type, chat_id = glance(msg)
    print(content_type, chat_type, chat_id)
    if content_type == 'text':
        bot.sendMessage(chat_id, 'Re: %s' % msg['text'])

################################################################################
bot = Bot('360789824:AAHPp5pu_.............................')

me = bot.getMe()
my_pprint(me)
MessageLoop(bot, handle).run_as_thread()
print ('Listening ...')

# Keep the program running.
while True:
    sleep(10)

위와 같이 작성된 파이썬 프로그램을 돌립니다.
주의할 것은 bot = Bot('...') 에서 Bot 인스턴스 생성 시 넣는 패러미터가
BotFather에서 마지막 부분에 보여주었던 자신의 Token 입니다.

우선 위의 프로그램을 돌리면,

{'first_name': '파이썬테스트봇',
 'id': 360789824,
 'username': 'my_pytest_bot'}
Listening ...

와 같은 결과가 나옵니다.

이것은 접속한 봇의 인스턴스를 리턴한 것인데,
처음 봇 이름은 "first_name"으로 들어가고,
봇의 ID가 있고 bot id는 "username"으로 들어가 있군요.

이제,


위와 같이 해당 텔레그램을 띄우도록 하면,

처음 하단에 "start" 를 누르면 디폴트로 

/start 

가 전달 됩니다.

그 아래에 "Re: /start start" 라고 에코 한 것은 위의 핸들러가 응답한 것입니다.

위와 같은 경우 핸들러에 출력한 것을 확인하면

{'chat': {'first_name': '채',
          'id': 50......,
          'last_name': '문창',
          'type': 'private'},
 'date': 1496801977,
 'entities': [{'length': 6, 'offset': 0, 'type': 'bot_command'}],
 'from': {'first_name': '채',
          'id': 50......,
          'last_name': '문창'},
 'message_id': 1,
 'text': '/start start'}
('text', u'private', 50.......)

와 같이 보입니다.

메시지에 chat 정보와 date 정보 및 실제 사용자인 from 정보가 있군요.

모두 'id' 부분에 (50...... 와 같이 8자리 숫자입니다) 보낸사람의 id 가 보입니다.

텔레그램의 API 중 sendMessage 는 바로 이 받을 사람 id 를 있어야 대상을 지정할 수 있습니다.
(물론 위와 같이 해당 대화방이 살아 있어야 보내는 것이 의미 있습니다)

그런데 구글링을 해 보면 이 채널의 보낸사람 (또는 보낼사람) ID를 구할 수 있는 방법은
핸들러를 이용하는 방법 혹은 getUpdates 를 호출하여 해당 대화방의 메시지를 구하는 
방법 밖에 없습니다.

암튼 핸들러는 핸들러대로 동작하여 ID를 처리한다고 가정하고
다른 파이썬 프로그램에서 아래와 같이,


#!/usr/bin/env python
# encoding=utf-8

from telepot import Bot
from pprint import pprint

bot = Bot('360789824:AAHPp5pu_...................................')

me = bot.getMe()
print(me)

response = bot.getUpdates()
pprint(response)
sid = 50......
sent = bot.sendMessage(sid, u'Hello 텔레그램?')
pprint(sent)

와 같이 동작시켜 보면,

잘 동작하는 것을 확인할 수 있었습니다.


어느 분께는 도움이 되셨기를...


덧글

  • Brightside 2017/09/07 23:35 # 삭제 답글

    재미있게 봤습니다 감사합니다^^
  • 지훈현서아빠 2017/09/11 12:43 #

    도움이 되셨다면 저의 보람입니다. ^^
  • 주아빠 2019/05/15 13:06 # 삭제 답글

    도움이 되었습니다! 좋은정보 감사합니다!!
  • 지훈현서아빠 2019/05/15 13:33 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트