systemctl 로 telegram service 를 시작 하면 봇이 응답을 받지 않는 문제가 있네요...ㅠㅠ

 

해결 방법을 찾아 보고 있습니다.

 

혹여 잘 아시는 분은 댓글로 도움 부탁드립니다.


 

 

 

기존에 Telegram CLI 데몬을 등록하는 글을 작성한게 있는데 최근(?) Raspbian Wheez 에서 Raspbian Jessie 로 업데이트가 되면서

 

서비스를 관리하는 프로세스가 변경이 되었다. 리눅스의 커널이 올라가면서 init 프로세스에서 systemd 로 변경이 되었는데

 

사용법이 많이 달라져있다.

 

init 과 systemd 차이 또는 사용법은 구글링 해보면 많이 나오니 이 블로그에서는 Telegram CLI 를 어떻게 등록 하는지에 대해서만 포스팅 한다.

 

 

이 글의 라즈베리 파이 시작 프로그램 작성 방법은 Raspbian Jessie 버전에서 작동합니다.

 


 

 

기존에는 /etc/init.d/telegramd  라는 파일 이름으로 스크립트를 등록해서 사용 했었으나 이젠 해당 스크립트는 필요 없고 다음 순서대로 하면 된다.

 

1. telegram.service 파일 작성하기.

 

일단 Telegram CLI 를 pi 계정에서 사용하는 가정하에 다음과 같이 디렉토리를 생성한다.

 

 

[pi@/home/pi]$ mkdir -p /home/pi/.config/systemd/user

[pi@/home/pi]$ cd /home/pi/.config/systemd/user

 

디렉토리를 생성 하고 해당 경로로 이동한다.

 

vi 또는 nano 에디터를 이용해서 다음 내용의 파일을 telegram.service 파일로 생성한다.

 

[Unit]
Description=Telegram CLI Daemon

 

[Service]
Type=forking
ExecStart=/home/pi/tg/tg.sh start
ExecStop=/home/pi/tg/tg.sh stop

 

[Install]
WantedBy=default.target

 

빨간색 글씨로 표시된 부분은

 

2015/07/21 - [강좌/RaspberryPI 활용] - 라즈베리파이 Telegram BOT 만들기 4부 - Telegram CLI 데몬 실행 및 서비스 등록

 

이 링크에서 4. Telegram CLI 서비스 등록하기

 

에서 설명한 셀 스크립트를 그대로 활용 하는 부분이므로 해당 링크 글을 참조 한다.

 

위 내용을 저장하면 telegram.service 라는 파일이

 

/home/pi/.config/systemd/user/telegram.service 경로에 저장 된다.

 

이제 systemd 에 등록할 차례 이다.

 

2. 서비스 등록 하기

 

[pi@/home/pi]$ systemctl --user enable telegram.service

 

 

3. 서비스 시작 하기

 

[pi@/home/pi]$ systemctl --user start telegram.service

 

 

4. 서비스 상태 확인 하기

 

[pi@/home/pi]$ systemctl --user status telegram.service

 

 

 

 

[pi@/home/pi]$ systemctl --user status telegram.service

● telegram.service - Telegram CLI Daemon
   Loaded: loaded (/home/pi/.config/systemd/user/telegram.service; enabled)
   Active: active (running) since Mon 2016-07-25 15:03:26 KST; 18min ago
  Process: 702 ExecStart=/home/pi/tg/tg.sh start (code=exited, status=0/SUCCESS)
 Main PID: 707 (telegram-cli)
 

 

active(running) 이 되어 있는지 확인 한다.

 

 

[pi@/home/pi]$ ps -ef | grep telegram

pi         707   697  0 15:03 ?        00:00:00 /home/pi/tg/bin/telegram-cli -s /home/pi/tg/bot/basicbot.lua -L/var/log/telegram-cli.log -P 8080 -e contact_list -d
pi         885   716  0 15:24 pts/0    00:00:00 grep --color=auto telegram

 

위 명령어를 이용해서 Telegram CLI 프로세스가 실행 되고 있는지도 확인한다.

 

 

모든 과정이 끝났다.

 

이젠 라즈베리파이를 재부팅 해보고 Telegram CLI 가 부팅시 시작 되는지 확인해 본다.

  1. seohyeon 2016.11.27 16:20

    systemctl로 telegram service를 실행할 경우 telegram 봇은 인증부터 들어갑니다. 왜냐하면 systemctl이 찾고 있는 ~/.telegram-cli/는 저희가 위차가 /home/pi가 아닌 /root/.telegram-cli를 주목하고 있습니다. 그렇게 되면 telegram-cli.log는 사용자에게 [인증된 파일이 없습니다!]를 요청하게 되는거죠. 권한을 조금씩 수정하면 되긴 하지만 저 같은 경우에는 ~/tg 디렉토리와 ~/.telegram-cli 디렉토리를 /root 밑에 두고 tg.sh의 변수에서 설정한 경로와 telegram.service의 절대경로를 변경하여 해결하였습니다! 저보다 더 좋은 해결 방법을 알고 계시다면 댓글을 써주세요!

    • BlogIcon Acidpop acidpop 2016.12.05 09:20 신고

      제가 systemctl 을 제대로 이해하지 못하고 사용을 해서 그랬었군요.

      정말 좋은 정보 감사합니다.

    • BlogIcon xoskd 2017.03.25 21:48 신고

      root 폴더 접근이 허가가 안되는대 접근을 어떻게 해야되나여?

  2. bestbefore 2017.02.11 08:31

    라즈베리파이 3 Jessie 사용중입니다.

    자꾸 daemon 이 stopped 되어 작동을 안하는 문제가 있습니다.

    해당 글에 댓글대로 , ~/tg 폴더와 ~/.telegram-cli 폴더를 전부 /root 폴더 아래에 복사시켰습니다.

    tg.sh 같은 경우도

    ExecStart=/root/tg/tg.sh start
    ExecStop=/root/tg/tg.sh stop

    로 경로를 변경시켰습니다.

    telegram.service 역시

    [Service]
    Type=forking
    ExecStart=/root/tg/tg.sh start
    ExecStop=/root/tg/tg.sh stop

    로 경로를 변경시켰습니다.

    문제는 터미널에서 systemctl --user start telegram.service 를 실행시켰을때 에러가납니다

    Active: failed (Result: exit-code)
    Process: 1548 ExecStart= /root/tg/tg.sh start (code=exited, status=203/EXEC)

    라고 합니다.

    root 폴더가 일반적으로 접근허용이 안되있어서 그런가보다 하고 LXTerminal 에서 실행시켰는데 그래도 결국 실패했습니다;;

    systemctl --user enable telegram.service 라는 명령을 내렸을 때,

    Failed to get D-Bus connection: 명령을 허용하지 않음 이라고하네요

    혹시 이런 문제들에 대한 해결방법이나 조언 부탁드립니다.

    • BlogIcon Acidpop acidpop 2017.02.13 10:36 신고

      systemctl 명령을 사용하실때
      pi 계정에서 사용을 하셨나요?
      맨 앞에 sudo 명령을 붙여서 실행해보세요

  3. bestbefore 2017.02.14 05:13

    따로 계정을 생성하거나 추가/변경 시킨것은 없습니다.

    뭔가 꼬인거같아서 전부 지우고, 시작부터 /root 폴더에 전부 생성하였습니다.

    daemon 은 Running 상태이며, 8888포트로 메시지도 전달이 가능합니다.

    문제는 systemctl --user enable telegram.service 명령어가 여전히 먹히지 않습니다.

    LXTerminal 에서 sudo systemctl --user enable telegram.service 를 입력시 이번에는
    Failed to get D-Bus connection: 연결이 거부됨 이라고 합니다.

    일반 Terminal 에서 systemctl --user enable telegram.service 를 실행해보니 뭔가 telegram.service가 실행되었다고는 합니다.
    문제는, systemctl -- user start telegram.service 입력시 에러가 납니다.
    에러 내용은 :

    Job for telegram.service failed. See 'systemctl status telegram.service' and 'journalctl -xn' for details. 라고 하며

    systemctl --user enable telegram.service 입력시

    Loaded : loaded
    Active : failed (Result : exit-code)
    Process : 1647 ExecStart =/root/tg/tg.sh start( code =excited, status=203/EXEC)
    라고 합니다.


    telegram.service 를 라즈베리파이에 기본 설치되어있는 Text Editor로 만들었는데, 혹시 nano 에디터로 파일을 생성해야하는가요?
    아니면 chmod 로 실행권한을 줘야하나요?

    • BlogIcon Acidpop acidpop 2017.02.14 09:37 신고

      글쎄요...
      저도 systemctl 을 사용하고 있지 않아서
      정확한 답변을 드리기가 어렵습니다. ㅠㅠ

  4. BlogIcon xoskd 2017.03.25 22:16 신고

    Active: inactive (dead) 서비스 상태확인을하면 이글이 나옵니다

  5. xoskd 2017.04.10 13:37

    systemctl --user start telegram.service 실행시
    Job for telegram.service failed. See 'systemctl status telegram.service' and 'journalctl -xn' for details. 이렇게 뜨고
    앞에 sudo를 넣고 실행시에는
    Failed to get D-Bus connection: 연결이 거부됨
    연결이 거부됫다고 뜨네여

    • BlogIcon Acidpop acidpop 2017.04.10 13:53 신고

      일단
      /home/pi/.config/systemd/user/telegram.service

      이 파일이 정확히 있는지 확인해주시고
      이 파일 내용이

      [Unit]
      Description=Telegram CLI Daemon

      [Service]
      Type=forking
      ExecStart=/home/pi/tg/tg.sh start
      ExecStop=/home/pi/tg/tg.sh stop

      [Install]
      WantedBy=default.target


      위와 같이 되어 있는지 확인 하신 다음

      /home/pi/tg/tg.sh 파일이 있는지
      그리고 tg.sh start 또는 stop 이 제대로 작동하는지 확인 해주세요

      제 라즈베리파이에 설치된 버전은
      4.4.38-v7+ #938

      Raspbian GNU/Linux 8 (jessie)

      버전입니다.

      현재 제 시스템에서는

      systemctl --user start telegram.service

      위 명령 실행시 아무 메시지도 나오지 않고
      정상적으로 실행이 되어 있습니다.

      systemctl --user status

      위 명령을 실행 하면 아래와 같이 나옵니다.

      telegram.service
      ● telegram.service - Telegram CLI Daemon
      Loaded: loaded (/home/pi/.config/systemd/user/telegram.service; disabled)
      Active: active (running) since Mon 2017-04-10 13:45:41 KST; 5s ago
      Process: 23150 ExecStart=/home/pi/tg/tg.sh start (code=exited, status=0/SUCCESS)
      Main PID: 23156 (telegram-cli)
      CGroup: /user.slice/user-1000.slice/user@1000.service/telegram.service
      └─23156 /home/pi/tg/bin/telegram-cli -s /home/pi/tg/bot/acidpopbot.lua -L/var/log/telegram-cli.log -P 8888 -e contact_list -d


      혹시 user 디렉토리를 본인 ID 로 만드신건 아니신지요

  6. BlogIcon xoskd 2017.04.10 23:10 신고

    pi@raspberrypi:~ $ systemctl --user status telegram.service
    ● telegram.service - Telegram CLI Daemon
    Loaded: loaded (/home/pi/.config/systemd/user/telegram.service; enabled)
    Active: inactive (dead) since 월 2017-04-10 22:18:09 KST; 40s ago
    Process: 8743 ExecStop=/home/pi/tg/tg.sh stop (code=exited, status=0/SUCCESS)
    Process: 8738 ExecStart=/home/pi/tg/tg.sh start (code=exited, status=0/SUCCESS)

    Warning: Unit file changed on disk, 'systemctl --user daemon-reload' recommended.
    실행시 이렇게 뜹니다
    파일다 제대로있고 경로도 같습니다

    • BlogIcon xoskd 2017.04.10 23:11 신고

      user 디텍토리 본인 ID라는건 뭔지 잘 모르겠네여
      Linux raspberrypi 4.4.50-v7+ #970
      라즈베리 설치버전입니다

    • BlogIcon xoskd 2017.04.10 23:15 신고

      혹시 라즈베리파이 설정에
      boot 값을 To Desktop 에서
      To CLI로 변경해야되나여?

    • BlogIcon Acidpop acidpop 2017.04.10 23:39 신고

      일단 systemctl 을 꼭 사용하셔야 할 이유가 있나요?
      굳이 필요 없으시다면
      /etc/rc.local

      을 vim 등의 편집기를 이용해 수정해주세요

      sudo vim /etc/rc.local

      exit 0 바로 윗 라인에

      su - pi -c "/home/pi/tg/tg.sh start"

      이 명령을 추가해 주시면
      부팅시 telegram-cli 가 실행 됩니다.


      그리고 실행 상태 여부는
      /home/pi/tg/tg.sh chk

      이 명령으로 체크하세요

      systemctl 쓰지 않으시는걸 추천드려요

    • BlogIcon xoskd 2017.04.10 23:42 신고

      #Make sure that the script will "exit 0" on success or any other
      이 문장 위에다가
      su - pi -c "/home/pi/tg/tg.sh start"
      이줄을 추가시키면되나여??

    • BlogIcon Acidpop acidpop 2017.04.10 23:54 신고

      맨 아래에 보시면 exit 0 가 있습니다

      그거 바로 위에 써주시면 되요

  7. gawoon 2017.10.02 21:04

    위와 같이 해도 안되어서 raspberrypi.org에서 해답을 찾았습니다.
    파이가 너무 빨라져서 생기는 문제인것 같습니다. ^^;
    /etc/rc.local 파일에 아래 두 줄을 삽입해서 해결했습니다.
    sleep 15
    su - pi -c "/home/pi/tg/tg.sh start"

 

 

XPEnology DSM 5.2 에 Telegram CLI 설치하기

 

 


 

 

XPEnolgy DSM 5.2 기준으로 설명합니다.

 

 

 

 

1. 패키지센터에서 debian - chroot 설치 필요

 

 

 

패키지 센터에서 설정 버튼 클릭

 

 

설정 화면에서 패키지 소스 탭을 클릭

 

추가 버튼을 클릭하고 다음 정보를 추가한다.

 

이름 : synocommunity

위치 : http://packages.synocommunity.com

 

 

 

일반 탭으로 이동한 다음 신뢰 수준을 "모든 게시자" 로 변경한다.

 

 

 

 

패키지 센터에서 커뮤니티를 선택 하고 Debian Chroot 를 설치한다.

 

 

 

 

설치가 완료 되면 작업을 클릭 한 다음 실행을 눌러 Debian Chroot 를 실행한다.

 

 

 

 

2. XPEnology 에 SSH로 접속을 한다.

 

Shell 환경에서 다음 명령어를 입력한다.

 

chroot /volume1/@appstore/debian-chroot/var/chroottarget bash

 

volume1 은 Debian Chroot 가 설치된 곳으로 지정해준다.

 

위 명령을 실행하면 기존의 Shell 과는 다른 Bash Shell 이 실행 된다.

 

 Acidpop_NAS> chroot /volume1/@appstore/debian-chroot/var/chroottarget bash
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.utf8)
root@Acidpop_NAS:/#

 

/# 으로 시작 되는 Shell 이 나온다면 Debian Chroot 로 들어오게 된것이다.

 

이제 다음 명령어들을 차례대로 입력한다.

 

 

1. home 디렉토리로 이동

cd /home/

 

2. apt 소스 업데이트

apt-get update

 

3. 텔레그램에 필요한 라이브러리 설치 및 git, sqlite 설치

apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev make git-core python2.7-dev libjansson-dev sqlite3

 

4. Telegram CLI 소스 체크아웃
git clone --recursive https://github.com/vysheng/tg.git && cd tg

 

5. Telegram CLI Make 파일 생성

./configure


6. 소스 컴파일

make

 

 

위 명령들을 수행 하게 되면 Debian Chroot 아래에 Telegram CLI 가 설치된다.

 

나머지는 Telegram CLI BOT 강좌를 참고해서 응용하면 된다

 

 

단, BOT 강좌에 올려둔 lua 스크립트와 shell 스크립트는 Raspberry pi 기준으로 작성된 것이기 떄문에 작동이 안되는부분이 존재 할 수 있다.

 

 

 


 

Debian Chroot 한글 깨짐 현상 해결 하기

 

apt-get install locales

dpkg-reconfigure locales

 

위 명령어를 수행 한 다음 아래 목록에 있는 항목을 선택한다.

 

en_US.UTF-8

ko_KR.UTF-8

 

선택하고 OK하면 한글 깨짐 현상이 사라진다.

 

 

 


 

 

vim 설치하기

 

apt-get install vim

 

vi명령어를 vim으로 수정

vim /etc/profile

 

맨 아랫줄에 다음 구문 추가

 

alias vi='vim'

 

파일 저장 후 다음 명령 수행

source /etc/profile

 


 

https://github.com/acidpop/acidpop_tgbot.git

 

github 에 올려둔 bot 확인 결과 어느정도는 정상적으로 확인되는걸로 보입니다.

 

단, lua 스크립트와 shell 스크립트 내부에 /home/pi/tg 로 되어 있는 경로를 /home/tg 이렇게 수정을 해야 합니다.

 

XPEnology 전용 BOT 을 개발 해 봐야 할듯 합니다. ^^;


 

 

 

현재 XPEnology DSM 5.2 update 2에 시험적으로 설치해본 결과 컴파일 잘 되고 실행 잘 됩니다.

 

Docker 를 이용하는 방법도 있는것 같은데 Docker를 이용하게 되면 메모리를 너무 많이 차지 하게 될거 같더군요..

 

 

 

