크게 다음 네가지 단계로 나뉜다.
1. Telegram CLI (Command Line Interface) 모듈 설치하기
2. bash 파일(*.sh)로 CLI 명령어 실행 배치파일 만들기
3. Python으로 텔레그램에 보낼 메세지를 제작하고, bash 파일 실행하기
4. 주기적으로 실행할 수 있도록 crontab 프로세스에 등록하기
Telegram CLI (Command Line Interface) 모듈 설치하기
Telegram CLI를 라즈베리파이에 설치하는 과정은 다음 블로그를 참조하자
링크를 따라하기 전에, 다음 명령어로 현재 설치된 각종 모듈을 업데이트 & 업그레이드 해 준다.
sudo apt-get update
sudo apt-get upgrade
링크의 글을 참조하여 아래와 같이 따라하자
* 폴더는 무시한다. 그냥 "cd ~" 명령어를 쳐서 그 위치에서 시작하자. 그러면 최종적으로 절대경로로 /home/pi/tg 폴더에 설치된다.
* 1~4번까지는 설치 과정이고, 5번은 최초 인증 (카톡 PC버전 인증하듯이) 및 Telegram 실행하는 과정이다. 5번까지만 따라하면 된다.
* 추가 : 4번 (make 명령어) 을 따라하려고 하면 에러가 날 텐데, 이게 라즈비안 OS 버전 업데이트랑 뭔가 관련이 있는 듯... 아래 링크를 보자.
* 하나 더 추가 : 위 링크에 따라 make를 해도 아래와 같이 에러가 날 텐데, 이렇게 하자.
에러 화면 : Assertion '0' failed.
에러가 난 파일 (tg/tgl/mtproto-utils.c) 을 열어서 해당하는 줄을 강제로 주석처리
요약하면,
1. 첫번째 링크 글의 1~3번까지 따라한다.
2. 라이브러리를 하나 더 설치한다 : sudo apt install libssl1.0-dev
3. tg 폴더 안에 "Makefile" 파일을 열어서 -Werror 부분 삭제
4. tg 폴더의 하위 폴더인 tgl 폴더 안에 mtproto-utils.c 파일을 열어서 위 그림과 같이 101, 115줄의 assert (0) 코드를 주석처리 : 링크에서 보면 위험하지만 어쨌든 되긴 한다고 써 있다...
5. make
make 후에, 맨 위 링크 글의 5번까지 따라하고 인증이 완료되어 Telegram CLI가 실행된 상태라면 메세지를 보낼 수가 있다. Telegram CLI가 종료되었으면 다음 내용을 적어서 Telegram CLI를 실행하고 테스트 메세지를 하나 보내보자. (tg 폴더 내에서 실행해보자)
./bin/telegram-cli -W
이렇게 치고 나면 Telegram CLI가 실행되고, 여기서 help 를 치면 각종 명령어 목록을 볼 수가 있다. 너무 종류가 많으니까 딱 두개만 소개하면...
msg <peer> <text> : 지정한 사용자에게 메세지를 보낸다.
quit: 실행된 CLI를 종료한다.
예제로 이렇게 쳐본다. msg 수신인 "Hello World!"
두번째 빨간색 칸에는 받는 사람의 아이디나 이름을 적으면 된다. 큰따옴표 없이 적는다. ID는 @부터 모두 다 적고, 사용자 이름으로 보낼 때는 이름에 빈칸이 있을 경우 빈칸은 "_" 으로 대체해서 보낸다. 예를 들어 이름이 GilDong Hong 인 경우: msg GilDong_Hong "Hello World!" 이렇게 적으면 메세지가 보내진다. 본인 이름을 적어서 메세지가 오는지 확인해보고, quit로 종료한다.
* 전화번호를 인증한 후에는, ./bin/telegram-cli -k tg-server.pub 명령어가 아니라 ./bin/telegram-cli -W 명령어로 CLI로 진입해야 한다. 그렇지 않으면, 메세지를 보낼 때 다음 에러가 난다.
에러 : can not parse arg #1
arg #1 이라는 게 2번째 argument 를 뜻하고, 그 얘기는 @으로 시작하는 저 ID를 인식하지 못한다는 얘기.... 아무튼 cli 진입시 명령어 옵션에 주의하자.
bash 파일(*.sh)로 CLI 명령어 실행 배치파일 만들기
모듈이 작동하는 것을 확인했으면 리눅스 배치파일을 만들어보자. nano 등의 에디터로 다음 내용을 작성한 후 저장한다.
#!/bin/bash
export user=$1
export contents=$2
/home/pi/tg/bin/telegram-cli -W -e "msg $user $contents"
exit
나같은 경우, 파이썬 코드와 연동해서 쓸 거라서 파이썬 코드들이 저장되어 있는 폴더에 저장했다. 편한 위치에 저장하자. 일단 내 저장 위치는 /home/pi/Python/send_telegram.sh 이다. 윈도우 등에서 별도 에디터로 만든 뒤 복사하지 말고, nano/vi 등으로 바로 생성 후 저장하자. 이상하게 에러가 나더라고... 저장 후에 권한을 755로 변경했다.
배치파일의 뜻은 다음과 같다.
#!/bin/bash : 이 배치파일을 해석할 인터프리터 지정
export user=$1 / export contents=$2 : bash 파일을 실행할 때 외부에서 별도로 지정할 수 있는 argument (1, 2)
/home/pi/tg/bin/telegram-cli -W -e "msg $user $contents" : 실행할 명령어
exit : 배치파일 종료
이 파일은 파이썬에서 실행하지 않고, 그냥 독립적으로 실행할 수도 있다. command line에서 아래와 같이 쳐 보자.
./send_telegram.sh GilDong_Hong 'Hello world'
GilDong_Hong 부분에 받는 사람의 이름/아이디를 넣어서 보내면, Telegram 메세지가 보내진다. 아까 bash 파일을 만들 때 export 구문을 통해 인수를 2개 지정했는데, 위와 같이 파일 바깥에서 실행할 때 인수를 줄줄이 적어줄 수 있다. 나같은 경우는 여기에 받는 사람은 나로 동일하지만 내용 부분이 계속 변경될 거라 이 bash 파일을 파이썬에서 실행하려고 한다. (예: 현재시간 보내기)
Python으로 텔레그램에 보낼 메세지를 제작하고, bash 파일 실행하기
파이썬 코드 자체는 엄청 간단하다.
#인코딩 명시
#-*- coding:utf-8 -*-
# 한글 인코딩 문제 해결: 아래와 같이 세 줄을 삽입하면 웬만한 한글 인코딩 문제는 없어진다. - Python 2 에서만 적용 가능!!
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import subprocess # bash 파일을 파이썬에서 실행하기 위해 불러들이는 라이브러리
import time # 현재 시각을 얻기 위해 불러들인 라이브러리
t=time.localtime() # 현재 시간을 얻는다
myMsg = '현재 시각은 %s 입니다.' % time.asctime(t) # 현재 시간을 출력할 양식을 골라서 Telegram에 보낼 메세지를 완성
subprocess.call(["/home/pi/Python/send_telegram.sh", "GilDong_Hong", myMsg]) # 메세지를 Telegram으로 보낸다.
파일은 /home/pi/Python/sendTelegramMsg.py 로 저장했다. 모든 줄에 주석을 달아놔서 코드 자체는 이해가 쉬울 거고... 여기서 인제 핵심이 myMsg에 뭘 실어 보낼거냐! 라는 거니까, 일단은 간단히 테스트용으로 현재 시각을 실어서 보냈고, 차차 필요한 내용으로 바꿔보려고 한다. 주의할 점은, subprocess.call 메소드 안에 bash 파일 경로를 절대경로로 모두 다 써 줘야 한다. 그렇지 않으면 crontab에서 실행되지 않는다.
주기적으로 실행할 수 있도록 crontab 프로세스에 등록하기
이 내용은... 일단 다음 글을 참조하자
crontab에 테스트용으로 아래와 같이 프로세스를 등록했다.
* * * * * python /home/pi/Python/sendTelegramMsg.py
해석하면, 매 분 지정된 파일을 파이썬으로 실행한다는 뜻. 잘 오더라고... 이제 메세지 내용만 변경시켜 봐야겠다.
댓글