Telegram(https://telegram.org) 이 국내에서 흥하게 되었는데, 이 텔레그램이 OPEN API 입니다.
telegram-cli 란 linux 용 프로그램입니다. 스크립트나 콘솔명령으로 메세지를 보낼 수 있습니다.
그럼 이걸로 뭘 하나 생각해 보니
1. 심심이
2. 카톡 미연시
3. 서버 제어 : http://truefeel.tistory.com/224
4. 장애 알림
5. REST 를 이용한 MSG 발송
등등.. 서버 프로그래머 입장에서 해보고 싶은게 많습니다.
서론은 여기까지.. 텔레그램을 깔아 봅시다.
Linux 에서 늘 하던데로 소스받고, configure , make 하면 끝~
https://github.com/vysheng/tg 에 잘 설명 되있습니다.
OS 는 CentOS 에 설치 했습니다.
1. 소스받고 압축 풀고
wget https://github.com/vysheng/tg/archive/master.zip -O tg-master.zip
unzip tg-master.zip && cd tg-master
2. 빌드에 필요한 패키지 깔고
sudo yum install lua-devel openssl-devel libconfig-devel readline-devel libevent-devel
3. 빌드하면 끝 !
./configure
make
이건 CentOS 7 얘기... 현실은
event-old.h: In function 'event_new':
event-old.h:16: error: implicit declaration of function 'malloc'
event-old.h:16: error: incompatible implicit declaration of built-in function 'malloc'
event-old.h: In function 'evtimer_new':
event-old.h:24: error: incompatible implicit declaration of built-in function 'malloc'
event-old.h: In function 'event_free':
event-old.h:33: error: implicit declaration of function 'free'
event-old.h:33: error: incompatible implicit declaration of built-in function 'free'
tgl-timers.c: In function 'tgl_timer_free':
tgl-timers.c:59: error: implicit declaration of function 'event_get_callback_arg'
tgl-timers.c:59: error: initialization makes pointer from integer without a cast
make: *** [objs/tgl-timers.o] Error 1
난 CentOS6 이지...
이럴땐 !! 예전이었다면 아둥바둥 왜 안되는지 알아보고, 이것저것 고쳐보고...했겠지만
이젠 Docker 를 사용합니다.
https://www.docker.com
설치와 사용법은 나중에 자세히 알아보고 docker 로 CentOS 7 환경을 올립니다.
[root@localhost ~]# docker pull centos
로 이미지 받아와서 들어가면 CentOS7 환경에서 작업할 수 있습니다.
[root@localhost ~]# docker run -i -t centos:centos7 /bin/bash
bash-4.2# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
위 예제로 들어가면 image 를 띄운거기 때문에 나오면 데이터가 다 없어집니다.
이미지와 컨테이너의 차이를 느껴보시고,
만약에 docker 안에서 port를 listen 할 일이 있다면 -p 옵션으로 포트도 포워딩 해줘야 합니다. -p 8080:8080 으로
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED ...
cd2b01f5645f centos:centos7 /bin/bash 2 minutes ago ...
9b05fb4f5b8f centos:centos6 /bin/bash 12 minutes ago ...
62368a818401 9b9939481a40 /bin/bash 16 hours ago ...
e9d15253d9d7 cc7c33cb9d68 /bin/bash 16 hours ago ...
당황하지 않고 사용한 컨테이너 ID를 찾아서 commit 하면 image 로 생성되어 다음에 작업했던데 부터 사용할 수 있습니다. 자세한 사용법은 나중에?
centos7 환경에선 잘 됩니다.
ar: creating libs/libtgl.a
a - ./objs/net.o
a - ./objs/mtproto-common.o
.......
a - ./objs/updates.o
a - ./objs/tgl-timers.o
a - ./objs/tools.o
gcc ./objs/main.o ./objs/loop.o ./objs/interface.o ./objs/lua-tg.o .........
telegram-cli 를 실행해서 내 번호를 등록합니다. 나중엔 ID만으로도 가입된다고 하니 기다려 봅시다.
bash-4.2# bin/telegram-cli
change_user_group: can't find the user telegramd to switch to
Telegram-cli version 1.1.0, Copyright (C) 2013-2014 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
I: config dir=[//.telegram-cli]
Telephone number (with '+' sign):
인증번호를 확인해서 넣어주면 사용이 가능합니다.
Telephone number (with '+' sign): +8210********
Code from sms (if you did not receive an SMS and want to be called, type "call"): 36692
>
어떻게 사용하는지 help 를 확인해 보면 주르륵~
help Prints this help
contact_list Prints contact list
stats For debug purpose
history <peer> [limit] [offset] Prints messages with this peer (most recent message lower). Also marks messages as read
dialog_list List of last conversations
send_photo <peer> <file> Sends photo to peer
send_video <peer> <file> Sends video to peer
send_audio <peer> <file> Sends audio to peer
send_document <peer> <file> Sends document to peer
send_text <peer> <file> Sends contents of text file as plain text message
chat_info <chat> Prints info about chat (id, members, admin, etc.)
user_info <user> Prints info about user (id, last online, phone)
fwd <peer> <msg-id> Forwards message to peer. Forward to secret chats is forbidden
fwd <peer> <msg-id> Forwards message media to peer. Forward to secret chats is forbidden. Result slightly differs from fwd
msg <peer> <text> Sends text message to peer
....
우선 주소를 등록하고 보내 봅니다.
> add_contact +8210******** yongdae kwon
yongdae kwon
> msg yongdae_kwon hello
[02:14] yongdae kwon <<< hello
잘 되네요 ( 주의 : firstname 과 lastname 사이에 '_' 를 넣으셔야 합니다. )
bash 에서 보내보겠습니다.
bash 에서 실행할때는 몇가지 옵션이 필요합니다. -k 로 인증키를 지정해주고 -W 옵션으로 지연처리?를 해주고..
bash-4.2# echo "msg yongdae_kwon hello" | bin/telegram-cli -k ./tg-server.pub -W
change_user_group: can't find the user telegramd to switch to
Telegram-cli version 1.1.0, Copyright (C) 2013-2014 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
I: config dir=[//.telegram-cli]
User Telegram updated photo
User SANGWOOK KWON updated photo
> msg yongdae_kwon hello
[03:22] yongdae kwon <<< hello
> All done. Exit
잘 보내집니다.
node.js 의 express 와 연결해서 보내봅시다.
javascript 를 추가 하고
var exec = require('child_process').exec;
app.get('/msg', function( req, res ) {
var _cmd = 'msg ' + req.param('id',null) + ' ' + req.param('msg',null);
console.log( _cmd );
exec( "echo '" + _cmd + "' | telegram-cli -k /home/tg-master/tg-server.pub -W " ,
function(err, stdout, stderr) {
if(err) {
console.log(err.message);
}
} );
res.send('send msg');
});
웹에서 접근하면~
잘 보내지네요.
Lua Script 를 이용하면 ( 참고 : http://truefeel.tistory.com/224 )
function on_msg_receive (msg)
if ( msg.text == 'hello' ) then
send_msg(msg.from.print_name, "world", ok_cb, false)
return
end
end
function ok_cb(extra, success, result)
end
스크립트와 함께 돌리면
bash-4.2# bin/telegram-cli -s ../hello.lua
change_user_group: can't find the user telegramd to switch to
Telegram-cli version 1.1.0, Copyright (C) 2013-2014 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
I: config dir=[//.telegram-cli]
*** lua: attempt to call a nil value
*** lua: attempt to call a nil value
*** lua: attempt to call a nil value
[03:30] yongdae kwon ««« hello
*** lua: attempt to call a nil value
[04:07] yongdae kwon <<< world
hello 라고 새로온 메세지에 wold 라고 보냅니다.
잘되네요...
쉘스크립트에 포함에서 사용해서 모니터링으로 사용해도 좋고,
돈을내고 문자서비스를 이용하는 대신 텔레그램을 사용하는 것도 나쁘진 않을것 같습니다.
하지만 내 전화번호로 인증해야하니 회사에서 사용하기는 그렇고, 나중에 ID 인증이 된다면 그때 다시 생각해 보는걸로...