아래는 사용 예제입니다.

 

 

 

 

  1. BlogIcon 하얀바나나우유 2015.09.01 12:49 신고

    오오, 고맙습니다.

    XPEnology 전용 bot 개발 해주세요 ㅎ
    XPEnology 에서 트랜스미션 다운로드 완료알림 과 DSM 메시지를 텔레그램으로 받고 싶습니다.

    소중한 정보 고맙습니다.

    • BlogIcon Acidpop acidpop 2015.09.01 13:17 신고

      시간이 되는데로 해보겠습니다 ^^;
      당장은 시간이 없어서 좀 어렵습니다..

      정 급하시면 제 블로그에 있는 내용을 토대로 약간만 수정하시면 작동을 하긴 합니다

    • 하얀바나나우유 2015.10.02 02:02

      추석 잘 보내셨나요?ㅎ
      https://github.com/acidpop/acidpop_tgbot.git
      를 다운받아 사용해보려했는데 트랜스미션 다운로드 완료시 알림 받는 기능은 없는듯 싶어서요. 제가 트랜스미션 사용중이라...
      그리고 저번의 DSM 알림도 텔레그램으로 받고 싶습니다.

      개인적으로 Flexget 도 사용하는데...
      http://flexget.com/wiki/Plugins/pushbullet
      Flexget 알림을 pushbullet 으로 받는데 이것도 텔레그램으로 받을 수 있을까요?
      Flexget 에는 아직 텔레그램 plugin 이 없는거 같습니다 ㅠ.ㅜ

    • BlogIcon Acidpop acidpop 2015.10.02 10:26 신고

      안녕하세요.

      트랜스 미션의 다운로드 완료 알람은 스크립트를 이용하시면 됩니다.

      1. 트랜스미션 서비스를 중단.
      2. 트랜스미션의 settings.json 파일을 수정
      - script-torrent-done-enabled": false 이 부분의 false 를 true 로 변경
      - script-torrent-done-filename": ""
      큰 따옴표 안에 실행 할 쉘 스크립트 경로와 파일 이름을 넣어주세요. (예 : /volume1/homes/admin/trnoty.sh)



      쉘 스크립트 내용은 다음과 같이 작성 하시면 됩니다.

      #! /bin/sh

      echo "msg 홍길동 $TR_TORRENT_NAME 다운로드 완료" | nc localhost 8888

      작성 하신 다음 실행 권한을 줍니다.
      sudo chmod 755 /volume1/homes/admin/trnoty.sh

      이렇게 하시고 트랜스 미션 서비스를 다시 시작 하시면 됩니다.

      트랜스 미션에서 script-torrent-done-filename 이 부분에 쉘 스크립트 경로를 입력 하면
      몇몇 변수를 사용 하실 수 있습니다.
      •TR_APP_VERSION
      •TR_TIME_LOCALTIME
      •TR_TORRENT_DIR
      •TR_TORRENT_HASH
      •TR_TORRENT_ID
      •TR_TORRENT_NAME

      자세한 사항은 https://trac.transmissionbt.com/wiki/Scripts
      여기를 참고하시면 되구요.

      flexget 은 제가 사용을 안해서 잘은 모르겠네요 ^^;

    • 하얀바나나우유 2015.10.03 03:32

      알려 주신 방법은 전부터 그렇게 사용하고 있습니다. Pushbullet 으로 알림을 받고 있죠.
      이걸 텔레그램 봇으로 알림을 받으려면 sh 내부에 텔레그램 관련 명령어 같은것들을 넣어할텐데 그걸 모릅니다.

      | nc localhost 8888
      뒤에 이부분이 텔레그램으로 봇으로 알림을 받는 부분인가요?

    • BlogIcon Acidpop acidpop 2015.10.05 15:29 신고

      chroot_debian 에서 텔레그램 실행 하실때
      -P 8888 이 옵션이 8888 포트로 오는 내용을 받겠다 라는 의미 입니다.
      즉, 8888 포트로 텔레그램 CLI 메시지를 보내면 똑같이 작동 하는구조구요.
      nc 는 netcat 이라고 리눅스용 유틸리티 입니다.

      echo "msg 홍길동 $TR_TORRENT_NAME 다운로드 완료" | nc localhost 8888

      위와 같이 수행 하면 8888 포트로
      "msg 홍길동 $TR_TORRENT_NAME 다운로드 완료"
      라는 텍스트를 그대로 전송 하게 해주는 유틸리티입니다.

  2. BlogIcon Shekinah 2015.09.02 11:47 신고

    debian을 다시 재설치하고 재부팅하니 apt-get이 되네요~ usr/bin/ 경로에는 파일이 없지만요~

    텔레그램 설치를 하고 폰 번호를 입력하는 부분에서 잘못 입력했는데, 수정하는 방법을 못찾겠네요...

    그리고 home 폴더에 직접 winscp로 접속해서 인증파일을 삭제하고 다시 해보려고했더니, home폴더는 volume1에 보이지 않네요~ㅠ

    또한, vovox나 textplus 어플로 생성한 번호는 죄다 맞지 않는다고 뜨네요...

    답변 감사드립니다~

    • BlogIcon Acidpop acidpop 2015.09.02 11:57 신고

      debian chroot 쉘로 접속 하셨다면

      chroot 접속(실행)한 상태에서

      cd /root 로 가셔서
      ls -al 이라고 쳐보면

      .telegram-cli 이 디렉토리가 보일겁니다.

      rm -rf ./.telegram-cli

      이렇게 삭제 하시고 다시 실행하시면 됩니다.

      textplus 는 안되나요?
      앞에 국가코드까지 다 넣으셔야 됩니다.
      만약 대한민국 국적번호로 111-2222
      라면 "+821112222"

      이렇게 +기호화 국가코드 그리고 전화번호가 들어가야 합니다.


      그리고 home 폴더는 DSM 관리 웹페이지 가셔서
      제어판 -> 사용자 -> 고급 탭 -> 사용자 홈 서비스 활성화
      이걸 체크 하셔야 보입니다.

    • BlogIcon Shekinah 2015.09.02 12:18 신고

      특이하게, 명령어로 치면 root/home/ 폴더에 접근이 가능한데
      winscp 같이 ui로 봐지는 것에는 home폴더를 못찾겠네요~
      사용자 홈 서비스 활성화는 해놨구요~

      내컴퓨터에서 \\\나스이름\ 으로 들어가면 home폴더는 보이지만 설치한 텔레그램 폴더가 보이지 않는 현상이네요..

      뭐 putty로 접근이 가능하니 별 문제될건 없는 것 같구요.

      textplus번호나 다른 어플 번호는 텔레그램에서 막은 것 같네요~
      pc버전으로 인증받으려고하니 올바른 번호가 아니라고 뜹니다...

      인증문제부터 해결해야겠네요 ㅠ 감사합니다~

    • BlogIcon Acidpop acidpop 2015.09.02 12:57 신고

      winscp 나 네트워크 드라이브 형태로 접근 하신다면
      다음 경로에 chroot 가 존재합니다.
      /volume1/@appstore/debian-chroot/var/chroottarget

      chroot 가 XPEnology 위에서 debian 리눅스를 돌리는 개념(?)으로 보셔야 되요.
      합해진 시스템이 아닙니다 ^^;

      textplus 가 막혔군요? ㅠㅠ

    • BlogIcon Shekinah 2015.09.02 13:30 신고

      답변 감사합니다!

      데이터 쉐어링 사용중이라 그걸로 인증을 받았네요 ㅠ 드디어 안녕이라고 치면, 반응 메세지가 뜹니다 ! 감사합니다~

      이제 데몬 등록하려고 메세지를 입력했더니 다음과 같이 뜨네요.

      root@Noel_Nas:/home/tg# bin/telegram-cli -s bot/basicbot.lua -d &
      [3] 16676
      root@Noel_Nas:/home/tg# change_user_group: can't find the user telegramd to switch to

      한 번 봐주시면 감사하겠습니다ㅠ

    • BlogIcon Acidpop acidpop 2015.09.02 13:37 신고

      root@Noel_Nas:/home/tg# change_user_group: can't find the user telegramd to switch to

      이 에러메시지는 무시 하셔도 됩니다.

      [3] 16676
      이 메시지가 지금 Telegram 이 데몬으로 실행 되었다는걸로 보시면 됩니다. 이 숫자를 Telegram CLI 의 process ID 입니다.
      PID라고 하죠.

      해당 숫자를 잘 기억 하시고 Telegram CLI 를 종료 하시려면
      kill -9 16676
      이렇게 하시면 됩니다.

      만약 PID 를 잊어버리셨다면 chroot 상태가 아닌 XPEnology 의SSH로 접속 하셔서
      ps | grep telegram
      이렇게 치시면 나옵니다.

      '|' 이 기호는 '\' 이 키를 shift 누르고 입력하는 문자입니다.

    • BlogIcon Shekinah 2015.09.02 14:08 신고

      감사합니다~
      갑자기 이 단계에서 정전이 되어버려서 재부팅했더니, 봇이 작동을 안하고 있어서
      bin/telegram-cli -s bot/basicbot.lua -P 8888 -d &
      이 단계까지 넘어갔더니 작동하는데, 이제는 재부팅해도 저절로 작동이 되는거 맞는지요?

      그리고 그 다음 단계에서 로그 파일을 기록하려고 했더니
      sudo 명령어가 실행이 안됩니다~ㅠㅠ

      root@Noel_Nas:/home/tg# sudo echo "" > /var/log/telegram.log
      bash: sudo: command not found
      root@Noel_Nas:/home/tg# echo "" > /var/log/telegram.log
      root@Noel_Nas:/home/tg# chown pi:pi /var/log/telegram.log
      chown: invalid user: 'pi:pi'
      root@Noel_Nas:/home/tg#

      그리고 또 그냥 다음 단계로 넘어가서 tg.sh 파일을 저장하고

      sudo chown pi:pi tg.sh 명령은 역시나 sudo가 먹히지 않아서 그냥 넘어가고 권한만 755로 준 다음 ./tg.sh status를 실행하니 예시와 같이 나오지 않고 아래와 같이 나옵니다.

      /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.utf8)
      Usage : tg.sh [ start | stop | chk ]

    • BlogIcon Acidpop acidpop 2015.09.02 16:28 신고

      아.. XPEnology 는 현재 telegram cli가 서비스로 등록이 되어 있질 않은 상태입니다.
      즉, 재부팅 하면 다시 실행 해주셔야 합니다.

      그리고 debian chroot 자체가 root 권한으로 실행 되기 때문에 sudo 명령어는 안쓰셔도 되구요.

      chown pi:pi 이 부분은 라즈베리파이 에서 pi 계정으로 설정해주는 명령어 입니다. 즉, 안하셔도 됩니다.

      tg.sh 파일 역시 라즈베리파이 기준으로 작성된것이기 때문에 작동을 보장 할 수 없습니다 ^^;

      지금 현재로서는 telegram-cli -s basicbot.lua -d &
      처럼 직접 명령어를 쳐서 실행 하시는게 가장 간단합니다.

      root 권한이므로 다른것들 할 필요 없이 다음 명령어로 실행하면 될것 같네요.

      bin/telegram-cli -s bot/basicbot.lua -L /var/log/telegram-cli.log -P 8888 -e "contact_list" -d &

      다시 한번 말씀 드리지만 Telegram CLI 강좌는 라즈베리파이 기준으로 설명 되어 있고 XPEnology 는 설치와 실행 정도만 테스트 해본정도입니다.

    • BlogIcon Shekinah 2015.09.02 16:41 신고

      계속 상세한 답변 감사드립니다~

      일단 여기까지가 할 수 있는 부분인것 같네요ㅎㅎ

      다음에 XPEnology 용으로 올리시는 글 기다리고 있겠습니다~

      특히 토렌트 관련해서 만드신 부분이 꼭 알고 싶네요!

      정말 감사드립니다!

  3. BlogIcon Shekinah 2015.09.04 17:52 신고

    하나 더 다른 질문을 좀 드리고 싶은데요 ㅠ

    제가 nas에다가 wake on lan 을 설치해서 sh 파일을 만든 후에, 같은 네트워크에 있는 데스크탑을 wol하려고 하는데,
    chroot /volume1/@appstore/debian-chroot/var/chroottarget bash 이 명령어를 사용해야

    apt-get update && apt-get install wakeonlan 이게 설치가 되더라구요. 그리고 vi wol.sh 파일을 만들었는데.

    chroot /volume1/@appstore/debian-chroot/var/chroottarget bash 이 명령어 없이는 sh wol.sh 실행이 안되네요.

    혹시 기본으로 chroot /volume1/@appstore/debian-chroot/var/chroottarget bash 이 명령이 자동실행될 수는 없는건가요?

    제가 폰으로 바로 터미널 접속해서 sh wol.sh 만 실행는걸 해보려고 하는 중인데, 여기가 막히네요 ㅠ

    답변 미리 감사드립니다!


    Noel_Nas> sh wol.sh
    wol.sh: line 1: wakeonlan: not found
    Noel_Nas>
    Noel_Nas> chroot /volume1/@appstore/debian-chroot/var/chroottarget bash
    bash: warning: setlocale: LC_ALL: cannot change locale (en_US.utf8)
    root@Noel_Nas:/# sh wol.sh
    perl: warning: Setting locale failed.
    perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = "en_US.utf8",
    LANG = "en_US.utf8"
    are supported and installed on your system.
    perl: warning: Falling back to the standard locale ("C";).
    Sending magic packet to 255.255.255.255:9 with xx:xx:xx:xx:xx

    • BlogIcon Acidpop acidpop 2015.09.07 09:34 신고

      생각하시는것보다 상당히 간단합니다...

      chroot /volume1/@appstore/debian-chroot/var/chroottarget bash /home/test.sh


      chroot bash 명령 뒤에 해당 shell script 경로를 써주시면 됩니다.
      단, 경로는 chroot 상에서의 경로입니다.

      wol.sh 파일을 최상위 경로에 생성하신거 같은데

      다음과 같이 사용하시면 될듯 하네요.

      chroot /volume1/@appstore/debian-chroot/var/chroottarget bash /wol.sh

    • BlogIcon Shekinah 2015.09.07 10:07 신고

      아 이런 간단한 방법이... 감사합니다~
      그렇다면 이 실행문을 sh 안에 넣어두고 실행할 수 있을까요?

      지금 제가 하려고 하는게, 클라이언트에 저장한 sh 파일을 실행하면, 서버에 있는 wol.sh 파일이 실행되어 컴퓨터를 키려고 하는거거든요...

      서버랑, 컴퓨터랑 같은 공유기고, 클라이언트는 외부입니다.

      클라이언트에서는 root@아이피 하면 바로 비밀번호 없이 로그인 될 수 있게 https://opentutorials.org/module/432/3742 이 글을 참조해서 셋팅은 해놨구요...

      클라이언트 sh 파일에 어떻게 써야할지 찾아봐도 쉽지가 않은데..

      #!/bin/sh
      root@아이피 ## 클라이언트에서 서버로 바로 로그인
      chroot /volume1/@appstore/debian-chroot/var/chroottarget bash /wol.sh ##서버에 있는 wol.sh파일을 실행

      이런식으로 했더니 아예 되질 않네요 ㅠ 도움 부탁드립니다ㅠ

    • BlogIcon Acidpop acidpop 2015.09.07 10:44 신고

      똑같이 응용해보시면 될거 같은데요...

      root@아이피 "chroot /volume1/@appstore/debian-chroot/var/chroottarget bash /wol.sh"

      뒤쪽 chroot 는 큰 따옴표로 묶으시면 되구요.

    • BlogIcon Shekinah 2015.09.07 13:35 신고

      감사합니다 ㅠ

      sh 파일에
      ssh root@아이피 "chroot /volume1/@appstore/debian-chroot/var/chroottarget bash /wol.sh"
      로 해결했습니다 ㅎㅎ 정말 감사합니다 !

  4. Hue 2015.09.24 15:07

    알려주신 정보대로 차근차근 따라해서 텔레그램 메세지 수신과 발신 모두 성공했습니다1! 감사합니다 ㅎㅎ

    하지만 아직 반쪽짜리인것이 github에 올려놓으신 봇을 다운받아서 경로 수정 후 이용해봤는데 사용이 다 안되더라구요ㅜ

    예를 들어 날씨의 경우 "날씨 **동" 이란 command를 작성하게되면 봇에서 답장이 경기도 **시 **동 까지는 오고 날씨예보가 날라오질 않더라구요, 토렌트의 경우는 토렌트 없음으로 뜨구요.

    경로수정말고 어떤부분을 또 수정해야하는건가요??

    • BlogIcon Acidpop acidpop 2015.09.24 16:29 신고

      안녕하세요 ^^;
      제가 쉘 모드라는 기능을 추가 하면서 전역 변수 이름을
      잘못 만들어 버려서 shell_path 라는 변수를 공백으로 지워버리는 문제가 있었습니다.
      github에 다시 커밋 해놓았으니 다시 받으셔서 해보시면 될겁니다

  5. 도막사라모 2015.10.10 23:42

    안녕하세요
    좋은 정보 정말 감사합니다.
    현재 xpenology 5.0 에 설치 했는데 많은 문제 없이 잘 실행 됩니다.
    하나 해결하고 싶은게 있는데요 download station 에서 마그넷을 다운 받게 하려면 어떻게 해야 하는지 알수 있을까요?

    • BlogIcon Acidpop acidpop 2015.10.12 10:37 신고

      안녕하세요
      Downlaod Station 에 마그넷 링크를 추가 하는 방법은 아래와 같습니다.

      psql -U postgres -d download -At -c "INSERT INTO download_queue (username, url, status, filename, pid, created_time, destination) VALUES ('dsm_id', 'magnet:?xt=urn:btih:A7D', 1, 'Magnet Link', 23876, 1444475976, 'download/torrent');"

      VALUES 뒷 부분에 dsm_id 는 DSM 에서 사용하는 사용자 ID
      url = 마그넷 링크
      status = 1 로 설정
      file name = 파일 이름
      pid 는 그냥 아무 숫자나 넣어도 상관 없습니다
      create_time = date +%s 를 실행한 값
      destination = 다운로드 받을 경로 입니다.

    • 도막사라모 2015.10.15 14:44

      ㄴ 답변 감사드립니다.
      chroot 에서는 psql 명령어를 사용할수가 없는데요... 어떠한 방법으로 사용할수가 있을까요? ㅠㅠ

    • BlogIcon Acidpop acidpop 2015.10.15 16:02 신고

      안녕하세요
      chroot 상에서 사용하시려는 목적이었군요 ^^;;

      chroot 에서 직접 psql 로 접근은 안될겁니다.

      저 같은 경우는 XPenology 에 웹 서버봐 php 서비스를 실행 되게 해놓고
      php 파일을 하나 짜서 올려놓고
      curl 명령으로 해당 php 파일을 호출합니다.

      즉, 실제 DB 를 사용하는 명령어는 php 로 작성해서 만들어 놓고
      chroot 나 또는 다른 시스템에서는 curl http://xpenology_ip:port/test.php --data-urlencode query="select * from test;"

      위와 같은 방식으로 호출 해서 사용합니다.

      Magnet 링크 추가 하는 Telegram 측 루아 스크립트와
      XPenology 측 php 파일 일부분을 질문 게시판쪽에 올려놓겠습니다.

      참고 하시면 됩니다.

  6. 놀러왔습니다. 2015.11.04 11:04

    클리앙 나스당에서 보고 놀러왔습니다.
    뭔가 손대기가 초보 입장에서 어렵네요 ㅎ

    XPEnology 봇 만들어 주시면 감사히 잘 사용하겠습니다 ㅎ

    • BlogIcon Acidpop acidpop 2015.11.04 11:08 신고

      안녕하세요 ^^

      XPEnology BOT 은 제가 요즘 작업할 시간이 없어서 계속 미뤄지게 되네요 ㅠㅠ

      개발이 완료되는데로 바로 포스팅 하겠습니다.

      감사합니다.

  7. fabric 2015.11.07 22:12

    https://i.imgur.com/7nDM8sU.png

    Debian Chroot 한글 깨짐 현상 해결 하기

    dpkg-reconfigure locales

    위 명령어를 수행 한 다음 아래 목록에 있는 항목을 선택한다.

    en_US.UTF-8
    ko_KR.UTF-8

    선택하고 OK하면 한글 깨짐 현상이 사라진다.

    이 부분 dpkg-reconfigure locales 입력했더니 이미지처럼 저렇게 뜨네요.
    한글 깨짐은 확인 못 했으나 입력하니 저러는데 locals 가 설치 안 된 모양인데...다시 해야하는건가요?

    • BlogIcon Acidpop acidpop 2015.11.09 13:42 신고

      안녕하세요

      답변이 좀 늦었습니다.

      제가 이것저것 테스트 하다가 한국어 로케일 설정을 한거다 보니
      중간에 뭔가 과정이 누락된걸로 보입니다.

      일단 다음 명령어를 차례대로 수행해 주세요.

      apt-get install locales

      locale

      locale-gen "en_US.UTF-8"
      locale-gen "ko_KR.UTF-8"

      제가 지금 chroot 를 설정해놓은 상태여서 확답은 안되지만
      시도해 보시고 다시 알려주세요.

    • fabric 2015.11.10 02:18

      네, 알려주신대로 locales 설치하고 설정 완료 했습니다. 고맙습니다 ㅎ

    • BlogIcon Acidpop acidpop 2015.11.10 10:34 신고

      해결 되셨다니 다행입니다. ^^

  8. 도막사라모 2015.11.22 21:21

    안녕하세요.
    telegram-cli 프로세스가 죽었을때 다시 살리는 스크립트를 만들수 있을까요?
    chroot 에서 실행이 되다 보니 다른 포스트에 있는 글을 참조해도 좀처럼 쉽지가 않네요 ㅠㅠ

    • BlogIcon Acidpop acidpop 2015.11.23 14:13 신고

      안녕하세요
      답변이 좀 늦었습니다.

      아래 스크립트를 참고하셔서 if 와 else 사이 구문만 적절하게 바꿔서 쓰시면 될것 같습니다.

      #!/bin/sh

      while :
      do
      PID=`/bin/ps -e -u 0 | /bin/grep -w telegram-cli | awk '{print $1}'`
      if [ $PID ]; then
      echo "Telegram is Execute..."
      else
      echo "Telegram is not Execute..."
      fi

      sleep 1
      done

      이 스크립트는 당연히 데몬으로 돌려야 하구요.

      데몬으로 하는게 싫으시다면 while do done 구문을 없애고 나머지 부분만 남겨둔채 1초에 한번씩 해당 스크립트를 실행하셔도 됩니다.

      else 구문의 echo 구문 아래쪽에 sudo service telegramd start 명령을 추가 하시면 될듯 하네요

  9. hello 2015.12.15 15:39

    XPEnology 에서 날씨가 제대로 안 되는것 같습니다. 설치는 완료했고 날씨에 대한 반응도 옵니다만, 동네명 아래로 온도 : C 까지만 날아옵니다. 그리고 저항계산기도 해봤는데 응답이 없고, 토렌트 검색은 어떻게 하는건가요?

    설치는 제대로 된거 같은데 말이죠. 내부에 /home/pi/tg 도 /home/tg 로 수정할만한건 다 수정했습니다.

    • BlogIcon Acidpop acidpop 2015.12.15 16:17 신고

      동네 조회는 아래 명령어가 정상적으로 작동 하는지 먼저 수행해보세요

      curl -s "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1111061500"

      1차로 위 curl 명령을 했을때 정보를 제대로 가져오는지 확인하시구요

      2차로 아래 명령을 실행해보세요
      curl -s "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1111061500" | xmlstarlet sel -t -c "/rss/channel/item/description/body/data[@seq="0"]" | xml2 | grep -E 'temp|wfKor|pop|ws|wdKor|reh' | cut -d '=' -f 2

      6.0
      구름 많음
      20
      4.0

      55

      위 처럼 6줄이 나오면 텔레그램 봇도 정상적으로 나올겁니다.

      저항계산기는 응답이 없다고 하셨는데..
      텔레그램 경로로 가셔서
      bin/telegram-cli -s bot/basicbot.lua
      위와 같이 실행 한 다음 저항 계산기 라고 메시지를 보내고 나서
      나오는 화면 내용을 알려주세요

      그리고 토렌트 검색은 뭐가 안되나요?

    • hello 2015.12.15 20:42

      그리고 날씨 삼성동 뭐 이렇게 입력했다고치면...대략 30-40분 후에도 날씨에 대한 응답이 날아 옵니다. 처음 날씨 삼성동 넣을때 바로 응답을 받고 30-40분후에도 이상하게 날아오더라구요.

    • BlogIcon Acidpop acidpop 2015.12.16 09:49 신고

      저항계산기 같은 경우는 사용법이 잘못됐네요 ^^;

      저항 계산기 이렇게 쓰는게 아니라..

      저항 갈주적금

      이런식으로 사용하시면 됩니다.

      위 명령들은 ssh 접속 하셔서 chroot_debian 으로 들어가셔서 실행 해보시면 됩니다.

      날씨 관련해서는 이정도 정보만 가지고는 판단을 못하겠네요.

      토렌트는 bot/shell 디렉토리에 보시면 tdget.sh 라는 파일이 있습니다.

      이 파일을 열어 보시면 RSS를 지원하는 토렌트 사이트에서 RSS 구조로 토렌트 내용을 검색하는 구조인데

      torrentproject 는 요근래 들어서 작동을 안하는것 같고..

      그 아래에 있는 사이트는 은 http 에서 https 로 변경이 되서 그런걸로 보입니다.

      github 에서 tdget.sh 파일만 다시 받아주시면 됩니다.

    • hello 2015.12.16 12:46

      날씨는 curl 이 설치 안되서 그런거 였네요. 따라하면서 빠진 부분은 없었던거 같은데...

    • BlogIcon Acidpop acidpop 2015.12.16 12:48 신고

      그렇군요..

      XPEnology 에 debian_chroot는 curl 이 기본으로 설치가 안되는것일수도 있습니다.

    • hello 2015.12.16 12:52

      토랭이는 따로 받는데가 있어서 상관없지만, 봇 설치하고서 잘 안 되서 문의 드리면서 같이 여쭤 본 겁니다. 날씨가 안 되서 말이죠. 리눅스나 이런 명령어는 젬병이라...

      아무튼 지금 날씨 랑 알려주신 저항계산기 사용은 잘 됩니다. 고맙습니다.

    • BlogIcon Acidpop acidpop 2015.12.16 13:16 신고

      해결이 되셨다니 다행입니다.

  10. hello 2015.12.16 15:59

    https://github.com/yagop/telegram-bot

    google map 이라던가 gps 이외에도 여러기능이 있는 봇이던데 이거 설치해서 같이 사용해도 문제 없나요?
    설치가 되는지 혹은 설치 후 사용할때 하나만 작동한다던지 하는 문제가 발생하지 않을까 여쭤 봅니다.

