[NodeJS] 간단한 텔레그램 봇 만들기
안녕하세요 ayogom 입니다.
주말에는 Nodejs에 대한 글을 쓸 생각이없었다가 부랴부랴 한가지 이야기를 좀 해보고 싶어서 텔레그램 봇을 만드는 방법에 대해서 써 보려고 합니다.
텔레그램은 보안 및 개발에 활용하기 좋기 때문에 블럭체인 관련 프로젝트들이 많이 활용하고 있는 카카오톡과 유사한 채팅 프로그램입니다.
텔레그램에서 가서 BotFather
를 찾은 후 /netbot
을 등록합니다.
저는 ayogom_test_bot
으로 하나 만들었습니다.
저기서 HTTP API를 복사해서
해줍니다. 그리고 조금 전에 만들었던 텔레그램 봇에 hello~
하고 인사를 해봅시다.
그리고 조금전에 만들었던 웹페이지를 새로고침 해보면 마지막 메시지에 대한 기록을 볼 수 있습니다.
그럼 본격적인 코딩에 들어가보겠습니다.
일단 텔레그램 봇 라이브러리를 설치 해야 합니다.
npm install node-telegram-bot-api
그리고 샘플 소스를 하나 가져오겠습니다.
const TelegramBot = require('node-telegram-bot-api')
const token = '봇파더에게 받은 토큰입력'
// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true});
// Matches "/echo [whatever]"
bot.onText(/\/echo (.+)/, (msg, match) => {
// 'msg' is the received Message from Telegram
// 'match' is the result of executing the regexp above on the text content
// of the message
const chatId = msg.chat.id;
const resp = match[1]; // the captured "whatever"
// send back the matched "whatever" to the chat
bot.sendMessage(chatId, resp);
});
// Listen for any kind of message. There are different kinds of
// messages.
bot.on('message', (msg) => {
const chatId = msg.chat.id;
// send a message to the chat acknowledging receipt of their message
bot.sendMessage(chatId, 'Hi! Have a nice day!');
});
해당 코드는 메시지가 들어왔을 때
Hi! Have a nice day!
라고 답변을 해줍니다.
그리고 /echo
후 메시지를 입력하면 아래와 같이 동작합니다.
내가 쓴 메시지를 바로 받아서 응답 해주죠.
소스코드를 잠시 살펴보면 const resp = match[1];
해당 부분에서 받은 메시지를 저장할 수 있습니다. 그래서 앵무새 처럼 대답을 할 수 있게 되는 것이죠.
텔레그램 자체는 매우 안정할 것입니다.
하지만 그 안에 봇들에게 접근하는 것 역시도 안전해야 합니다. 아무리 튼튼한 금고라도 내가 비밀번호를 다른 사람에게 알려준다면 그것은 더이상 안전하지 않습니다.
사실 이 글을 쓰게 된 배경은 어제 저녁에 아래와 같은 글을 읽었습니다.
스팀잇 오토보팅(auto voting) 서비스 사용 설명서 해당 내용을 살펴보면
포스팅키를 봇에 등록하는 형태를 가지고 있습니다. 하지만 앞서 설명을 드린것 처럼 텔레그램에 내가 입력하는 메시지는 모두 저장이 가능합니다. 즉 봇을 운영하시는 분은 그 해당 데이터를 확인 할 수 있다는 것 입니다.
물론 @joviansummer 님이 그것을 저장하고 있다는 이야기는 아닙니다. 정말 저장을 하고 있는지 아닌지 저는 알 수 없기 때문입니다. 하지만 그 가능성은 있지 않을까? 위험하지 않을까 생각을 해봅니다.
차라히 이렇게 포스팅키를 입력받는 형태가 아니라 steemlogin 을 통한 포스팅키를 위임 받는 형태로 만드시면 사용하는 입장에서도 더욱 안전하게 사용할 수 있지 않을까 싶습니다.
작성 예정인 글 List
- Nodejs 를 이용한 스팀 API 사용해보기 (계속)
누군가에게는 도움이 될 수 있는 글
스팀잇 기본 이야기
- 복잡한 키&패스워드는 그만 손쉬운 로그인 키체인의 사용법
- 계정 옆의 숫자 평판? "reputation" 이란
- 스팀잇 내부 거래 사이트, 마켓
- 오랜만에 스팀잇에 돌아왔더니 로그인이 안됩니다 (Logging in with non-posting key)
- 스팀잇에 기존 사용하던 트론 지갑을 연결하는 방법
- 스팀 체인의 패스워드 / 키의 역활
- Steemit의 태그 사용법과 커뮤니티스 사용법
- Steemit 프로필 변경 방법
- 스팀파워 임대가 안된다 왜?
- 스팀잇 계정 만들기
- 스팀잇 저장 보상의 종류와 뭐가 좋을지
- 스팀잇 속닥속닥 비밀 메모 사용하기!
- 스팀/스달 입금, 출금 그리고 업비트 이용방법
- 갑자기 steemit 사이트가 접속이 안된다면?
- 스팀잇 내에 붉은 글씨 사용법
- 스팀잇 지갑에 접속이 되지 않을 때
- 스팀잇 글 작성 문법 [마크다운편]
- 스팀잇 글 작성 문법 [HTML]
- 스팀잇 가독성 및 작성을 편하게 해주는 "Steemit.com Enhancer" 툴
니트로스 (SCT, ZZAN 등 ) 이야기
- Steem체인의 또하나의 커뮤니티 "zzan"
- Steem체인의 또하나의 커뮤니티 "sct"
- [요청] 스팀엔진 Explorer 가 접속이 되지 않아요
- [요청] 스팀엔진 사용방법
- SCT 포스팅피 납부 확인 및 납부 방법
- 니트로스(SCT, ZZAN, AAA) 에 대한 설정 확인해보기
스팀잇 심화 이야기
- 스팀의 인플레이션에 대해서
- 하루에 스팀 리워드 풀에 포함되는 스팀은 얼마나 될까?
- 하루에 도대체 어느정도의 스팀은 생성될까요?
- 내가 보팅 했더니 보상이 떨어졌다? 왜?
- 스팀달러가 1달러를 유지하는 방법
- 글이 써지지 않아요 왜? Resource Credits!? Your transaction failed to process
- 스팀잇 에서의 $ 는 USD(미국달러) 인가요?
- 스팀은 DPOS 기반의 블록체인입니다. 그럼 DPOS가 뭔가요?
- 증인에 역활은 무엇일까
- 스팀 증인 노드 세팅하기 1탄
- 스팀 증인 노드 세팅하기 2탄
- Steem Node 정리 (Full node 1편)
- Steem Node 정리 (Full node 2편) -설치
- 증인 노드 feed price 업데이트 방법
스팀잇 보상과 연결되는 이야기
해킹과 관련된 이야기
개발과 관련된 이야기
- Nodejs 가 무엇인지 그리고 어떻게 설치 하는지?
- [NodeJS] API 사용 법 1편 스팀 라이브러리 설치
- [NodeJS] API 사용 법 2편 보팅을 해볼까?
- [NodeJS] API 사용 법 3편 포스팅을 해볼테다!
- [NodeJS] API 사용 법 4편 예약 포스팅 해보기
- [NodeJS] API 사용 법 5편 예약 포스팅 해보기 -2편 (포스팅 수정)
- [NodeJS] API 사용 법 6편 예약 포스팅 해보기 -3편 (매일매일 글쓰기)
- [NodeJS] API 사용 법 7편 스팀 블럭 모니터링 하기
- [NodeJS] API 사용 법 8편 스팀 블럭 모니터링 하기 2편
- [NodeJS] API 사용 법 9편 Nodejs가 가지는 불편함 (콜백지옥)
- [NodeJS] API 사용 법 10편 간단한 보팅 봇 만들기
@crisch23님이 당신을 멘션하였습니다.
https://www.steemit.com/@crisch23/guia-para-principiantes-or-or-como-votar-por-los-testigos-y-por-que-es-importante-or-or-por-crisch23
steemlogin을 100% 신뢰할 수 있는 근거나 이유가 어떤것이 있는지는 제가 잘 모르겠습니다만, 사실 깃허브에 소스가 공개되어 있다고 해도 그들이 운영하는 서버 사이드 코드가 해당 소스와 동일한지 확인할 수도 없고 그냥 믿는 수밖에 없죠. steemlogin에 문제가 있다는 뜻이 아니라, 어떤 종류의 서비스가 되었던지간에 사용자가 프라이빗 키를 입력해서 보내는 행위가 있으면 반드시 신뢰성에 대한 문제가 따라올 수밖에 없습니다.
제가 만든 오토보팅에 대해서 말씀드리자면, 텔레그램을 통해 등록하는 포스팅키는 파이썬 딕셔너리 형태로 서버 메모리에 올라가 있습니다. 서버 메모리를 덤프해서 열심히 찾아보면 나오긴 하겠지만, 제가 굳이 그렇게 할 필요도 이유도 없고 포스팅키로 하는 모든 활동이 블럭체인에 남기 때문에, 텔레그램 메신저 자체의 보안에 문제가 없다면 현재 상태가 큰 문제는 없다고 보고 있습니다.
하지만 어떤 이유던지 신뢰가 가지 않는다면 프라이빗 키는 절대로 위임하지 않는 것이 정답입니다. 의견 개진에 감사드리며, 편안한 주말 보내시기 바랍니다.
권한 위임은 스팀 api에서 제공하는 블럭체인 공식 api 입니다. steemlogin 은 그것을 손쉽게 ui를 제공하고 있고요(사실 이게 스팀커넥트 시절부터 가장 오래된 서비스다보니 언급을 하게되었습니다) 물론 그 그것도 불안하시다면 keychain 으로 진행 할 수도 있습니다.
스마트 컨트렉트가 없기에 ㅠㅠ
사실 프로그램적으로도 권한 위임 받아서 개발하는 편이 더 편리합니다. 예를들자면 제가 제 포스팅권한을 @joviansummer 님께 위임해드리면 joviansummer 계정의 포스팅키로 포스팅키 액션(보팅 등)이 가능하기 때문 입니다.
제 포스팅이 불편하셨을수도 있지만 프로그램 개선을 위한 개인적인 의견이기 때문에 참고를 부탁드리겠습니다. 편안한 주말 되시기 바랍니다
포스팅 권한을 위임하는 기능이 있는 모양이군요. 몰랐습니다. steem-python documentation을 공부해서 만들었는데 제가 아직 파악하지 못한 부분이 많아서 그런 것 같습니다.
포스팅 내용에 대해 불편하다고 생각한 적은 없으며, 저도 단지 제가 아는 한도내에서 의견을 말씀드린 것이고 이렇게 의견을 주고 받으면서 배우는 과정이라고 생각하고 있습니다. 감사합니다.
@ayogom transfered 10 KRWP to @krwp.burn. voting percent : 8.36%, voting power : 60.45%, steem power : 1782514.98, STU KRW : 1200.
@ayogom staking status : 800 KRWP
@ayogom limit for KRWP voting service : 1.6 KRWP (rate : 0.002)
What you sent : 10 KRWP
Refund balance : 8.4 KRWP [54360916 - 185f97b4875a3d479197a1345662d033f2ea14d7]
start success go! go! go!
[US$80.50](▼16%)[SONGJING]SONGJING SJ-125E 제습기 / 송징 SJ-125E 제습기 / 36평적용 / 165W 고출력 / 대용량 물탱크 / 관부가
WWW.QOO10.COM@banguri님이 당신을 멘션하였습니다.
https://www.steemit.com/@banguri/6-6
저는 텔레그램봇은 한번도 개발해본적이 없네요. 그래서 그런지 매우 흥미롭습니다.
예전에 clayop님이 만든 텔레그램봇을 잘 사용했었는데, 오랜만에 다시 찾아보니 서비스가 중단되었네요. ㅠ
혹시 ayogom님 멘션이나 댓글, 관심저자 글 등록 알림도 개발가능한가요?
해보진 않았지만 ㅋㅋ 가능하지 않을까요...
어짜피.. 원리는 다 똑같은거라... 최근에는 굿헬로님이 만든 것을 사용하고 있긴 합니다 ㅎㅎ;