본문 바로가기
IT & 코딩

[라즈베리파이] 텔레그램 메세지 보내기

by 에일라거 2017. 1. 31.

크게 다음 네가지 단계로 나뉜다.


1. Telegram CLI (Command Line Interface) 모듈 설치하기

2. bash 파일(*.sh)로 CLI 명령어 실행 배치파일 만들기

3. Python으로 텔레그램에 보낼 메세지를 제작하고, bash 파일 실행하기

4. 주기적으로 실행할 수 있도록 crontab 프로세스에 등록하기


Telegram CLI (Command Line Interface) 모듈 설치하기


Telegram CLI를 라즈베리파이에 설치하는 과정은 다음 블로그를 참조하자


 

[Telegram CLI] Python을 이용하여 Telegram Bot 만들기

사용 환경 : Linux Mint 17 Mate Telegram은 Lua Script로도 연동이 가능하지만, Python Script가 더 친숙하기에 Python과 연동하는 방법을 소개하려고 합니다. pyTelegramBotAPI를 이용하여 제어를 하는 방법입..

suspected.tistory.com

링크를 따라하기 전에, 다음 명령어로 현재 설치된 각종 모듈을 업데이트 & 업그레이드 해 준다.


sudo apt-get update

sudo apt-get upgrade


링크의 글을 참조하여 아래와 같이 따라하자

  * 폴더는 무시한다. 그냥 "cd ~" 명령어를 쳐서 그 위치에서 시작하자. 그러면 최종적으로 절대경로로 /home/pi/tg 폴더에 설치된다.

  * 1~4번까지는 설치 과정이고, 5번은 최초 인증 (카톡 PC버전 인증하듯이) 및 Telegram 실행하는 과정이다. 5번까지만 따라하면 된다.

  * 추가 : 4번 (make 명령어) 을 따라하려고 하면 에러가 날 텐데, 이게 라즈비안 OS 버전 업데이트랑 뭔가 관련이 있는 듯... 아래 링크를 보자.


 

Compile von Raspbian Buster failed · Issue #1610 · vysheng/tg

Hello, i will compile the code to the new Raspbian Buster. But i become the following issue. pi@raspberrypi:~/programs/tg $ ./configure checking for gcc... gcc checking whether the C compiler works...

github.com

  * 하나 더 추가 : 위 링크에 따라 make를 해도 아래와 같이 에러가 날 텐데, 이렇게 하자.


에러 화면 : Assertion '0' failed.


에러가 난 파일 (tg/tgl/mtproto-utils.c) 을 열어서 해당하는 줄을 강제로 주석처리


 

Can not connect (tgl/mtproto-utils.c:101: BN2ull: Assertion `0' failed) · Issue #1070 · vysheng/tg

hi this is my problem: pi@raspberrypi:~/tg $ bin/telegram-cli Telegram-cli version 1.4.1, Copyright (C) 2013-2015 Vitaly Valtman Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details typeshow...

github.com

요약하면,


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 프로세스에 등록하기


이 내용은... 일단 다음 글을 참조하자

 

[라즈베리파이] 유용한 리눅스 명령어들 몇개

메모 겸!맨날 까먹어서 여기 써놓고 조금씩 업데이트 해야겠다. 명령어 폴더 만들기: mkdir xxx 파일/폴더 이름 바꾸기: mv xxx yyy 파일/폴더 이동: mv xxx 다른경로/xxx (mv는 같은 경로에서 이름만 바

guzene.tistory.com

crontab에 테스트용으로 아래와 같이 프로세스를 등록했다.


* * * * * python /home/pi/Python/sendTelegramMsg.py


해석하면, 매 분 지정된 파일을 파이썬으로 실행한다는 뜻. 잘 오더라고... 이제 메세지 내용만 변경시켜 봐야겠다.

댓글