앞에서 Telegram BOT 강좌를 이용하여 텔레그램이 설치가 되었다면

 

라즈베리파이 내부에서만 텔레그램을 통해 메시지를 보낼수 있을것이다.

 

 

Telegram BOT 강좌 4부 참조

 

2015/07/21 - [강좌/RaspberryPI 활용] - 라즈베리파이 Telegram BOT 만들기 4부 - Telegram CLI 데몬 실행 및 서비스 등록

 

ex)

echo "msg 홍길동 메시지 보내봅니다" | nc localhost 8888

 

nc 뒤에 localhost 만 라즈베리파이의 IP로 변경하면 다른 장비에서도 사용 할 수 있지 않을까? 싶지만 작동하지 않는다.

 

echo "msg 홍길동 메시지 보내봅니다" | nc 192.168.0.199 8888

 

분명 -P 옵션으로 8888 포트를 열었지만 라즈베리파이 내부에서만 작동 하지 다른 장비에서는 작동하지 않는다.

 

그 비밀(?)은 바로 Telegram CLI 의 소스에 숨겨져 있다.

 

Telegram 소스가 위치한 경로로 이동해보자.

 

cd /home/pi/tg

 

여기에서 main.c 파일을 vi 또는 nano 에디터로 열어 보면

 

int main 함수 아래쪽 (필자는 919 라인에 있다)을 보자.

 

 

 882   int main (int argc, char **argv) {
 883   signal (SIGSEGV, termination_signal_handler);
 884   signal (SIGABRT, termination_signal_handler);
 885   signal (SIGBUS, termination_signal_handler);
 886   signal (SIGQUIT, termination_signal_handler);
 887   signal (SIGFPE, termination_signal_handler);
 888
 889   signal (SIGPIPE, SIG_IGN);
 890
 891   signal (SIGTERM, sig_term_handler);
 892   signal (SIGINT, sig_term_handler);
 893
 894   rl_catch_signals = 0;
 895
 896
 897   log_level = 10;
 898
 899   args_parse (argc, argv);
 900
 901   change_user_group ();
 902
 903   if (port > 0) {
 904     struct sockaddr_in serv_addr;
 905     int yes = 1;
 906     sfd = socket (AF_INET, SOCK_STREAM, 0);
 907     if (sfd < 0) {
 908       perror ("socket");
 909       exit(1);
 910     }
 911
 912     if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0) {
 913       perror("setsockopt");
 914       exit(1);
 915     }
 916     memset (&serv_addr, 0, sizeof (serv_addr));
 917
 918     serv_addr.sin_family = AF_INET;
 919     serv_addr.sin_addr.s_addr = accept_any_tcp ? INADDR_ANY : htonl (0x7f000001);
 920     serv_addr.sin_port = htons (port);

 

 

919 라인에서 설정하는 저 부분 중 accept_any_tcp 플래그가 True 일때는 INADDR_ANY 를

FALSE 라면 htonl(0x7f000001) 값을 세팅하게 되어 있다.

 

htonl(0x7f000001) 이 값은 INADDR_LOOPBACK 이라는 플래그로 정의되어 있는데

 

LOOPBACK 네트워크의 접속만 허용하겠다 라는 의미이다.

 

몇일전 Telegram cli 소스에서는 accept_any_tcp 라는 항목이 없었는데 최근 소스에 추가가 되어 있다.

 

 

4부에서 데몬으로 실행할때 옵션에서 accept_any_tcp 라는 옵션만 더 추가하면 다른 네트워크에서도 접근이 가능한 소켓을 Listen 한다.

 

 

telegram-cli -h 를 해도 나오지 않는 항목이기 때문에 소스를 보지 않는 이상 알 수 없는 옵션이다.

 

(최근 소스를 받아보면 help 에 해당 옵션이 나온다)

 

 

 

bin/telegram-cli -s bot/basicbot.lua -P 8888 -e "contact_list" --accept_any_tcp -L /var/log/telegram.log -d & 

 

위 명령으로 데몬을 띄우면 다른 장비에서도 라즈베리파이의 IP와 8888 포트 정보를 이용하여

 

netcat 을 통해 메시지를 보낼 수 있다.

 

 

 


 

 

제목과 전혀 다른 내용이 전개 되었는데 PHP는 도대체 어디 간거야? 라는 의문이 있을것이다.

 

지금까지의 내용은 그냥 알아두기 수준으로만 하고 넘어가는것이 좋다.

 

왜냐하면 위와 같이 LOOPBACK 네트워크가 아닌 모든 네트워크에서 접속을 다 받을수 있다면 공격자가 라즈베리파이의 IP와 포트로 수많은 메시지를 보낼 수가 있게된다.

 

Telegram CLI 의 소켓은 보안성이 없고 그저 모든 명령을 다 받아 처리하게 되어 있기 때문에

 

심각한 보안 문제가 발생 할 수 있다.

 

telegram-cli 로 모르는 사람에게 온갖 스팸 메시지가 보내 질 수도 있는것이다.

 

 

 

필자는 LOOPBACK 으로만 소켓을 열고 php 를 이용해서 메시지를 전송한다.

 

 

준비 과정은 다음과 같다.

 

1. 라즈베리파이에 Apache+ php 또는 NginX + php 를 설치 한다.

 

웹서버와 php 를 설치하는 방법은 수많은 블로그에서 다루고 있으니 생략한다.

 

필자는 Apache + PHP 로 구성하였다.

 

2. php 파일을 작성한다.

 

PHP를 이용해서 텔레그램으로 메시지를 보내는 방법으로 다음과 같이 코딩하였다.

 

  1. PHP에서 GET parameter 중 password 키를 지정하여 해당 Password 값과 일치 하지 않는다면 요청을 무시한다.

  2. password 가 일치 한다면 Text File 을 전송 받는다.

  3. 전송 받은 Text File을 Local Network 의 Telegram-CLI 에 전송 하도록 요청한다.

 

필자는 PHP 개발을 잘 몰라서 여기저기 구글링하여 다음과 같이 개발하였다.

<?php
header("Content-Type: text/html; charset=UTF-8");
// 4.1.0 이전의 PHP에서는, $_FILES 대신에 $HTTP_POST_FILES를
// 사용해야 합니다.



$pw=$_POST["password"];

// 뒷부분의 엄청나게 긴 패스워드는 'password' 라는 문자열을 SHA256 으로 해쉬한 결과값이다.
// 각 사용자는 자신의 고유 Password 를 설정하여 사용하면 된다.
$pwcmp = strcmp($pw, '5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8');

$tgsend_text_shell="/home/pi/tg/bot/shell/tgtext.sh";
$ipauth="/tmp/ipauth.txt";

// Password 가 일치하지 않는 경우 접속한 사용자의 IP를 텔레그램으로 전송
if($pwcmp){
    echo "Unauthorized user";
    ignore_user_abort(1); 
    $f = fopen($ipauth, "w"); 
    $tp="(".date('Y/m/d-H:i:s').") ".$_SERVER['REMOTE_ADDR']; 
    fwrite($f, "인증되지 않은 사용자가 File Upload를 시도하였습니다\n");
    fwrite($f, $tp."\n");
    $pwtxt   ="PASSWORD : ".$pw;
    fwrite($f, $pwtxt."\n");
    fwrite($f, $_SERVER['HTTP_USER_AGENT']."\n");
    fclose($f);  
    exec($tgsend_text_shell." ".escapeshellarg($ipauth));
}else{

    $uploaddir = '/tmp/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "파일이 유효하고, 성공적으로 업로드 되었습니다.\n";
    } else {
        print "파일이 유효하지 않습니다!\n";
    }

    // 업로드 된 Text 파일을 Telegram 으로 전송한다.
    exec($tgsend_text_shell." "."홍길동"." ".escapeshellarg($uploadfile));
}

?>

위 코드를 아래의 경로에 저장한다.

 

/var/www/tgcli.php

 

 

 

주의 :

위 코드에서 "5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8" 

 

이 Password 부분은 각 사용자가 변경하여 사용하여야 한다.

 

