hello world 2014. 10. 31. 13:20

telegram-cli 이걸로 뭐하지?


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 를 사용합니다.


Docker - An open platform for distributed applications for developers and sysadmins. 

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 인증이 된다면 그때 다시 생각해 보는걸로...