텔레그램 CLI 를 파이썬으로 제어하기 (PyTelegramBotAPI)
앞선 강좌에서 텔레그램 CLI 를 설치하고 메시지를 주고 받는 방법을 살펴 봤습니다.
이제 텔레그램 CLI 제어를 자동화하기 위해 파이썬 언어를 사용할 것입니다. 굳이 파이썬으로 이런 작업을 하는 이유는 텔레그램 제어를 다른 작업들과 연동하기 위함입니다. 예를 들어 카메라, FTP, 웹 서버 등등의 다양한 작업이 파이썬 언어로 가능하기 때문에 텔레그램도 파이썬으로 제어해 보는겁니다.
테스트를 위해서는 텔레그램 CLI 가 설치되어 있으며 기본적인 계정 설정이 완료된 상태여야 합니다.
pyTelegramBotAPI 를 이용한 제어 방법
이 방법은 최신 텔레그램 CLI 에서만 (v1.x) 지원됩니다. 대신 보다 막강한 텔레그램 연동이 가능해집니다.
텔레그램과 연동할 수 있는 파이썬 인터페이스는 크게 2가지가 있습니다.
- 파이썬 인터페이스 1 : https://github.com/eternnoir/pyTelegramBotAPI <<<<<<<<<<< 추천
- 파이썬 인터페이스 2 : https://github.com/leandrotoledo/python-telegram-bot
개인적인 생각으로는 1번 pyTelegramBotAPI 가 더 좋은듯 합니다. 여기서는 pyTelegramBotAPI 만 다루도록 하겠습니다.
아래 명령으로 텔레그램 파이썬 인터페이스 라이브러리를 설치합니다.
$ cd ~ $ mkdir tg/bot $ cd ~/tg/bot/ $ git clone https://github.com/eternnoir/pyTelegramBotAPI.git $ cd pyTelegramBotAPI $ sudo python setup.py install
주의!!! setup.py 인스톨 과정에서 setuptools 패키지를 찾을 수 없다고 에러가 뜨는 경우 아래 명령어로 setuptools를 설치하세요.
- $ sudo apt-get install python-setuptools
설치가 문제없이 완료되면 homechat.py 파일을 아래와 같이 생성해서 라즈베리파이에 업로드 합니다.
import telebot bot = telebot.TeleBot("your_TOKEN") @bot.message_handler(commands=['hello', 'start']) def send_welcome(message): bot.reply_to(message, "안녕하세요!!") @bot.message_handler(func=lambda message: True) def echo_all(message): bot.reply_to(message, message.text) bot.polling()
이 코드가 제대로 동작하기 위해서는 텔레그램 봇 Token이 필요합니다.
텔레그램 봇(Bot)이란 텔레그램에서 새롭게 선보이는 기능으로 Bot Father를 통해 개인 비서와 같은 Bot 가상 계정을 생성해주는 것입니다. 사용자가 Bot Father란 가상 계정을 통해 명령을 수행하면 개인 Bot 을 생성해줍니다. 사용자는 텔레그램 CLI를 통해 자신의 개인 봇 계정으로 들어오는 메시지를 확인하고, 그에 맞게 동작을 수행한 뒤 결과를 text, image, voice 등등으로 전달해줄 수 있습니다.
즉, 파이썬 텔레그램 인터페이스가 자신의 봇 계정의 메시지를 감시하고 그에 맞게 응답을 보내줄 수 있도록 API를 제공하는 구조입니다.
텔레그램 봇 TOKEN을 생성하려면 아래 링크가 알려주는 순서대로 따라하세요.
https://core.telegram.org/bots#botfather
봇을 생성하고 TOKEN을 받았으면 파이썬 소스코드에 입력합니다. 수정 후 /home/pi/tg/bot/ 디렉터리에 업로드하세요. 아래 명령으로 실행하고
$ python homechat.py
폰 또는 PC에서 텔레그램 접속해서 자신이 만든 봇 계정과 대화합니다.
/start 명령을 보냈을 때 [안녕하세요!!] 라고 응답을 주면 OK.
pyTelegramBotAPI 의 상세한 사용 방법은 프로젝트 홈페이지에서 확인 가능합니다.
https://github.com/eternnoir/pyTelegramBotAPI
테스트가 완료되면 homechat.py 파일은 지우세요.
$ rm homechat.py
Pexpect 를 이용한 제어 방법 (구버전 telegram cli 지원용)
시작하기 전에 필수 패키지를 설치합니다.
- sudo apt-get install python-pip
- sudo pip install pexpect
여기서 Pexpect 는 파이썬용 Expect-like 패키지입니다. 이게 뭐냐면 파이썬으로 특정 쉘 커맨드를 실행하고 (FTP, SSH, Telegram 등등 쉘로 실행 가능한 뭐든) 거기에 대한 응답이 어떻게 오는지 모니터링 해주는 패키지입니다.
예를 들어 FTP 를 파이썬에서 실행했다고 가정해보죠. 그럼 다음 화면은 ID 입력을 위한 대기상태가 될 수도 있고, 접속이 원활치 않아 에러 메시지가 출력 될 수도 있습니다. 이럴 때 Pexpect는 출력되는 메시지를 감시하다가 특정 조건이 되면 알려주므로, Pexpect 를 이용해서 다음에 입력해야 할 문자열(행동)을 정확히 알 수 있습니다.
이걸 Pexpect를 이용한 코드로 표현하면 다음과 같습니다.
# This connects to the openbsd ftp site and # downloads the recursive directory listing. import pexpect child = pexpect.spawn ('ftp ftp.openbsd.org') child.expect ('Name .*: ') child.sendline ('anonymous') child.expect ('Password:') child.sendline ('noah@example.com') child.expect ('ftp> ') child.sendline ('cd pub') child.expect('ftp> ') child.sendline ('get ls-lR.gz') child.expect('ftp> ') child.sendline ('bye')
FTP 로 접속해서 ID/PW 입력하고 특정 폴더로 이동해서 파일을 받아온 뒤 종료하는 작업을 Pexpect를 이용해서 수행한 코드입니다.
텔레그램도 이와 유사하게 제어할 수 있습니다.
#!usr/bin/env import pexpect import picamera import time contact = "Esteban_Suizo" msg = "Test from Python!!" img = "/home/pi/prueba.jpg" with picamera.PiCamera() as picam: picam.capture(img) picam.close() telegram = pexpect.spawn('./telegram -k tg-server.pub') telegram.expect('0m') telegram.sendline('msg ' + contact + ' ' + msg) telegram.sendline('send_photo ' + contact + ' ' + img) telegram.expect('100', timeout=1200) telegram.expect('photo') print ('We are awesome, the picture is sent!') telegram.expect('0m') telegram.sendline('quit')
위 코드는 텔레그램에 접속해서 메시지와 사진을 전송하고 종료하는 예제입니다.
이 방법은 메시지, 사진, 영상 또는 파일을 보낼 때 유용하게 사용할 수 있습니다. 다만 메시지를 받아서 뭔가를 처리하고자 할 때는 이 방법이 그리 유용하지 않습니다. 왜냐면 Pexpect를 이용해 어떤 메시지가 들어오는지 감시하는 부분이 계속 돌아가도록 처리해줘야 하거든요. 그래서 메시지를 받아서 뭔가를 해보고 싶은 경우 PyTelegramBotAPI 라는 라이브러리를 사용하기를 권장합니다.
참고자료
- Pexpect manual
- How Raspberry Pi can ease your life
- RASPBERRY PI TUTORIAL – USING PYTHON TELEGRAM
- Raspberry Pi: Control GPIO and your Pi Camera using your phone