필자는 SHA256 생성기 (http://www.convertstring.com/ko/Hash/SHA256) 를 이용해서 암호를 해쉬한 값을 사용한다.

 

위 Hash 코드는 'password' 라는 문자열을 SHA256으로 해쉬한 값이다. 그대로 사용하면 안된다.

 

 

좀 더 보안에 신경을 써야 한다면 php 파일 내부에 암호를 저장하는게 아닌 다른곳에 저장해두고 php에서 읽어오게 해야 더 좋을듯..

 

 

 

위와 같이 저장하였다면 90%는 성공이다.

 

이제 다른 장비에서 사용 하는 방법은 다음과 같다.

 

필자는 curl 이라는 유틸을 이용해서 사용한다.

 

다른 리눅스 장비에서 다음 명령어를 입력하여 실행해보자.

 

 

curl --form userfile=@/tmp/temp.txt --form password=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8 http://192.168.0.199/tgcli.php

 

 

 

 

/tmp/temp.txt 파일을 라즈베리파이의 php 로 전송을 하는 명령어이다.

 

당연히 /tmp/temp.txt 파일이 있어야 한다.

 

모든 과정이 정상적으로 되었다면 텔레그램으로 해당 텍스트 파일의 내용이 전송 되었을 것이다.

 

 

 

위 php 파일을 응용하면 파일이 아닌 GET Parameter에 내용을 직접 전달 할 수도 있다.

 

 


 

 

이 강좌는 난이도가 조금 있습니다.

 

차근 차근 따라해 보시고 잘 안되는 부분이나 궁금하신 점은 질문 게시판을 이용해 주세요.

 

감사합니다.

  1. BlogIcon 천타 2016.04.08 12:29

    좋은 자료 공유해주셔서 정말 감사합니다~

    궁금해서 인터넷 검색하다가 여기까지 왔는데 진짜 너무 잘 정리해주셨네요~ 짱짱!!

  2. 궁금 2016.07.25 17:29

    라즈베리파이 대신에 레드햇 리눅스 쓰는데요 카카오톡은 어떻게 해야하나요?ㅠㅠㅠ

    • BlogIcon Acidpop acidpop 2016.07.25 17:33 신고

      카카오톡은 Open API가 상당히 한정 되어 있는걸로 알고 있습니다.

      https://developers.kakao.com/docs/restapi#카카오톡-나에게-보내기

      위 링크를 참조 하시면 될것 같습니다.

    • 궁금 2016.07.25 17:35

      오! 감사합니다 PHP도 참고하면 되겠죠?

    • BlogIcon Acidpop acidpop 2016.07.25 17:55 신고

      카카오톡 쪽은 문서를 읽어봐도 좀 애매하게 작성된게 많아서...

      저는 머리가 나쁜지 이해가 잘 안가더라구요 ^^;

  3. 궁금 2016.07.26 10:28

    제가 머리 나쁜게 아니었네요 ㅋㅋㅋ
    카카오톡 쪽 문서 자체가 어려운가봐요. 무튼 좋은 글 보고 갈게요~~ 즐거운 하루 보내세요~

2015/11/04 github 주소가 수정 되었습니다.

 

https://github.com/acidpop/bot

 

 


 

 

2015/08/05 소스가 수정되었습니다.

 

기존에 소스는 Shell Script 파일이 실행 권한이 빠져 있어서 제대로 작동을 안하는 문제가 있었습니다.

 

그외 help.txt 파일의 오타가 수정되었습니다.

 

소스를 다시 받으시면 됩니다.

 


 

GitHub 를 통해 지금까지 완성된 BOT 스크립트를 공개합니다.

 

 

공개된 BOT을 사용하기 위해서는 다음 라이브러리의 설치가 필요합니다.

 

sudo apt-get install sqlite3 xml2 xmlstarlet imagemagick

 

sqlite3 는 내부적으로 사용하는 File DB를 사용하기 위함.

xml2 는 토렌트 검색 등으로 rss 를 받아 오는 경우

xmlstarlet : 마찬가지로 xml 툴인데 기상청 데이터의 데이터를 파싱하기 위해 사용

imagemagick : Image를 조정 할수 있는 유틸리티

 

 

BOT을 사용해봅니다.

 

아래 명령을 실행합니다.

 

cd /home/pi/tg

git clone https://github.com/acidpop/bot.git

 

 

 

 

모든 설명은 스크립트 내부에 있으며 BOT 을 실행 하는 방법은 다음과 같습니다.

 

cd /home/pi/tg

 

sudo sh -c 'echo "" > /var/log/telegram-cli.log'

sudo chown pi:pi /var/log/telegram-cli.log

 

bin/telegram-cli -s bot/basicbot.lua -L /var/log/telegram-cli.log -P 8888 -e "contact_list" -d &

 

 

지금까지 강좌를 모두 따라 왔다면

 

sudo service telegramd start

 

위 명령 한줄로 실행 할 수 있습니다.

 

 

 

 

 


 

총 5부에 걸쳐 Telegram CLI 를 활용 하는 방법에 대해 알아 보았습니다.

 

GitHub 주소는 아래와 같습니다.

 

https://github.com/acidpop/bot

 

질문이 있으시면 댓글 또는 제 블로그의 질문 게시판을 이용해 주시면 됩니다.

 

 

 

 

 

 

 

 

관련글
  1. ^_^ 2015.10.26 00:27

    좋은 강의 잘 보았습니다^_^ 질문이 있는데요
    사진 전송시 자동저장되는 경로가 home/pi/.telegram-cli/downloads 인데 이 경로 지정은 어디서 변경할 수 있나요?
    스크립트내에 있을까해서 이것저것 뒤져봤는데 찾지를 못해서요ㅠ_ㅠ

    • BlogIcon Acidpop acidpop 2015.10.26 09:59 신고

      안녕하세요.

      Telegram CLI 의 download 경로를 변경 하려면 소스 레벨에서 수정을 해야 되는걸로 보입니다.

      소스 레벨을 수정한는것 보다는

      recv_file.lua 파일에 보시면
      RecvFile 함수와 save_file 함수가 있습니다.

      RecvFile 함수는 수신 받은 메시지 중에서 미디어 타입이 photo 또는 document 일때만 작동하도록 되어 있고 save_file 이라는 함수를 같이 호출해 줍니다.

      즉, 다운로드가 완료되면 save_file 이라는 함수가 호출 되는 구조입니다.

      save_file 함수를 가서 보시면 아래쪽에 확장자가 torrent 라면 이라는 주석이 있는데

      file 이라는 변수가 다운로드 된 파일의 전체 경로입니다.

      local move_cmd = 'mv ' .. file .. '이동할 경로'
      이렇게 적어 주시고 ExecuteCommand(move_cmd)

      이렇게 하시면 됩니다.

    • BlogIcon ^_^ 2015.10.27 11:56

      해결했어요! 감사합니다!!!!

  2. pi 2016.01.08 13:47

    torrent.lua 내부에 split_to_table 호출 에러가 나네요 소스를 아무리 뒤져봐도 나오질 않아요

    • BlogIcon Acidpop acidpop 2016.01.08 16:12 신고

      안녕하세요.
      제가 bot 쪽을 제대로 테스트 안하고 올렸나 봅니다.

      git pull 명령을 이용해서 소스 업데이트후에 다시 시도해 보시면 될겁니다.

  3. good 2016.01.09 02:10

    좋은 강의 잘 보았습니다.
    궁금한게 있는데요 torrent.lua 에서 DownloadTorrent 함수 내부에서 마그넷 링크/url_download 를 하는데요
    url_download를 호출 할 수가 없다고 합니다.

    • BlogIcon Acidpop acidpop 2016.01.11 13:34 신고

      아.. url_download 함수가 누락되었네요. ㅠㅠ

      common.lua, torrent.lua 파일 다시 커밋 해두었습니다.

      소스 다시 받으셔서 적용해보시면 될겁니다.

  4. 워류겐 2016.04.27 21:02

    안녕하세요.
    좋은정보 정말 감사드립니다.
    정말 요긴하게 써먹고 있습니다.
    최근 새로운 서버에 설치후 acidpop님이 github에 커밋하신 bot 을 받아서 설치해 보았습니다.
    작동이 안되길래 디버깅하다 문제코드를 찾았습니다. ㅠㅠ
    이전에는 잘 동작했는데 telegram-cli 가 업데이트 되었나 봅니다.
    function on_msg_receive (msg) 함수에서
    if (msg.to.id == our_id) then 이 부분을
    if (msg.to.peer_id == our_id) then 이렇게 고쳐야 동작이 되네요.
    peer_id 라는게 새로 생겨났네요;

    • BlogIcon Acidpop acidpop 2016.04.28 09:48 신고

      최근 소스로 업데이트 해서 다시 테스트 해봤습니다만..

      on_msg_receive 의 msg 변수를
      모두 출력해주는 부분을 보면
      peer_id 는 보이지 않네요...

      뭔가 환경이 다른걸까요?

    • BlogIcon Acidpop acidpop 2016.04.28 16:45 신고

      다시 테스트 해보니 peer_id 로 보이네요

      좋은 정보 감사합니다.

      요즘에는 CLI 가 아닌 Bot API 를 이용하다 보니
      유지가 잘 안되었군요.

  5. 제발 2016.11.24 14:15

    telegram 을이용해서 문자 전송까지는 되었습니다. 하지만 저희가 하려고 하는게 적외선 센서를 인식하였을 때 문자가 스마트폰으로 자동으로 전송되게 하고 싶은데 어떻게 해야되는지 가르쳐 주신다면 감사하겠습니다.

    • BlogIcon Acidpop acidpop 2016.11.24 15:20 신고

      질문이 너무 광범위 한것 같습니다.


      질문하신 그대로 적외선 센서가 인식 되었을때에 강좌에 있는 봇에게 메시지보내기를 수행하시면 되지 않을까요?

    • BlogIcon Acidpop acidpop 2016.11.24 15:21 신고

      외부에서 Telegram CLI 로 메시지를 보내고 싶으시다면

      --accept-any-tcp 이 옵션을 이용하셔서 TCP 포트 하나 여시고

      netcat 으로 메시지를 보내는 방법을 사용하셔도 됩니다.


      http://blog.acidpop.kr/189

      위 링크를 참고하세요

  6. BlogIcon xoskd 2017.03.24 00:23 신고

    sudo service telegramd start 입력했는대
    무반응입니다
    어떻게 해야되나여?

    • BlogIcon Acidpop acidpop 2017.03.24 09:01 신고

      아무 반응이 없더라고

      ps -ef | grep tele

      명령 실행 하셔서 실제로 실행이 되고 있는지 확인해보세요

    • BlogIcon xoskd 2017.03.25 21:31 신고

      pi 1748 1156 0 21:29 pts/0 00:00:00 grep --color=auto tele

      이런문구가 나오는대 실행이 안되고있는 상황이져?

    • BlogIcon Acidpop acidpop 2017.03.25 21:32 신고

      넵 그건 grep 명령이 실행 되고 있다는걸 보여주는거에요

  7. xoskd 2017.04.10 14:13

    정상 실행은 되는대
    핸드폰에서 날씨를 입력시켜 보내면 날씨입력하셨습니다만 뜹니다

    • BlogIcon Acidpop acidpop 2017.04.10 14:18 신고

      죄송하지만
      http://blog.acidpop.kr/186
      혹시 이 글에 있는 스크립만 basicbot.lua 로 해놓고
      실행 하신거 아닌가요?

      5부 최종 블로그 글은

      https://github.com/acidpop/bot.git


      github 에서 소스를 받은 다음

      다운로드 받은 소스의 basicbot.lua 를 옵션으로 주셔야 하는데 4부에 있는 basicbot.lua 를 가지고 봇을 실행 하신거 같은데요

      basicbot.lua 파일을 열어서 확인해보세요

      "날씨" 라는 메시지 전송이 어떻게 작동하는지 조금만 보시면 알수 있습니다.

  8. BlogIcon xoskd 2017.04.10 23:10 신고

    4부의 basicbot.lua를 지우고
    5부에서 받은 basicbot.lua를 넣고 실행시키면
    cli daemon 이 stopped 멈춥니다

    • BlogIcon Acidpop acidpop 2017.07.10 13:35 신고

      안녕하세요
      답변이 너무 늦었네요 ㅠㅠ

      해결 하셨는지는 모르겠지만 어떤 내용이 나오는지

      실행 후 에
      /var/log/telegram-cli.log

      로그 파일의 마지막 부분 내용을 조금 더 올려주셔야 확인이 가능합니다.

  9. got987junsuk 2017.07.08 11:40

    ./bot/common.lua:8: module 'socket' not found:
    라고 해서 no file socket관련 에러들이 뜨는데 어떻게 할 수 있을까요?

    • BlogIcon Acidpop acidpop 2017.07.10 13:34 신고

      어떤 리눅스에서 사용하시는지는 잘 모르겠지만
      라즈베리파이에서 사용 하신다면

      sudo apt-get install lua-socket

      위와 같이 lua-socket 라이브러리를 설치해주시면 됩니다.

  10. 라즈베리파이 2017.08.31 17:46

    no field package.preload['socket']
    no file '/usr/local/share/lua/5.2/socket.lua'
    no file '/usr/local/share/lua/5.2/socket/init.lua'
    no file '/usr/local/lib/lua/5.2/socket.lua' no file '/usr/local/lib/lua/5.2/socket/init.lua' no file '/usr/share/lua/5.2/socket.lua'
    no file '/usr/share/lua/5.2/socket/init.lua'
    no file './socket.lua'
    no file '/usr/local/lib/lua/5.2/socket.so'
    no file '/usr/lib/arm-linux-gnueabihf/lua/5.2/socket.so' no file '/usr/lib/lua/5.2/socket.so'
    no file '/usr/local/lib/lua/5.2/loadall.so'
    no file './socket.so'

    • BlogIcon Acidpop acidpop 2017.08.31 22:19 신고

      댓글을 쓰실때는 조금만이라도 예의를 지켜주세요.

      sudo apt-get install lua5.2-socket

  11. gawoon 2017.10.02 17:32

    덕분에 라즈베리파이 최근 버전에 telegram-cli 설치를 마무리 할 수 있었습니다.
    아직 해결되지 않은 두 가지가 있는데
    1. 저는 리부팅을 하면 telegramd 서비스가 자동으로 되지 않습니다. 무슨 문제일까요?
    재부팅 후 sudo /etc/init.d/telegramd start를 꼭 실행해야하네요.

    2. 토렌트는 내부에 있는 주소를 변경해서 검색어를 입력하면 목록 다운까지는 됩니다만 다운 번호를 입력하면 뻗어버립니다.
    재부팅 하고 telegramd start 를 시켜도 토렌트 다운은 되지 않네요.

    magnet 링크를 추가하였습니다.
    다운로드 링크가 magnet 입니다.
    마그넷 링크 추가를 요청합니다.

    메시지 창에는 이렇게 뜹니다.
    도움 부탁드립니다.

    • gawoon 2017.10.02 21:14

      1번 문제는 다른 글에 올렸듯이
      /etc/rc.local 파일에

      sleep 15
      su - pi -c "/home/pi/tg/tg.sh start"

      삽입해서 해결했습니다.

지난 글에 이어 이번에는 Telegram CLI 를 데몬으로 실행 하고 서비스에 등록하는 과정에 대해 알아보자.

 

 

지난번 글까지는 사용자가 직접 bin/telegram-cli 를 실행 하여서 수동으로 명령을 입력하거나 lua 스크립트를 읽어서 처리 하는걸

보고만 있어야 하는 문제가 있었다.

 

이번 강좌에서는 Telegram CLI를 Daemone Process 로 실행하고 라즈베리파이의 리눅스에서 서비스에 등록하는 과정을 알아보고

 

명령을 전달 받을 수 있는 TCP Socket 을 여는 과정, 그리고 Log 파일의 경로를 설정하는 부분까지 알아본다.

 

 


 

 

 

1. Telegram CLI 를 Daemon Process 로 실행 하는 방법.

 

 

Telegram CLI 를 데몬으로 띄우는 방법은 매우 간단하다.

 

다음 명령어를 이용해서 실행하면 된다.

 

[pi@/home/pi/tg]$ cd /home/pi/tg

[pi@/home/pi/tg]$ bin/telegram-cli -s bot/basicbot.lua -d &

 

기존에 bin/telegram-cli -s basicbot.lua 명령에서 "-d" 옵션과 "&" 기호가 추가 되었다.

 

-d 옵션은 telegram-cli 를 daemon 모드로 작동 시키는걸 의미하고 & 기호는 프로세스를 daemon 형태로 실행한다는 리눅스 명령이다.

 

데몬으로 실행하기는 이것으로 끝이다.

 

매우 간단하다.

 

 


 

 

 

2. Telegram CLI 소켓 열기와 로그 파일 경로 설정하기

 

Telegram CLI 를 사용하면서 의문점이 있었는데 Daemon 으로 실행된 Telegram-cli 에 메시지 전송을 명령하고 싶다면?

 

telegram-cli 프로세스를 하나 더 띄워서 보내나? 이건 좀 비효울적인거 같고.. 여러모로 좀 찾아 보니

 

Telegram CLI 자체내에서 Socket 을 지원한다.

 

--tcp-port/-P <port>                          port to listen for input commands
--udp-socket/-S <socket-name>        unix socket to create

 

최근 버전에는 udp socket 까지 지원을 한다.

 

이 강좌에서는 tcp socket 을 활용하는 방법을 소개 한다.

 

P(대문자) 옵션을 사용하는 방법은 다음과 같다.

 

[pi@/home/pi/tg]$ cd /home/pi/tg

[pi@/home/pi/tg]$ bin/telegram-cli -s bot/basicbot.lua -P 8888 -d &

 

-P 8888

 

위 명령어 옵션을 이용해 실행하면 telegram-cli 는 8888 포트를 열어 놓게 된다.

 

이 글을 보는 사용자 분들은 포트 번호를 원하는 번호로 사용하면 된다.

 

단, telegram cli 소스를 보면 local network, 즉 내부 네트워크만 접속 할 수 있게 되어 있다. 수정 할 수도 있지만 보안을 위해 그냥 쓴다. (수정 방법은 따로 공개하겠다, 링크)

 

 

자, 이제 TCP 포트를 열었으니 해당 포트로 메시지를 어떻게 전송 하는가?

 

그 방법은 netcat 을 이용하는 방법이다. netcat 은 라즈베리파이에 기본적으로 설치 되어 있다.

 

설치가 되어 있는지 확인 방법은 다음과 같다.

 

 

[pi@/home/pi/tg]$ nc --help

 

netcat 은 nc 라는 command 로 실행 할 수 있다.

 

만약 설치가  안되어 있다면 설치를 하자.

 

sudo apt-get install netcat

 

 

이번에는 netcat 을 이용하여 telegram cli 에 명령을 전달하는 방법이다.

 

[pi@/home/pi/tg]$ echo "msg 홍길동 메시지 전송합니다" | nc localhost 8888

 

 

echo 를 이용하여 출력 되는 문자열을 파이프를 이용해서 netcat 으로 전달한다.

netcat 은 입력 받은 문자열을 해당 포트로 전송한다.

 

echo 뒤에 telegram cli 에서 지원하는 명령어를 사용하여 메시지등을 전달 할 수 있다.

 

 

간혹 다음과 같은 오류를 볼 수도 있다.

ANSWER 31
FAIL: 38: can not parse arg #1

 

위 오류가 발생 하는 이유는 msg 다음의 이름을 인식 할 수가 없어서이다.

 

telegram cli 는 처음 실행 하고 나서 대상의 이름으로 전달을 하면 위와 같은 오류가 난다.

 

구글링을 해본 결과로는 "msg user#12345678 메시지" 이것처럼 user id 로 전송을 하라고 하는데 누가 저 숫자로 된 ID를 다 외운단 말인가..

 

여러 테스트를 해보니 다음 방법으로 해결이 가능하다.

 

contact_list

 

telegram cli 에서 위 명령이 한번 수행되고 난 다음에는 사용자 이름으로 메시지 전달이 가능했다.

 

그렇다면 telegram cli 를 시작할 때 매번 echo "contact_list" 이걸 해주어야 하는가? 아니다. Telegram CLI 옵션에 추가 할 수 있다.

 

 

[pi@/home/pi/tg]$ cd /home/pi/tg

[pi@/home/pi/tg]$ bin/telegram-cli -s bot/basicbot.lua -P 8888 -e "contact_list" -d &

 

바로 -e 옵션을 이용해서 수행할 명령어를 하나 전달하는것이다.

 

 

 

 


 

 

3. Telegram CLI 로그 파일 남기기

 

Telegram CLI 를 데몬으로 실행하면 이 프로세스가 제대로 작동하고 있는지..

 

메시지는 뭘 받았는지 알고 싶을때가 많을것이다.

 

즉, Telegram CLI 를 데몬으로 띄우지 않았을때 처럼 모든 처리 결과를 로그 파일로 남겨보자.

 

로그 경로를 설정하는 방법은 다음과 같다.

 

[pi@/home/pi/tg]$ cd /home/pi/tg

[pi@/home/pi/tg]$ bin/telegram-cli -s bot/basicbot.lua -P 8888 -e "contact_list" -L /var/log/telegram.log -d &

 

-L 옵션 뒤에 로그 파일 경로를 설정해 주었다.

 

단, /var/log/ 경로 아래에는 root 권한이 있어야만 읽고 쓸수가 있기 때문에 다음 명령어를 이용해서 로그 파일을 미리 생성하고 권한을 바꿔놓자.

 

[pi@/home/pi/tg]$ sudo sh -c  "echo '' > /var/log/telegram.log"

[pi@/home/pi/tg]$ sudo chown pi:pi /var/log/telegram.log

 

 

위와 같이 미리 로그 파일을 생성한 다음 Telegram CLI 를 실행하면 해당 로그 파일에 메시지들이 기록되는걸 확인 할 수 있다.

 

※주의사항 : 텔레그램 CLI를 많이 사용 하다 보면 로그 파일의 용량이 꽤 커지므로 주기적으로 관리가 필요하다.

 

 


 

 

4. Telegram CLI 서비스 등록하기

 

마지막으로 Telegram CLI 를 service 명령을 이용해서 실행하고 중단 하는 방법을 알아 보자.

 

 

일단 Telegram 을 실행, 정지, 상태 확인 할 수 있는 Shell Script 를 만들자.

 

다음 경로로 이동.

cd /home/pi/tg/

 

다음 소스를 복사하여 tg.sh 파일로 저장한다.

 

#!/bin/bash

TGPATH="/home/pi/tg"
TGBIN_PATH="/home/pi/tg/bin"
TGBIN_NAME="telegram-cli"
TGBOT_PATH="/home/pi/tg/bot/basicbot.lua"
TGLOG_PATH="/var/log/telegram-cli.log"
TGLISTEN_PORT=8888


function ProcChk()
{
    local ProcFile="$1"
    local ProcName="$2"
    PID=`/bin/ps -e -u 0 | /bin/grep -w $ProcFile | /usr/bin/awk '{print $1}'`
    if [ "$PID" ] ;  then
        printf "%16s : Running\n" "$ProcName";
    else
        printf "%16s : Stopped\n" "$ProcName";
    fi;
}

case "$1" in
start)
    echo "Starting Telegram CLI Daemon..."
    cd $TGPATH
    PID=`/bin/ps -e -u 0 | /bin/grep -w telegram-cli | awk '{print $1}'`

    if [ $PID ]; then
        echo "Telegram CLI Already Running"
        # exit 1
    else
        $TGBIN_PATH/$TGBIN_NAME -s $TGBOT_PATH -L$TGLOG_PATH -P $TGLISTEN_PORT -e "contact_list" -d &
        ProcChk "$TGBIN_NAME" "Telegram CLI Daemon"
    fi
    ;;
