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"

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