stop)
    echo "Telegram CLI safe stop Trying"
    `echo "safe_quit" | nc localhost 4500`

    PID=`/bin/ps -e -u 0 | /bin/grep -w telegram-cli | awk '{print $1}'`

    if [ -z $PID ]; then
        echo "Telegram CLI Already Stop"
        # exit 1
    else
        kill -9 $PID
    fi

    sleep 1
    ProcChk "$TGBIN_NAME" "Telegram CLI Daemon"
    ;;
chk)
    ProcChk "$TGBIN_NAME" "Telegram CLI Daemon"
    ;;
*)
    echo "Usage : `basename $0` [ start | stop | chk ]"
    ;;
esac

 

 

 

 

위 소스를 복사 해서 붙여넣거나 아래 파일을 다운로드 받아 /home/pi/tg 경로에 넣어놓는다.

 

 

tg.sh

 

파일을 다운로드 받아서 저장하는걸 추천한다.

 

위 소스 상에는 안보이지만 ANSI COLOR 문자가 포함되어 있어서 필요한 정보는 색깔을 이용해서 표시 하도록 되어 있다.

 

 

파일을 저장하다면 다음 명령어로 실행 권한을 준다.

 

 

[pi@/home/pi/tg]$ sudo chown pi:pi tg.sh

[pi@/home/pi/tg]$ chmod 755 tg.sh

 

아래 명령을 수행해보자.

./tg.sh status

 

다음과 같은 화면이 나온다면 쉘 스크립트가 정상적으로 작동하는 것이다.

 

[pi@/home/pi/tg]$ ./tg.sh chk
Telegram CLI Daemon : Running

 

또는

Telegram CLI Daemon : Stopped

 

Telegram 을 실행, 중단, 체크 할수 있는 스크립트가 만들어 졌다.

 

이제 서비스에 Telegram 을 등록하자.

 

다음 소소를 /etc/init.d/telegramd 파일로 저정한다.

 

 

#!/bin/bash
# /etc/init.d/telegramd

### BEGIN INIT INFO
# Provides:          telegram-cli
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: telegram cli daemon script
# Description:       Telegram CLI Daemon Script
### END INIT INFO

EXEC_ACCOUNT="pi"

case "$1" in 
    start)
        echo "Starting Telegram-cli Deamon"
    	su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh start"
        ;;
    stop)
        #echo "Stopping Telegram-cli Daemon"
        su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh stop"
        ;;
    restart)
        su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh stop"
        su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh start"
        ;;
    status)
	su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh chk"
	;;
    *)
        echo "Usage: /etc/init.d/telegramd {start|stop|restart|status}"
        exit 1
        ;;
esac

exit 0

 

 

 

또는 아래 파일을 다운로드 하여 /etc/init.d/ 경로에 저장한다.

 

 

telegramd

 

 

해당 파일에 실행 권한을 준다.

 

sudo chmod 755 /etc/init.d/telegramd

 

여기까지 되었다면 service 명령으로 Telegram CLI 를 실행 하거나 중단 또는 현재 상태를 체크 할 수 있다.

 

사용 할 수 있는 옵션은 다음과 같다.

 

sudo service telegramd status

 

sudo service telegramd start

 

sudo service telegramd stop

 

sudo service telegramd restart

 

 

  Raspbian Jessie 사용자는 다음 링크를 이용해서 시작 프로그램을 등록 하시면 됩니다.

 

※ Raspbian Jessie 버전은 다음과 같은 메시지가 출력 되는 경우가 있다.

[pi@/home/pi/tg]$ sudo service telegramd status
● telegramd.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

 

    위와 같은 메시지가 보인다면 sudo reboot 명령을 이용해서 재부팅을 한번 하면 된다.

 

그리고 Raspbian Jessie 는 sudo service telegramd start 또는 stop 명령시 아래와 같은 화면이 보이지 않는다.

 

[pi@/home/pi/tg]$ sudo service telegramd start
Telegram CLI Daemon : Running

 

또는

Telegram CLI Daemon : Stopped

 

 

 

 


 

5. 라즈베리파이 부팅시 Telegram CLI 실행 되게 하기

 

chkconfig 를 설치한다.

 

sudo apt-get install chkconfig

 

chkconfig 가 설치 되었다면 Telegram CLI Service 를 부팅시 시작하도록 등록한다.

 

sudo chkconfig --add telegramd

 

 

다음 명령어를 이용해서 서비스가 등록되었는지 확인한다.

 

sudo chkconfig --list telegramd

 

telegramd                 0:off  1:off  2:on   3:on   4:on   5:on   6:off

 

위와 같이 2, 3, 4, 5에 on 이 되어 있다면 부팅시 실행이 되도록 등록이 되었다는 것이다.

 

 

 

 

 

 

여기까지 진행이 되었다면 Telegram CLI 를 좀 더 편리하게 사용 할 수 있을것이다.

 

다음 강좌부터는 Telegram BOT을 활용한 여러 기능들 중 날씨, 토렌트 검색기능 등을 포스팅 하겠다.

 

 

 

 

※ 궁금하신 사항들은 댓글이나 질문 게시판을 이용해서 남겨주세요 ^^

 

 

관련글

 

 

 

  1. BlogIcon creamist 2015.07.21 22:10 신고

    좋은글 공유해주셔서 진심으로 감사드립니다!
    질문이있어서 댓글 남깁니다!

    원래 basicbot.lua파일을 실행 시키는 명령어는 전 3부에서
    bin/telegram-cli -s bot/basic.lua
    표시 되어있는데

    이번장
    제일 첫줄 데몬실행 명령어에서
    커맨더 두번째줄 명령어의
    bin/telegram-cli -s basicbot.lua -d &
    에서 표시가
    bin/telegram-cli -s bot/basicbot.lua -d &
    가 되어야 하지 않나 싶어 댓글남깁니다!

  2. 2015.07.21 23:15

    비밀댓글입니다

    • BlogIcon Acidpop acidpop 2015.07.22 09:01 신고

      랜덤한 숫자가 뜨는건 리눅스 시스템이
      데몬으로 프로세스를 시작했을때 데몬으로 실행된 프로세스의 ID값 알려주는 내용입니다.
      telegram-cli 뿐만 아닌 다른 모든 실행 프로그램도 맨 뒤에 & 기호를 붙이면 동일하게 숫자가 출력되는걸 확인 하실 수 있습니다 ^^
      참고로 데몬으로 띄우면
      ps -ef | grep telegram
      위 명령으로 현재 telegram 이 실행 되어 있는지 확인 하실 수 있습니다.

  3. BlogIcon creamist 2015.07.31 10:09 신고

    질문 있어서 남깁니다! -d& 를 사용해 실행한 데몬을 끄는 명령어가 어떻게 되는지 알수있을지요...

    그리고 계속해서 텔레그램 봇을 개발하기 위해서는 어떤방향으로 공부하는 것이좋을까요??

    루아스크립트와 텔레그램 명령어들을 공부하려하는데 어떻게 해야할지 아직 부족한실력이라 조언을 해주실수있으신가요..

    • BlogIcon Acidpop acidpop 2015.07.23 09:03 신고

      안녕하세요.
      ps -ef | grep tele
      위 명령을 실행해보면 아래와 같이 나옵니다.
      pi 7516 1 0 08:52 ? 00:00:01 /home/pi/tg/bin/telegram-cli

      저 중에 pi 바로 뒤에 나오는 숫자 있죠?

      kill -9 7516
      이렇게 하시면 됩니다.

      또는
      sudo pkill telegram-cli
      이렇게 하셔도 되구요 ^^

      그리고 혹시 댓글 공개로 해주실수 있을까요? 다른분들도 참고가 될만한 질문이라 생각됩니다.

    • BlogIcon Acidpop acidpop 2015.07.23 09:06 신고

      Telegram BOT 에 대한 공부 방향은 제가 정확하게 방향을 제시하기에는 좀 광범위합니다 ^^;;

      제가 활용하고 있는 BOT은 lua 스크립트가 기본으로 되고 내부에서 파이썬, C/C++로 작성된 프로그램, php 등등 다양한 환경에 맞게 사용을 하고 있거든요
      자신이 가장 잘하는 언어로 실제 수행되는 프로그램을 개발하시고 lua 스크립트에서 호출 하는 방식으로 하시면 좋을거 같습니다

  4. BlogIcon 일일신우일신 2015.08.04 08:03 신고

    저는 실행하면 이런 메시지가 나오네요
    1141064000 : 서울특별시 서대문구 홍제제3동
    telegram-cli: lua-tg.c:1362: parse_lua_function: Assertion `pos + 3 + p < 1000' failed.
    SIGNAL received

    해결책이 없을까요?

    • BlogIcon Acidpop acidpop 2015.08.04 10:35 신고

      rename_contact 명령을 lua 스크립트를 이용해서 하셨나요??
      제가 보기에는 한글 주소를 파싱하다가 오류가 발생하는걸로 보입니다.
      한글을 사용할때 큰 따옴표로 묶어서 해보시겠어요?
      rename_contact 는 저도 테스트를 안해봤네요 ^^;

  5. BlogIcon L루핀 2015.08.19 16:01 신고

    sudo service telegramd status 를 입력했을때 이 알림만 뜹니다.
    /etc/init.d/telegramd: 2: /etc/init.d/telegramd: Syntax error: newline unexpected

    • BlogIcon Acidpop acidpop 2015.08.19 16:09 신고

      블로그 내용중 첨부한 파일을 직접 받으셔서 한번 해보시겠어요?
      복사/붙여 넣기 할때 잘못된 문자가 들어가는거 같습니다만..

    • BlogIcon L루핀 2015.08.19 16:32 신고

      직접 다운받아서 ftp 로 넣을려 했는데 복사가 제대로 안됩니다 ㅠㅠ

      P.S 성공했습니다 감사합니다 ㅠㅠ

    • BlogIcon Acidpop acidpop 2015.08.19 17:27 신고

      앗. 성공 하셨다니 다행입니다 ^^

      wget "파일링크" 이렇게 직접 받는 방법도 있어요~!

  6. 예삐 2015.12.07 15:57

    소켓으로 메세지 보내기를 하려는데
    nc: getaddrinfo: Name or service not known
    에러가뜹니다 ㅜㅜ 뭐가 문제죠??

    • BlogIcon Acidpop acidpop 2015.12.08 09:08 신고

      어떤식으로 사용하셨나요?

      nc localhost 이런 형태로 사용하셨는데 뜨는거라면

      /etc/hosts 파일 내용중에

      127.0.0.1 localhost

      이런 줄이 있는지 확인해 보세요

      아니면

      nc 127.0.0.1 이런식으로 IP주소를 직접 써보세요

  7. 방준석 2016.04.20 15:15

    service telegramd status
    ● telegramd.service
    Loaded: not-found (Reason: No such file or directory)
    Active: inactive (dead)
    이렇게 나오는데 어떻게 해야하나요?

    • BlogIcon Acidpop acidpop 2016.04.20 15:48 신고

      안녕하세요.

      아래 경로에 telegramd 라는 파일은 있나요?
      /etc/init.d/telegramd

      실행 환경은 Raspbian 인가요?

  8. 방준석 2016.04.20 15:17

    댓글이 삭제가 안되네요.. 버튼을 너무 많이 눌렀나봐요 ㅠㅜ

  9. 이현우 2016.07.25 09:53

    강좌를 끝까지 따라햇는데
    라즈베리를 부팅시 daemon 이 정상적으로 실행되는것 같다가 스스로 stop 시키는거 같은데 이럴경우 어디를 고쳐줘야할까요?
    service restart 할시 다시 작동합니다

    • 이현우 2016.07.25 09:57

      라즈베리를 reboot시 Loaded: loaded
      Active: active (exited) 이라고는 떠잇는데 로그에 Telegram CLI Daemon : stopped 이라고 되잇네요

      그 상태에서는 sudo service telegramd restart 를 적어줘야 다시 봇이 작동하네요

    • BlogIcon Acidpop acidpop 2016.07.25 15:31 신고

      안녕하세요
      제가 봇을 개발할 당시에는 Wheez 를 사용 했었고 Jessie 버전에서는 충분한 테스트가 안되었네요.
      Jessie 버전에서 시작 프로그램 등록 하는 방법을 포스팅 하였으니 해당 글을 참고해주세요
      http://blog.acidpop.kr/233

  10. 스롱우니 2016.12.03 00:45

    안녕하세요 라즈베리파이 처음사용해보는 많은도움이 되고있습니다. 그런데 안되는 점이 있어서 질문드립니다.
    Telegram CLI 소켓 열기와 로그 파일 경로 설정하기 할때 bin/telegram-cli -s bot/basicbot.lua -P 8888 -d &을 치면
    어떻게 나와야하나요? 저는 [1] 2191 두번치면 [2] 2192식으로나오는데 일단은 이부분은 넘어가서 echo 메세지를 전송합니다해서
    말씀하신거와 같이 오류가 나고있는데 contact_list를 치니까 이미 사용하고 있는 주소라고 나오더라고요ㅜㅜ
    그래서 sudo pkill telegram-cli 이걸로 다끄고 다시해도 이미사용중이라고뜨는데 혹시 어디를 고쳐야할까요?

    • BlogIcon Acidpop acidpop 2016.12.05 09:18 신고

      안녕하세요.

      -d 옵션은 telegram-cli 를 데몬 모드로 사용하겠다 라는 의미 이고
      맨 마지막에 & 기호는 리눅스 상에서 해당 프로그램을 데몬으로 실행 하겠다 라는 의미 입니다.

      처음 실행 하고 [1] 2191 같이 숫자가 나오면 프로그램이 실행 되었고 해당 프로그램의 Process ID 는 2191 이다 라는걸 알려주는거에요.
      즉, 이미 백그라운드에 실행이 되고 있다는 뜻입니다.
      그런데 한번더 실행을 하게 되면 중복 실행이 되버리는건데 그럴때는 오류가 발생 할수 있죠.
      ps -ef | grep telegram 명령을 실행하셔서
      해당하는 pid 는 모두

      pkill -9 pid값

      명령으로 종료 하신 다음 한번만 실행해서 테스트 해보세요

  11. 스롱우니 2016.12.03 01:05

    데몬이랑 로그파일 부분이 잘안되는데 서비스등록만 해도 문제없나요? Jessie버전으로 사용을 하는중이여서 데몬 로그부분 빼고 바로 서비스 등록만 하고있는데 systemtl~~~~부분을 치면 부적절한옵션이라고 뜨는데 데몬이랑 로그부분 다해야하는건가요?

    • BlogIcon Acidpop acidpop 2016.12.05 09:19 신고

      Jessie 버전에서는 systemctl 을 이용해야
      http://blog.acidpop.kr/233
      이 링크를 참고 하시고 "seohyeon" 님이 댓글로 남겨주신 방법을 참고하셔야 합니다.

  12. BlogIcon xoskd 2017.03.23 16:55 신고

    안녕하세요 지금 따라하고있는대
    sudo service telegramd status 를 실행하면
    ● telegramd.service
    Loaded: not-found (Reason: No such file or directory)
    Active: inactive (dead)
    이렇게 뜨는대 어떻게 해야되나여?
    파일 경로도 /etc/init.d 이곳으로 되어있거든여

  13. BlogIcon xoskd 2017.03.23 23:21 신고

    위에 댓글에 해답이 있엇네요 해결했습니다

  14. BlogIcon xoskd 2017.03.24 14:39 신고

    bin/telegram-cli -s bot/basicbot.lua -P 8888 -d & 입력시 뒤에 [1] 4224같이 숫자들이 나오는대 무엇인가여??

  15. BlogIcon xoskd 2017.04.08 21:14 신고

    bin/telegram-cli -s bot/basicbot.lua -P 8888 -e "contact_list" -d &
    이 명령어 실행시
    bind: Address already in use
    라고 뜹니다 .. 어떻해야되져 ㅠㅠ

    • BlogIcon Acidpop acidpop 2017.04.10 10:21 신고

      8888 이라는 포트를 이미 사용 하고 있다는 뜻입니다.

      sudo netstat -nap | grep 8888
      하셔서 어떤 프로세스가 사용하는지 확인해 보세요

    • BlogIcon Acidpop acidpop 2017.04.10 10:22 신고

      아니면 telegram-cli 프로세스를 종료하지 않고 다시 실행 하게 되어서 그런것일수도 있습니다.

    • xoskd 2017.04.10 13:27

      아 텔레그렘 cli 를 다종료한상태에서 등록하니 되는군요

1부 - 라즈베리파이에 Telegram CLI 설치 (http://blog.acidpop.kr/183


2부 - Telegram cli 기초 사용법 (http://blog.acidpop.kr/184)



이번 3부에서는 Telegram CLI 를 BOT 으로 활용하기 위한 기초적은 뼈대를 만들어 보자.


Telegram BOT 이란?

사용자가 텔레그램 BOT 계정에게 어떤 특정한 단어를 전달하면 BOT 이 명령을 처리하여 사진을 찍어서 보낸다던지

라즈베리파이에 연결된 센서값을 읽어서 사용자에게 전송을 한다던지 하는 것을 의미한다.




Telegram CLI 는 스크립트 언어로 lua 와 python 을 지원한다.


바로 이 lua script 와 python script 를 이용해서 BOT 을 제작할 수 있다.



여기서는 lua script 를 이용해서 BOT을 제작한다.



첫번째로 가장 간단한 BOT을 만들어 보자.


먼저 lua script 를 저장하기 위한 디렉토리를 생성한다.


cd /home/pi/tg

mkdir bot

cd bot

mkdir shell

mkdir tmp




bot 디렉토리를 만드는 이유는 점차 커질 lua script 파일들을 관리 하기 위해서이다.

bot 디렉토리 안에서 shell 디렉토리와 tmp 디렉토리도 생성해두었다.


lua script 에서 처리 할 수 없는 명령의 경우에는 Shell script 를 실행하여 결과값을 가져오기 위함이며 실행되는 Shell script 를 모아놓을 경로이다.

tmp 디렉토리는 send_text 또는 카메라를 이용하여 사진을 찍을때 만들어지는 임시 파일들을 저장하기 위한 디렉토리이다.


여기까지 진행이 되었다면 lua 스크립트를 만들어 보자.

--[[
Smart Telegram bot Project (Basic Version)

    2015.07.16
-- by http://blog.acidpop.kr 
]]--


-- 인증된 사용자만 BOT을 이용하게 하기 위해 폰 번호를 배열로 등록해둔다.
auth_phone  = { ["821012341234"] = true, 
                ["821011112222"] = true,
                ["801098765432"] = true }

-- 만약 1개의 폰 번호만 등록하고 싶다면 다음과 같이 작성한다.
--[[
auth_phone  = { ["821012341234"] = true }
]]--


-- 로그인 한 ID를 저장하는 변수
our_id = 0


    -- msg 라는 변수에 어떤 값이 있는지 확인 하기 위해 변수 내부를 출력하는 함수이다.
function vardump(value, depth, key)
    local linePrefix = ""
    local spaces = ""

    if key ~= nil then
    linePrefix = "["..key.."] = "
    end

    if depth == nil then
    depth = 0
    else
    depth = depth + 1
    for i=1, depth do spaces = spaces .. "  " end
    end

    if type(value) == 'table' then
        mTable = getmetatable(value)
    if mTable == nil then
        print(spaces ..linePrefix.."(table) ")
    else
        print(spaces .."(metatable) ")
        value = mTable
    end
    for tableKey, tableValue in pairs(value) do
        vardump(tableValue, depth, tableKey)
    end
    elseif type(value) == 'function' or 
        type(value) == 'thread' or 
        type(value) == 'userdata' or
        value == nil
    then
        print(spaces..tostring(value))
    else
        print(spaces..linePrefix.."("..type(value)..") "..tostring(value))
    end
end


    -- 수신 받은 메시지 중 특정 단어에 대해 처리 하는 함수들
function Hello(user_id)
    send_msg(user_id, '"안녕" 명령어를 입력하셨습니다', ok_cb, false)
end

function GetWether(user_id, arg)
    send_msg(user_id, '"날씨" 명령어를 입력하셨습니다', ok_cb, false)
end


function SendHelp(user_id)
    -- /home/pi/tg/bot 경로에 help.txt 파일이 있어야 한다.
    send_text(user_id, '/home/pi/tg/bot/help.txt', ok_cb, false)
end


    -- cmd 의 문자열을 비교 하여 각각 함수를 호출 하는 기능을 한다.
    -- 앞으로 BOT 명령어는 이곳에 추가한다.
function msg_processing(user_id, cmd, arg)
    -- Camera still
    if     ( cmd == '안녕' )        then    Hello(user_id)
    elseif ( cmd == '날씨' )        then    GetWether(user_id, arg)
    elseif ( cmd == 'help' )    then    SendHelp(user_id)
    -- else 해당 되지 않는 명령은 무시한다
    end
end

    -- 메시지 수신 처리 하는 함수
    -- 메시지가 수신 되면 이 함수가 호출되어진다
function on_msg_receive (msg)
    -- msg 변수에 있는 모든 항목을 출력
    vardump(msg)

    -- 자신이 보낸 메시지라면 return
    -- 자신의 계정으로만 사용중이라면 if <--> end 부분을 주석 처리
    if msg.out then
        print("-- : ", msg.out, "\n")
        return
    end

    -- auth (지정한 폰번호만 인증)
    if auth_phone[msg.from.phone] then
        print "auth    : OK "
    else
        print "auth    : invalid user"
        return
    end

    -- 수신 받은 메시지를 띄어쓰기를 기준으로 Command 와 Argument로 나눈다.
    -- ex : search arg1 text 123 => cmd = "search", arg = "arg1 text 123"
    local cmd, arg  = split(msg.text)

    -- command 가 영문일 경우 모두 소문자로 변환
    cmd = string.lower(cmd)
    print("receive  : [", cmd, "]\n")
    print("argument : [", arg, "]\n")

    -- 사용자 정보를 print 한다.
    print("Name     : ", msg.from.print_name)   -- 메시지 보낸사람 real name (Jinho)
    print("Phone    : ", msg.from.phone)            -- 메시지 보낸사람 전화번호  (8210AAAABBBB)
    print("Msg Num  : ", msg.id)                    -- 메시지 번호
    print("to.Name  : ", msg.to.print_name)

    -- 메시지를 전송할 대상을 구분하기 위한 기능.
    -- msg 를 보낸 ID와 로그인한 ID가 동일하다면 BOT에서 사용자에게 보낸 메시지이므로 from을 user_id로 설정
    -- msg 를 보낸 ID와 로그인 ID가 다르다면 BOT이 메시지를 수신 받은 경우이므로 to를 user_id로 설정
    if (msg.to.id == our_id) then
        user_id = msg.from.print_name
    else
        user_id = msg.to.print_name
    end

    -- 읽은 메시지로 표시
    mark_read(user_id, ok_cb, false)

    -- 메시지를 구분하는 함수, 이곳에서 command 를 인식하여 각각 처리한다
    msg_processing(user_id, cmd, arg)

end

    -- 비밀 대화방 생성시 호출 (확인 안됨)
function on_secret_chat_created (peer)
    print "secret chat create event"
end

    -- 비밀 대화방 생성이 아래 함수 호출 됨.
function on_secret_chat_update (schat, what)
    print "secret chat update event"
end

    -- 사용자 정보 업데이트시 호출됨
function on_user_update (user)
    print "user update event"
end

    -- 채팅방 업데이트시 호출됨
function on_chat_update (user)
    print "chat update event"
end

    -- 현재 로그인 한 ID를 통지 받는 함수 (숫자 형태의 ID) 
function on_our_id(id)
    our_id = id
    print("My user# : ", id)
end

    -- 어떤 기능인지 확인 안됨
function on_get_difference_end ()
end

    -- 기존 이벤트가 종료 될때 호출, 정확한 의미 파악이 안됨.
function on_binlog_replay_end ()
end

    -- telegram cli 에서 제공하는 lua 함수를 수행하였을때 결과를 받기 위한 함수.
    -- ex: send_msg(user_id, '메시지', ok_cb, false)
function ok_cb(extra, success, result)
end


-- 문자열의 앞뒤 공백을 없애는 함수
function trim(s)
  return (s:gsub("^%s*(.-)%s*$", "%1"))
end


    -- 문자열을 space 기준으로 잘라 command와 argument를 나누는 함수
function split(str)
    local cmd=""
    local arg=""
    local arg_cnt=1

    for s in string.gmatch(str, "[^%s]+") do
        if ( arg_cnt == 1 ) then
            cmd = s
        else
            arg = arg .." ".. s
        end
        arg_cnt = arg_cnt + 1
    end

    cmd = trim(cmd)
    arg = trim(arg)

    return cmd, arg
end




위 소스를 /home/pi/tg/bot/basicbot.lua 이름으로 저장한다.


복붙이 안되는 상황이라면 아래 파일을 받는다.


 

basicbot.lua




물론 당연히 소스의 auth_phone 부분에는 수신 받을 대상의 전화번호가 있어야 한다.


파일을 저장하였다면 다음 명령어로 Telegram CLI를 실행한다.



cd /home/pi/tg/

bin/telegram-cli -s bot/basicbot.lua


 

-s 옵션이 lua script 파일을 로딩하여 작동하게 만드는 옵션이다.


텔레그램이 실행 되어 있고 메시지를 수신 받으면 특정 단어에 한해서 lua 스크립트가 수행된다.


Telegram BOT 계정에 "안녕" 이라고 보내면


'안녕 명령어를 입력하셨습니다' 라고 메시지를 보내주고


'날씨' 라고 메시지를 보내면 BOT은 '날씨 명령어를 입력하셨습니다' 라고 메시지를 보내준다.


/home/pi/tg/bot/ 경로에 help.txt 파일이 있다면


help 라는 메시지를 보내게 되면 help.txt 파일의 내용을 사용자에게 전달하게 된다.






이상으로 Telegram BOT 의 가장 기초적인 작업이 완료 되었다.


하지만 위와 같이 실행 하였을때  SSH 접속툴을 종료하면 Telegram CLI 도 같이 종료가 되어 버린다.


리눅스의 Daemon 으로 Telegram CLI 를 실행 해야만 지속적으로 반응 하는 Telegram BOT이 완성이 되는데


Daemon 으로 띄우는 과정과 service 에 등록하는 과정등은 다음 4부에 다루어 본다.

 

 

관련글

 

  1. 2016.03.18 17:56

    비밀댓글입니다

    • BlogIcon Acidpop acidpop 2016.03.18 17:59 신고

      안녕하세요

      전반적인 소스나 로그가 없어서 바로 판단하기는 어렵습니다만...

      혹시 A 라는 계정에서 A계정으로 메시지를 보내시나요?

      아니면 봇의 계정은 다른 계정을 사용하시나요?

      만약 같은 계정으로 메시지를 보냈다면

      basicbot.lua 파일에서

      88 -- 자신이 보낸 메시지라면 return
      89 -- 자신의 계정으로만 사용중이라면 if <--> end 부분을 주석 처리
      90 if msg.out then
      91 print("-- : ", msg.out, "\n";)
      92 return
      93 end


      90~93 라인을 삭제 하던지 주석 처리 하셔서 사용해 보세요

    • 여우너 2016.03.21 11:02

      감사합니다

      알려주신 부분 주석처리 하니 답변이 오네요

      해결되었습니당 ^^

      정말 많은 도움이 되고 있습니다

      감사합니다

  2. 정범진 2016.03.24 20:52

    안녕하세요. 올려주신 자료를 따라하던 중

    (table)
    [from] = (table)
    [peer_id] = (number) 202089138
    [last_name] = (string) Pi
    [print_name] = (string) Strawberry_Pi
    [id] = (string) $01000000b2a20b0c70f34b10e8f80dbb
    [phone] = (string) 12816034555
    [peer_type] = (string) user
    [access_hash] = (number) 1
    [first_name] = (string) Strawberry
    [flags] = (number) 196609
    [unread] = (boolean) true
    [text] = (string) 날씨
    [id] = (string) 01000000b2a20b0ccd0000000000000070f34b10e8f80dbb
    [to] = (table)
    [peer_id] = (number) 84273437
    [last_name] = (string) Jung
    [print_name] = (string) Bumjin_Jung
    [id] = (string) $010000001de90505347275aac14ecdc7
    [phone] = (string) 61452405414
    [peer_type] = (string) user
    [access_hash] = (number) 1
    [first_name] = (string) Bumjin
    [flags] = (number) 589825
    [date] = (number) 1458820102
    [service] = (boolean) false
    [out] = (boolean) false
    [flags] = (number) 257
    auth : OK
    receive : [ 날씨 ]

    argument : [ ]

    Name : Strawberry_Pi
    Phone : 12816034555
    Msg Num : 01000000b2a20b0ccd0000000000000070f34b10e8f80dbb
    to.Name : Bumjin_Jung
    [11:48] Strawberry Pi >>> 날씨
    (table)
    [from] = (table)
    [peer_id] = (number) 84273437
    [last_name] = (string) Jung
    [print_name] = (string) Bumjin_Jung
    [id] = (string) $010000001de90505347275aac14ecdc7
    [phone] = (string) 61452405414
    [peer_type] = (string) user
    [access_hash] = (number) 1
    [first_name] = (string) Bumjin
    [flags] = (number) 589825
    [unread] = (boolean) true
    [text] = (string) 날씨 명령어를 입력하셨습니다
    [id] = (string) 010000001de90505ce00000000000000347275aac14ecdc7
    [to] = (table)
    [peer_id] = (number) 84273437
    [last_name] = (string) Jung
    [print_name] = (string) Bumjin_Jung
    [id] = (string) $010000001de90505347275aac14ecdc7
    [phone] = (string) 61452405414
    [peer_type] = (string) user
    [access_hash] = (number) 1
    [first_name] = (string) Bumjin
    [flags] = (number) 589825
    [date] = (number) 1458820103
    [service] = (boolean) false
    [out] = (boolean) true
    [flags] = (number) 16643
    auth : invalid user
    [11:48] Bumjin Jung <<< 날씨 명령어를 입력하셨습니다

    이런식으로 계속 자기 자신에게만 메세지를 보내는 오류때문에 한참을 고민하다
    댓글 남겨봅니다.
    다른 기기를 통해 봇에게 메세지를 보내었는데 그 기기가 아닌 봇 자신에게 답장을 하는 모양새입니다.

    혹시 한번 봐주실 수 있으신가요?

    • BlogIcon Acidpop acidpop 2016.03.25 10:41 신고

      안녕하세요.

      혹시 소스를 어딘가 수정 하신건가요?

      아니면 basicbot.lua 파일에

      9 -- 인증된 사용자만 BOT을 이용하게 하기 위해 폰 번호를 배열로 등록해둔다.
      10 auth_phone = { ["821051812816"] = true,
      11 ["821011112222"] = true,
      12 ["801098765432"] = true }


      이 코드를 수정을 안하고 그냥 쓰시는건 아니신지요?

    • BlogIcon JSA 2016.05.22 16:08

      범진님 제가 겪었던 현상하고 같네요.
      131번하고 133번에
      user_id=msg.from.print_name 로 둘다 바꿔주시면 정상적으로
      작동합니다.

  3. OJR 2016.08.01 17:57

    안녕 이라고 쳤는데 MAG넘버가 계속 바뀌면서 응답을 여러번하는데 어떻게 해야하나요?

    • BlogIcon Acidpop acidpop 2016.08.01 18:11 신고

      무슨 말씀이신지 잘 이해를 못하겠습니다.
      로그 내용을 올려주시는게 더 빠를거 같아요

  4. 블리어 2016.09.10 22:06

    포스팅 잘보고있습니다.
    일단 저는 현재 한게의 계정으로 사용을 하다보니 위 에 댓글과 갔이
    90 if msg.out then
    91 print("-- : ", msg.out, "\n";)
    92 return
    93 end
    부분을 주석 처리 하였습니다..
    일단 메시지는 받아 지는대... 위의 OJR 님의 내용과 동일하개 됩니다. (즉 : 안녕 명령어를 입력하셨습니다 가 계속 반복하여 텔레그람에 찍히고 로고역씨 MAG 넘버가 변경 괴면서 계속 약 20~30 번 반복 됩니다...
    --로고내용--
    (table)
    [id] = (string) 0100000028db0b00b1000000000000004b4114ed57df059f
    [unread] = (boolean) true
    [out] = (boolean) true
    [to] = (table)
    [id] = (string) $0100000028db0b004b4114ed57df059f
    [phone] = (string) 42777
    [peer_id] = (number) 777000
    [access_hash] = (number) 1
    [first_name] = (string) Telegram
    [flags] = (number) 9
    [print_name] = (string) Telegram
    [peer_type] = (string) user
    [flags] = (number) 16643
    [from] = (table)
    [id] = (string) $01000000e2106f0d8b7f8273820ed4fa
    [phone] = (string) 821093308642
    [print_name] = (string) Lee_Chang_Hyun
    [peer_type] = (string) user
    [first_name] = (string) Lee
    [access_hash] = (number) 1
    [peer_id] = (number) 225382626
    [last_name] = (string) Chang Hyun
    [flags] = (number) 524289
    [date] = (number) 1473512369
    [text] = (string) 안녕 명령어를 입력하셨습니다
    [service] = (boolean) false
    auth : OK
    receive : [ 안녕 ]

    argument : [ 명령어를 입력하셨습니다 ]

    Name : *******
    Phone : 8210********
    Msg Num : 0100000028db0b00b1000000000000004b4114ed57df059f <--- 이부분 변함
    to.Name : Telegram
    [21:59] Telegram <<< 안녕 명령어를 입력하셨습니다

    혹시 어디를 수정하거나 손봐야하는지 조언을 구할수있을까요?

    • BlogIcon Acidpop acidpop 2016.09.12 09:51 신고

      안녕하세요.
      정확한 내용 파악이 필요한데 지금 사용하고 계신 봇 시스템의 ssh 로 제가 접속해서 볼 수 있을까요?

    • BlogIcon Acidpop acidpop 2016.09.12 10:04 신고

      소스를 가지고 직접 테스트 해보았습니다.

      원인은 자신에게 메시지를 보낼때 안녕
      이라고 입력하면 안녕 메시지를 입력하셨습니다. 라고 다시 메시지를 보내는데
      "안녕 메시지를 입력하셨습니다." 라는 메시지를 명령어로 판단을 해서 무한 루프가 발생하는 경우가 있네요.

      소스 내용중에 '안녕 명령어를 입력하셨습니다'

      위 내용을
      '"안녕" 명령어를 입력하셨습니다'
      이렇게 안녕 이라는 글자 앞 뒤로 큰 따옴표를 붙여 주세요.
      바로 아래줄의 '날씨 명령어를 입력하셨습니다' 부분도
      '"날씨" 명령어를 입력하셨습니다'

      이렇게 바꿔주시고 테스트 해보시면 됩니다.

  5. 패닉 2016.11.05 17:50

    제가 저한테 문자보내지는데 ... 봇이 저한테 보내게 할 수 있을까요?

    • BlogIcon Acidpop acidpop 2016.11.07 09:02 신고

      Telegram CLI 에서 봇과 계정을 분리 하려면
      봇 전용 계정, 즉 폰 번호가 하나 더 있어야 합니다.

      그럴 환경이 안된다면 Telegram CLI 가 아닌 Telegram BOT 을 사용하시는게 더 좋을것 같습니다.

      http://blog.acidpop.kr/215

      봇 계정을 만드는 방법이고

      python 을 이용해서 telepot 을 사용하시면 됩니다.

  6. 피그 2016.12.06 18:43

    lua 스크립트랑 파이썬 스크립트랑 차이가있나요 제가 파이썬으로 이미 짜던 소스가 있는데 atmega128에서 데이터를 받아서 처리를 하는데 그거를 메세지로 폰으로 다시전송하려고하는데 파이썬과 lua 병합을 못하겠네요... 혹시 방법이있을까요?
    아니면 파이썬 스크립트 내용도 있을가요?

    • BlogIcon Acidpop acidpop 2016.12.07 09:11 신고

      Telegram CLI 는 Python 도 지원합니다.
      https://github.com/vysheng/tg/blob/master/README-PY.md

      해당 링크 참고하시면 되요

  7. 피그 2016.12.06 21:01

    텔레그램을 깔고 나니까 깔고난후에는 재부팅하니까 깔기전으로 돌아가던데 혹시원인을 알 수 있을까요..;;

    • BlogIcon Acidpop acidpop 2016.12.07 09:12 신고

      텔레그램 CLI 를 다운로드 하고 컴파일 하였는데
      다운로드 받은 텔레그램 CLI 가 없어졌다 라는 말씀이신가요?

  8. 피그 2016.12.07 13:39

    텔레그램 CLI이인지 lua 스크립트인지 잘 모르겠습니다. 제가 sd카드가 2개있었는데 둘다 텔레그램 하면서 안돼서
    어떤상황이냐면 이 작업을 한 이후에 프로그램들은 다 날라갑니다 안에 프로그램을 다 삭제하고 초기라즈베리를 깔아도 이작업하기 바로전으로 돌아가고 예를들어 텔레그램 하기전이 0이고 하고난후가 1이면 무슨행동을 하든 0으로 돌아가버립니다... 포맷을 하려고해도 포맷이 안대고 초기화를 해도 0으로 다시돌아가버립니다.. 해결책이 있을까요..ㅜㅜ
    그리고 위에 python참고링크를 눌렀는데 엑박뜨는데 라즈베리 명령어창에서 치라는 말씀이신가요?

    • BlogIcon Acidpop acidpop 2016.12.07 13:52 신고

      "프로그램이 날아 간다" 라는 의미를 도무지 이해를 못하겠습니다.

      부팅이 안된다는 말씀이신가요?
      아니면 텔레그램 CLI 가 설치된 디렉터리가 없어진다는 뜻인가요?

      좀 더 정확한 증상을 말씀해주세요.

      그리고 python 링크는 Telegram CLI 의 기초가 되는 tg 의 github 링크 입니다만.. 왜 안열리는지는 잘 모르겠네요?

      https://github.com/vysheng/tg

      여기에서 README-PY.md 파일을 참고 하시면 되요

      이게 어렵다면 python 용 텔레그램 봇인 telepot 을 이용하세요

      https://github.com/nickoala/telepot

  9. 피그 2016.12.07 17:45

    어그러니까 부팅은 되는데 날라간다는말이 그후에 하는 작업내용들이 다날라간다는뜻입니다. 예를들어 바탕화면에 새문서 하나 만들어놓으면 재부팅을 하면 그게 삭제되어있습니다... 그냥 그후에 하는작업들이 하나도 저장이안됩니다.

    • BlogIcon Acidpop acidpop 2016.12.07 17:47 신고

      telegram cli 만 설치 하면 그런 증상이 나타나나요? 아니면 다른 파일을 생성하여도 그렇게 되나요?
      그리고 작업하시는 디렉토리 경로는 어디인가요?

  10. 왕초보 2017.06.10 12:30

    안녕 등의 명령어를 보내면 인코딩이 이상하게 되나봅니다.
    짬짬짬 이렇게 나오네요
    인코딩 설정도 해야하나요?

Telegram BOT 강좌 2부

 

 

Telegram CLI 의 기초적인 사용방법과 BOT 의 기초 작업에 대한 강좌.

 

 

 

 

 

 

1. Telegram CLI 기초 사용방법.

 

 

Telegram CLI 를 설치를 하였다면 이제 활용을 해야 한다.

 

그 전에 Telegram CLI 의 기초적인 사용방법을 알아 보자.

 

cd /home/pi/tg

 

명령을 이용해서 Telegram이 있는 디렉토리로 이동한다.

 

bin/telegram-cli -k server.pub

 

위 명령을 이용하면 Telegram CLI 가 실행이 되고 다음과 같은 화면을 볼 수 있다.

 

 

[pi@/home/pi/tg]$ bin/telegram-cli -k server.pub
Telegram-cli version 1.3.3, Copyright (C) 2013-2015 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.
Telegram-cli uses libtgl version 2.0.3
Telegram-cli includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit. (http://www.openssl.org/)
Telegram-cli uses libpython version 2.7.3
I: config dir=[/home/pi/.telegram-cli]
>

 

 

 이 상태에서 다음 명령어를 입력하자.


help


help 명령을 치고 엔터를 누르면 다음과 같은 도움말을 볼 수 있다.


accept_secret_chat <secret chat>    Accepts secret chat. Only useful with -E option
add_contact <phone> <first name> <last name>    Tries to add user to contact list
block_user <user>    Blocks user
broadcast <user>+ <text>    Sends text to several users at once
chat_add_user <chat> <user> [msgs-to-forward]    Adds user to chat. Sends him last msgs-to-forward message from this chat. Default 100
chat_del_user <chat> <user>    Deletes user from chat
chat_info <chat>    Prints info about chat (id, members, admin, etc.)
chat_set_photo <chat> <filename>    Sets chat photo. Photo will be cropped to square
chat_with_peer <peer>    Interface option. All input will be treated as messages to this peer. Type /quit to end this mode
clear    Clears all data and exits. For debug.
contact_list    Prints contact list
contact_search username    Searches user by username
create_group_chat <name> <user>+    Creates group chat with users
create_secret_chat <user>    Starts creation of secret chat
del_contact <user>    Deletes contact from contact list
delete_msg <msg-id>    Deletes message
dialog_list [limit=100] [offset=0]    List of last conversations
export_card    Prints card that can be imported by another user with import_card method
export_chat_link    Prints chat link that can be used to join to chat
fwd <peer> <msg-id>+    Forwards message to peer. Forward to secret chats is forbidden
fwd_media <peer> <msg-id>    Forwards message media to peer. Forward to secret chats is forbidden. Result slightly differs from fwd
get_message <msg-id>    Get message by id
get_self     Get our user info
help    Prints this help
history <peer> [limit] [offset]    Prints messages with this peer (most recent message lower). Also marks messages as read
import_card <card>    Gets user by card and prints it name. You can then send messages to him as usual
import_chat_link <hash>    Joins to chat by link
load_audio <msg-id>    Downloads file to downloads dirs. Prints file name after download end
load_chat_photo <chat>    Downloads file to downloads dirs. Prints file name after download end
load_document <msg-id>    Downloads file to downloads dirs. Prints file name after download end
load_document_thumb <msg-id>    Downloads file to downloads dirs. Prints file name after download end
load_file <msg-id>    Downloads file to downloads dirs. Prints file name after download end
load_file_thumb <msg-id>    Downloads file to downloads dirs. Prints file name after download end
load_photo <msg-id>    Downloads file to downloads dirs. Prints file name after download end
load_user_photo <user>    Downloads file to downloads dirs. Prints file name after download end
load_video <msg-id>    Downloads file to downloads dirs. Prints file name after download end
load_video_thumb <msg-id>    Downloads file to downloads dirs. Prints file name after download end
main_session    Sends updates to this connection (or terminal). Useful only with listening socket
mark_read <peer>    Marks messages with peer as read
msg <peer> <text>    Sends text message to peer
msg <peer> <kbd> <text>    Sends text message to peer with custom kbd
quit    Quits immediately
rename_chat <chat> <new name>    Renames chat
rename_contact <user> <first name> <last name>    Renames contact
reply <msg-id> <text>    Sends text reply to message
reply_audio <msg-id> <file>    Sends audio to peer
reply_contact <msg-id> <phone> <first-name> <last-name>    Sends contact (not necessary telegram user)
reply_document <msg-id> <file>    Sends document to peer
reply_file <msg-id> <file>    Sends document to peer
reply_location <msg-id> <latitude> <longitude>    Sends geo location
reply_photo <msg-id> <file> [caption]    Sends photo to peer
reply_video <msg-id> <file>    Sends video to peer
resolve_username username    Searches user by username
safe_quit    Waits for all queries to end, then quits
search [peer] [limit] [from] [to] [offset] pattern    Search for pattern in messages from date from to date to (unixtime) in messages with peer (if peer not present, in all messages)
send_audio <peer> <file>    Sends audio to peer
send_contact <peer> <phone> <first-name> <last-name>    Sends contact (not necessary telegram user)
send_document <peer> <file>    Sends document to peer
send_file <peer> <file>    Sends document to peer
send_location <peer> <latitude> <longitude>    Sends geo location
send_photo <peer> <file> [caption]    Sends photo to peer
send_text <peer> <file>    Sends contents of text file as plain text message
send_typing <peer> [status]    Sends typing notification. You can supply a custom status (range 0-10): none, typing, cancel, record video, upload video, record audio, upload audio, upload photo, upload document, geo, choose contact.
send_typing_abort <peer>    Sends typing notification abort
send_video <peer> <file> [caption]    Sends video to peer
set <param> <value>    Sets value of param. Currently available: log_level, debug_verbosity, alarm, msg_num
set_password <hint>    Sets password
set_profile_name <first-name> <last-name>    Sets profile name.
set_profile_photo <filename>    Sets profile photo. Photo will be cropped to square
set_ttl <secret chat>    Sets secret chat ttl. Client itself ignores ttl
set_username <name>    Sets username.
show_license    Prints contents of GPL license
start_bot <bot> <chat> <data>    Adds bot to chat
stats    For debug purpose
status_online    Sets status as online
status_offline    Sets status as offline
unblock_user <user>    Unblocks user
user_info <user>    Prints info about user (id, last online, phone)
view_audio <msg-id>    Downloads file to downloads dirs. Then tries to open it with system default action
view_chat_photo <chat>    Downloads file to downloads dirs. Then tries to open it with system default action
view_document <msg-id>    Downloads file to downloads dirs. Then tries to open it with system default action
view_document_thumb <msg-id>    Downloads file to downloads dirs. Then tries to open it with system default action
view_file <msg-id>    Downloads file to downloads dirs. Then tries to open it with system default action
view_file_thumb <msg-id>    Downloads file to downloads dirs. Then tries to open it with system default action
view_photo <msg-id>    Downloads file to downloads dirs. Then tries to open it with system default action
view_user_photo <user>    Downloads file to downloads dirs. Then tries to open it with system default action
view_video <msg-id>    Downloads file to downloads dirs. Then tries to open it with system default action
view_video_thumb <msg-id>    Downloads file to downloads dirs. Then tries to open it with system default action
view <msg-id>    Tries to view message contents
visualize_key <secret chat>    Prints visualization of encryption key (first 16 bytes sha1 of it in fact}


 


이 수많은 명령어들 중에 자주사용하는 명령어는 다음과 같다.


contact_list

내 텔레그램 계정에 등록된 주소록을 보여주는 기능

 msg

msg <peer> <text>    Sends text message to peer

다른 사용자에게 메시지를 보내는 기능

peer 와 text 를 인자로 받게 되어 있다.

사용 방법은 다음과 같다.

msg first_name_second_name "전달한 메시지"

contact_list 에서 다음과 같은 이름 목록이 나왔을 경우의 예제이다. (띄어쓰기 주의)

contact_list

홍 길동

john doe

김영희


위와 같은 목록의 주소록을 가지고 있는 경우 <peer> 항목에 이름을 써주어야 하는데

First Name 과 Second Name 사이에 밑줄(UnderBar) 를 이용해서 이어주면 된다.

First Name 만 있는 경우에는 First Name 만 써주면 된다.

ex)

msg 홍_길동 처음으로 보내보는 메시지 예제

msg john_doe Hello, World

msg 김영희 샘플 메시지입니다.

 send_text

 send_text <peer> <file>    Sends contents of text file as plain text message

Text 파일을 보내기 위한 기능

msg 기능으로도 텍스트를 보낼수 있지만 msg 기능은 줄바꿈이 들어간 메시지를 보낼 수가 없다.

여러줄로 구성된 메시지를 보내기 위해서는 보내려는 메시지를 Text 파일에 작성 후 send_text 를 이용해 보낸다.

send_text 홍_길동 /home/pi/tgmsg.txt

 quit

 Telegram CLI를 종료한다.

 safe_quit

 Telegram CLI를 안전하게 종료한다. 이미 수행된  명령을 기다렸다가 종료하는 명령이다.



주로 써야 되는 기능에 대한 기초적인 사용방법이며 다른 Command 들도 command <peer> <option> 형태의 구조로 되어 있기 떄문에


무리 없이 사용할 수 있을것이다.





※ contact_list 를 했는데 아무도 없다면 Telegram Web 버전이나 PC버전, 모바일앱을 이용해서 자신이 쓸 계정을 친구 추가해두면


편리하게 이용할 수 있다.


CLI 에서 add_contact +8212340000 홍 길동


이런식으로 친구를 추가 할 수도 있다.





글이 길어져서 3부에 Telegram CLI BOT의 기초작업을 다루어보자.

 

 

 

관련글

 

  1. BlogIcon creamist 2015.07.19 03:37 신고

    기대하겠습니다!

    • 힘들다 2015.10.08 16:32

      # bin/telegram-cli -k server.pub 명령을 수행하면 조금 있다. 아래처럼 종료됩니다. 원인이 뭘까요??
      > telegram-cli: event.c:715: event_add: Assertion `!(ev->ev_flags & ~(0xf000 | 0x9f))' failed.
      SIGNAL received

  2. BlogIcon Acidpop acidpop 2015.10.08 16:47 신고

    글쎄요.. 해당 메시지만 가지고서는 원인을 찾기 어려울것 같습니다.
    telegram-cli 내부의 오류인거 같은데...
    telegram-cli 전부 삭제 하시고 재컴파일 해보시는게 나을것 같습니다.

텔레그램 메신저는 프로토콜이 공개 되어 있는 메신저이다.

 

이로 인해 전세계 수많은 사람들이 각각 자신만의 방식으로 메신저를 만들수 있는 구조이다.

 

여기서는 https://github.com/vysheng/tg 이 github 에서 제공 되는 Telegram CLI 를 가지고 설치를 할 것이다.

 

 

필자는 라즈베리파이2 에 raspbian OS 를 기준으로 설명한다.

 

 

 

라즈베리파이에 Telegram CLI 설치하기

 

 

1. pi 계정 디렉토리로 이동

cd /home/pi

 

2. apt-get 패키지 업데이트

sudo apt-get update

 

3. Telegram CLI 에서 사용하는 필수 라이브러리 설치

sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev make git-core python2.7-dev libjansson-dev sqlite3 lua5.2-socket

 

sqlite3 는 bot 을 만들때 사용할 DB 도구이다.

 

4. Telegram CLI Source 다운로드

git clone --recursive https://github.com/vysheng/tg.git && cd tg

 

5. Makefile 생성하기.

./configure

 

6. Source 빌드 하기

make 

 

컴파일 시간이 꽤 오래 걸린다.

 

 

컴파일이 완료 되면 다음과 같이 실행해보자.

 

 

bin/telegram-cli -k server.pub

 

Telegram CLI 를 처음 실행 하고 조금 기다리다 보면 다음과 같은 메시지를 볼 수 있다.

 

phone number: +821012341234               <-- 만약 010-1234-1234 라면 +821012341234  라고 입력한다.

code :              <-- 위 핸드폰 번호를 제대로 입력 했다면 해당 번호로 SMS 메시지가 오거나 이미 텔레그램을 사용중이라면 해당 번호로 사용중인 텔레그램 앱으로 인증 코드가 전송되는데 그 코드 값을 입력하면 된다.

 

 

팁 : 필자는 KT 폰을 사용중인데 KT 부가서비스 중에 투넘버 서비스가 있다. 핸드폰 하나에 번호를 하나 더 부여 받을 수 있는 기능인데... 유료다.

무려 월3000원이나 하는 비싼 서비스이다.

 

하지만 부가서비스를 신청 하고 Telegram 만 인증을 한 다음 그 다음날 부가서비스를 해지했더니 100원 정도가 추가되는걸 확인했다.

100원으로 Telegram 계정을 하나 더 만들어서 사용하자.

단점 : 부여 받은 전화번호는 부가 서비스를 해제하면서 다른 사용자가 가져 갈 수도 있는 번호이니 왠만하면 텔레그램을 안쓰는 사람의 번호를 이용하는게 좋을듯 하다.

최근, NextPlus 라는 앱을 이용해서 무료 SMS 번호를 하나 생성하고 그 번호로 텔레그램 인증을 받으니 잘 됩니다.

투넘버 서비스보다는 위 앱을 이용해서 가상 번호 하나 만들어서 쓰시는게 좋을듯 합니다.

 

자세한 사용 방법은 TextPlus 나 NextPlus 로 검색해보시면 많이 나오더군요 ^^

 

 

텔레그램 CLI 가 실행 되면

>  이 기호가 보일것이다.

 

여기서 help 라고 명령을 치면 Telegram CLI 에서 사용 할 수 있는 명령어 목록들이 보인다.

 

 

※ 텔레그램이 한번 인증 되었다면 인증 파일이 생성이 되는데 그 경로는 다음과 같다.

 

/home/pi/.telegram-cli

 

 

여기서 .telegram-cli 이 디렉토리만 백업해서 가지고 있으면 라즈베리파이를 포멧했다가 다시 설치 해도

 

.telegram-cli 만 복구 해주면 인증하지 않아도 그전에 인증한데로 작동한다.

 

인증 과정이 귀찮으신 분들은 이 디렉토리를 백업해두자.

 

cd /home/pi

tar cvfz tgauth.tgz ./.telegram-cli

 

tgauth.tgz 파일을 안전한곳에 보관한다.

 

 

 

 

다음 2부에서는 기본적인 메시지 전송과 활용 방법, BOT 의 기초를 만들어 보는 강좌를 공개합니다.

 

 

 

필자가 활용 중인 BOT

 

1. 동네 예보 조회

 

 

 

 

2. 간단한 사전 기능 

 

 

 

3. 사진 촬영 후 전송 , 토렌트 검색 및 토렌트 다운로드

 

 

 

4. 라즈베리파이 시스템 체크 기능

 

 

 

 

간략하게나마 위와 같은 기능들을 개발해서 사용중이며 강좌를 통해 공개 예정입니다.

 

이외에도 자신의 XE 게시판에 글이 등록되면 알림을 보내는 기능, Torrent 다운로드 완료 알림 등등 알림 메시지로도 사용중에 있습니다.

 

 

 

관련글
  1. BlogIcon 종달 2015.07.27 21:36 신고

    투넘버보다 더 좋은게 있습니다... 유심 데이터 쉐어링이죠... 쉐어링 자식이 되는 유심에도 번호가 있어서 기본적으로... 문자수신이 가능합니다... 1회선은 무료이니 하나정도 개통해서 쓰셔도 될거라고 봅니다...

    • BlogIcon Acidpop acidpop 2015.07.28 09:06 신고

      좋은 정보 감사합니다. ^^;

      저도 최근에 여러 시도를 해보다가 NextPlus 라는 앱을 사용해서 무료 SMS 번호를 하나 생성해서 인증해보니 잘 되더라구요

  2. 카스 2015.11.23 18:59

    위 내용 중 인증 시 휴대폰 번호를 적게 되는데, 그렇다면 이후 부터 텔레그램에게 메시지 전송은 인증받은 전화번호에서만 가능한가요?
    관리자가 여러명인 경우 그룹채팅방에서 같이 메시지를 보낸다거나 또는 특정 관리자가 별도의 방에서 보낼 순 없나요?

    • BlogIcon Acidpop acidpop 2015.11.24 09:02 신고

      질문 내용을 정확히 이해 하지를 못했습니다...
      위 내용중 휴대폰 번호를 적는 부분은 Telegram 의 가입 절차입니다.
      Telegram 계정은 무조건 휴대폰 번호가 있어야만 됩니다.

    • 카스 2015.11.24 18:17

      질문이 다소 설명이 부족했던 것 같습니다.

      제가 윈도우 cygwin 환경에서 telegram-cli를 설치하여 테스트중입니다만,
      최초 실행 후 인증 시 제 휴대폰 번호를 입력하니, 자동으로 텔레그램 메신저 상에
      제 이름으로 된 채팅방이 생성되며 여기로 인증코드가 날라 왔습니다. (SMS 또한 왔습니다.)

      위 과정을 거친 후 테스트 진행 시(lua 스크립트 이용 실행)
      제 이름으로 된 채팅방에서만 메시지가 전달되고, 스크립트 상에서는 어떤 채팅방이든 메시지를 보낼 수 있었습니다.

      문의의 핵심은 저 말고 다른 사람이 telegram-cli쪽으로 메시지(명령)를 보낼 수 있는가 입니다.
      제 이름으로 된 채팅방은 누구를 초대할 수도 없고 저만 사용할 수 있는것으로 확인되고 있습니다.

    • BlogIcon Acidpop acidpop 2015.11.24 18:58 신고

      Telegram CLI 는 휴대폰 번호 기반에 ID검색도 허용이 됩니다.

      다른 사람이 카스님이 인증한 휴대폰 번호를 연락처에 가지고 있고 Telegram 에 가입 하였다면 Telegram 친구 목록에 추가 됩니다.
      추가된 Telegram 계정에 메시지를 보내면 사용 할 수 있습니다.

      저 같은 경우도 Telegram BOT 계정을 따로 있고
      BOT 계정 외에 3명 정도가 BOT에게 메시지를 보내서 사용하고 있습니다.

      혹시 lua script 중에 basicbot.lua 파일의 최상에 보시면
      auth_phone 라는 변수가 있고 휴대폰 번호를 적는 부분이 있습니다.
      이 부분에 폰 번호를 안 쓰신건 아닌지요?
      bot lua 스크립트는 모든 사람이 BOT 에 메시지를 보내서 처리하지 못하도록 폰 번호를 가지고 걸러 내도록 프로그래밍 되어 있습니다.

    • 카스 2015.11.25 17:40

      오옷~ 감사합니다~

      단순히 다른사람이 저에게 메시지를 보내면 되는 거였네요.
      이걸 몰라 헤매다니.. 많은 도움 되었습니다.

  3. urxtion 2016.01.18 20:59

    텔레그램 cli를 통해서 위와같은 사전기능과 같이 파싱기술을 사용한 여러가지 기능들을 구현하고자하는데
    위와같은 사전기능은 어떤방식으로 만들어진건가요 curl을 이용한것인가요?..
    팁을주실수있으신지 ㅠㅠ! 부탁드립니다

    • BlogIcon Acidpop acidpop 2016.01.19 00:29 신고

      사전 기능은 내부적으로 상당히 오래된 구식 사전 DB를 가지고 select 쿼리 해서 나온 결과를 보내주는 기능입니다.
      웹에서 가져오는건 아니에요

  4. BlogIcon Dmasters 2016.05.19 12:11 신고

    좋은 글 정말 감사합니다 ^^ 너무나 유용한 정보이네요.
    저도 지금 비슷한 기능을 만들려고 할려고 하는데요... 저 같은 경우에는 라즈베리파이의 GPIO 핀에서 어떤 값을 받으면은 자동으로 특정 단어를 텔레그램으로 메시지를 보내는 기능을 만들려고 합니다...
    그런데 acidpop 님의 글 끝에 보니 " 자신의 XE 게시판에 글이 등록되면 알림을 보내는 기능" 라고 말씀하셨던 부분이 아무래도 제 기능과 좀 유사한 부분이 있지 않을까 싶은데요... 그래서 제가 이쪽 부분으로는 전혀 무지하다보니... 혹시나 조언을 들을 수 있을까 싶어 이렇게 글을 쓰게 됐습니다.

    저 같은 경우에는 아두이노에서 1개의 핀이랑 라즈베리파이 1개 GPIO핀이랑 연결을 해서 아두이노 핀에서 라즈베리파이로 신호를 보내면은 라즈베리파이에서 자동적으로 특정 텔레그램 사용자에게 메시지를 보낼려고 합니다.

    그런데 5부 까지의 글들을 쭉 읽어보면서 이해가 안되는 부분이 많아서 그런지... 제가 이해한 내용 중에는 일단 라즈베리파이 터미널로 텔레그램 관련 설치 다 끝내고 특정 명령어(msg 홍길동 ~~)를 입력하면은 대상에게 메시지를 보낼 수 있는 기능은 분명 되는것 같은데 !...
    이게 저희가 직접 명령어를 매일 입력하지 않고, 아두이노 핀에서 라즈베리파이 핀으로 신호가 오면은 바로 터미널창에 특정 명령어를 자동으로 입력해서 텔래그램 메시지를 보내고 싶은데.. 이게 가능할까요 ? 혹시 뭐... 파이썬을 다뤄야만 가능한가요 ?...

    • BlogIcon Acidpop acidpop 2016.05.19 16:22 신고

      안녕하세요.

      충분히 가능합니다.

      만드신 프로그램이 어떤 언어로 만들어진지는 잘 모르겠지만
      C/C++ 이라면
      system 함수를 이용해서 하시면 됩니다.

      Telegram CLI 보다는 Telegram BOT 을 이용하시는게 더 편할것 같습니다.

      사용 방법은 다음과 같습니다.

      vi 등의 편집기로 tgbot.sh 파일을 생성합니다.

      ---------------------------------
      #!/bin/sh

      argc=$#

      if [ 0 -eq $# ]
      then
      exit 0
      fi

      TEXT=$2
      CHAT_ID=$1


      TOKEN="12345:ABCDEFG-TOKEN_TOKEN"

      curl -k -d "chat_id=$CHAT_ID" --data-urlencode "text=$TEXT" https://api.telegram.org/bot$TOKEN/sendMessage

      echo "send message : $TEXT"
      --------------------------------------------
      위 내용을 입력 하시고

      chmod 755 tgbot.sh

      tgbot.sh '메시지를받을사용자의chat_id' '메시지내용'

      이런식으로 사용이 가능합니다.

      C/C++ 에서는
      system("tgbot.sh \"메시지를받을사용자의chat_id\" \"메시지내용\"";);

      이렇게 사용하셔도 되고

      system 함수 안에

      "curl -k -d \"chat_id=12345\" --data-urlencode \"text=메시지내용\" https://api.telegram.org/bot$TOKEN/sendMessage"

      위 내용을 chat_id 와 text 내용을 바꿔서 그대로 실행 시켜도 됩니다.


      만약 Telegram CLI 를 사용하시고자 한다면

      telegram-cli -e "msg 홍길동 메시지"

      이 명령으로 사용이 가능합니다.

    • BlogIcon Dmasters 2016.05.20 23:03 신고

      오우... 정말 친절하게 자세히 알려주셔서 감사합니다 !
      최대한 빠른 시일 안에 한 번 테스트해봐야겠네요 !
      그런데 혹시 죄송합니다만... GPIO핀 텔레그램BOT 연계하는 부분이 어떤 부분인지 잘 모르겠는데 혹시 알려주실수 있으신가요 ?
      제가 잘 몰라서 그런지 GPIO핀을 입력 받아서 텔레그램BOT과 연계해서 명령어를 전달하는 부분이 어느 부분인지 잘 모르겠네요 ...
      에고 괜히 귀찮게 해드리는것 같아 죄송합니다 ㅠ_ㅠ...

    • BlogIcon Acidpop acidpop 2016.05.23 09:02 신고

      답변이 늦었습니다.

      GPIO 를 제어 하는 프로그램을 직접 만드신게 아닌가요?

      해당 소스에서 GPIO 를 입력 받은 후의 코드에

      c/c++ 이라면 system함수를 이용하셔서 위에 설명 드린 명령을
      그대로 문자열로 입력 하시면 작동 합니다.

    • BlogIcon Dmasters 2016.05.28 13:35 신고

      답변 감사합니다 ^^
      오늘에서야 시험삼아 텔레그램 봇을 만들어서 간단한 명령을 파이썬으로 테스트는 해보았습니다.
      그런데 이번에는 텔레그램 CLI 를 설치해서 할려고 하는데,

      bin/telegram-cli -k server.pub

      명령어를 입력하면은 아래와 같이 에러가 납니다.

      Telegram-cli version 1.4.1, Copyright (C) 2013-2015 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.
      Telegram-cli uses libtgl version 2.1.0
      Telegram-cli includes software developed by the OpenSSL Project
      for use in the OpenSSL Toolkit. (http://www.openssl.org/)
      I: config dir=[/home/pi/.telegram-cli]
      > telegram-cli: tgl/mtproto-utils.c:101: BN2ull: Assertion `0' failed.
      SIGNAL received


      마지막 > 부분에서는 정상적이라면 폰넘버를 요구해야하는데 말이죠... 그래서 혹시나 설치하는 중간에 꼬였나 싶어서

      sudo apt-get remove libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev make git-core python2.7-dev libjansson-dev sqlite3

      sudo rm -r tg

      로 삭제를 해보고 다시 순서대로 설치해봤는데도 같은 에러가 뜨네요...
      현재 라즈베리파이3 를 사용하고 있는데 음...
      혹시 어떤 원인인지 알 수 있을까요?
      그리고 cli 관련 설치했던걸 완벽히 지우는게 위 명령어로 지우면 되는건가요 ?

  5. BlogIcon Dmasters 2016.05.28 14:38 신고

    찾아보니 텔레그램 cli 가 1.2 에서 1.4.1 로 업그레이드 되면서 아무래도 저와 같은 동일 증상을 겪는 사람들이 꽤 있는걸로 보입니다...
    https://github.com/vysheng/tg/issues/925
    해당 사이트에서 댓글을 보면은..

    same error for me .. I had to comment line 101 of tgl/mtproto-utils.c and re-run make to make it work!

    라고 적혀 있는데... 어떤 분이 해결을 하시고 다른 분들도 같은 방법으로 해결했다는 것 같은데
    어떻게 하란 것인지 잘 이해가 가질 않네요.. ㅠㅠ

    //

    꼭 이렇게 질문글을 남기고 나면은 이상하게 해결하게 되네요 ...
    해결방안은 아래 사이트에서 찾았습니다..
    https://github.com/vysheng/tg/issues/1070

    텔레그램 1.4 cli 부터는 tg/tgl 경로에 있는 mtproto-utils.c ㅏ파일에서
    assert (0); // As long as~~~~
    이 부분에서
    // assert(0); // As long as ~~~
    로 바꿔줘야하네요 총 이 문구가 2개가 있는데 다 바꾸고 나니 정상적으로 폰 넘버를 요구하네요

    그런데 또 폰 넘버가 현재 사용하고 있는 번호로 하면 없는 번호라고 해서... NextPlus로 가상 번호로 얻어서 해도 안되더라구요...
    처음엔 등록하겠냐는 문구가 나오고 code 입력 나왔는데 문자가 전혀 안오더니만 다시 폰 넘버 써서 하니 가상 번호는 안되요 ! 라고 하면서 안되서... 만지작만지작 하다가....
    NextPlus 설정에서 휴대폰 번호 추가하기 해서 제 실제 번호를 추가하고 다시 cli 에서 폰넘버 제 실제 번호 넣으니 정상적으로 되고 code 도 정상적으로 와서 cli 등록하고 실행 정상적으로 되네요

    • BlogIcon Acidpop acidpop 2016.05.30 09:40 신고

      좋은 정보 감사합니다. ^^

      Telegram CLI 를 요즘은 안쓰고 있다보니 버전이 1.4.1 까지 올라간지 모르고 있었네요..

      NextPlus 가상 번호는 최근에는 막힌거 같더라구요

  6. Chobong 2016.11.13 20:36

    저 텔레그램을 재설치한 이후, 계속 Telegram-cli version 1.4.1, Copyright (C) 2013-2015 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.
    Telegram-cli uses libtgl version 2.1.0
    Telegram-cli includes software developed by the OpenSSL Project
    for use in the OpenSSL Toolkit. (http://www.openssl.org/)
    I: config dir=[/home/pi/.telegram-cli]
    > [warn] Epoll ADD(4) on fd 6 failed. Old events were 0; read change was 0 (none); write change was 1 (add): Bad file descriptor
    라고 계속 에러가 뜨네요 혹시 해결법 알고 계신 분 있나요?

    • BlogIcon Acidpop acidpop 2016.11.14 09:47 신고

      /home/pi 아래에
      .telegram-cli 디렉토리를

      rm -rf ./.telegram-cli 명령으로
      삭제 하시고 다시 실행 해 보시면

      인증 과정을 다시 물어 보게 될겁니다.

      .telegram-cli 디렉토리 안에 인증 파일들이 깨진것 같아요.

    • Chobong 2016.11.17 16:43

      감사합니다. 덕분에 시원하게 문제가 해결됐네요

    • BlogIcon Acidpop acidpop 2016.11.17 19:41 신고

      해결이 되셨다니 다행입니다. ^^

    • Chobong 2016.11.20 20:19

      한 가지 더 질문이 있어요!!
      Telegram-cli version 1.4.1, Copyright (C) 2013-2015 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.
      Telegram-cli uses libtgl version 2.1.0
      Telegram-cli includes software developed by the OpenSSL Project
      for use in the OpenSSL Toolkit. (http://www.openssl.org/)
      I: config dir=[/home/pi/.telegram-cli]
      > telegram-cli: tgl/mtproto-utils.c:101: BN2ull: Assertion `0' failed.
      SIGNAL received

      라고 에러가 뜨는데요, 이 에러는 위의 댓글에 해결방법이 나와있어, mtproto-utils.c 의 2줄을 주석처리 했음에도 이와 같이 에러가 뜨네요. 혹시 위의 에러를 해결하기 위해 주석처리하는 방법 외에도 추가적인 방법 알고 계신 분 있나요?

    • BlogIcon Acidpop acidpop 2016.11.21 09:22 신고

      요즘 Telegram CLI 의 소스에 문제가 많은건지..

      잦은 오류가 있나보네요.

      일단 에러 메시지데로

      mtproto-utils.c 파일의 101번째 라인

      assert (0);

      이 코드를 주석 처리 해주시고
      다시 컴파일 해서 사용해 보세요

    • seohyeon 2016.11.24 10:01

      조금 늦은 감이 있지만 해결방법을 못 찾으셨을때는 주석처리 하신 뒤에 ~/tg에서 make 명령어를 한번 더 써주시는 것을 권잡합니다.

    • Chobong 2016.11.27 21:04

      드디어 해결되었네요. 주석처리한 다음 다시 한번 컴파일을 할 생각을 못했네요.. 위의 두분 모두 해결법을 알려주셔서 정말 감사해요.

  7. KD 2016.12.07 21:51

    안녕하세요. 블로그를 보고 라즈베리 파이로 텔레그램 봇을 만드는 중인데요. 제가 보낸 메시지를 받아서 그 내용을 코드 안쪽에서 변수에 저장하려면 어떻게 해야하나요? 저는 지금 pyTelegramBotAPI을 써서 제어하고 있습니다.

    • BlogIcon Acidpop acidpop 2016.12.08 10:10 신고

      안녕하세요

      pyTelegramBotApi 를 사용해보지는 않았지만 해당 github 를 보니 아래와 같이 Message Handler 를 사용하더군요.

      @bot.message_handler(commands=['start', 'help'])
      def handle_start_help(message):
      pass


      위 내용은 /start 또는 /help 를 보냈을때 아래 함수가 작동 하는 구조인데

      변수를 하나 선언 하고 그냥 대입 시키면 되는게 아닌가요?

      @bot.message_handler(commands=['start', 'help'])
      def handle_start_help(message):
      saveMessage = message.text

      이렇게 하면 saveMessage 라는 변수에 저장 될것 같은데요

    • KD 2016.12.08 21:33

      오, 해보니까 되네요! 이걸로 며칠동안 고민했는데요 ㅋㅋㅋ

      정말 감사합니다!!

  8. BlogIcon xoskd 2017.03.24 00:02 신고

    작성자분께서 하신 동네예보조회를 만들어보고싶은대 이 블로거에있는 5단계 까지 다했습니다
    그담에 어떻게 해야되는지 알려주실수 있으신가여?

    • BlogIcon Acidpop acidpop 2017.03.24 09:07 신고

      안녕하세요

      날씨 예보 조회는 단순히 기상청 웹사이트의 동네 예보 조회 기능의 RSS 를 가져와서
      각 값에 맞게 설명만 붙여주는 형태 입니다.

      https://github.com/acidpop/bot

      여기 소스에서 webapi.lua 파일은 각 동네의 동네 코드를 db 조회 하는 기능을 담담하고

      shell/getwether.sh 는

      http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=동네코드값

      위 url 을 가져 와서 그냥 파싱 하는 역할을 합니다.

      각 소스들을 분석해 보시면 되고
      동네 코드는 tgbot.db 파일이 sqlite 로 만들어진 파일입니다.
      db 파일 안에 동네 이름과 동네 코드가 매치 되어 있으니 사용해 보시면 됩니다.

+ Recent posts