nodejs로 텔래그램 봇을 만들어 무료 서버 heroku에 올려보자 - 정신승리봇

in #kr-dev6 years ago

dorothy.kim-05-02-2018-03-04.jpg
@dorothy.kim 님 감사합니다.

이번 기회에 알게된 무료서버 heroku를 설명하려고 하는데 기존에 해놓은 sibba는 설명할게 더 많아져서..

heroku 는 생각보다 다양한 환경을 제공해줍니다.

직접 접근해서 컨트롤하는게 아니라 제공해주는 git 주소로 푸시해서 돌아가게 해주는거에요

겸사겸사 간단한 봇도 만들어서 배포하는걸로 설명드려볼께요.
사용한 것은
nodejs + telegrambot + 무료서버 heroku
입니다. nodejs 랑 텔레그램은 많은분들이 설명하셨으니, heroku 에 집중하셔도 되요.

이번 예제로 만들어볼려고 하는것은 코인도 하락한겸 정신승리 봇을 만들어서 올리는 걸 해봅니다.

먼저 텔래그램 봇을 만들어 둡니다.
nodejs를 세팅합니다.
git을 설치합니다.
이건 많은 분들이 설명하셔서 패스하겠습니다.

기본 nodejs 구조를 를 만듭니다...
설명할려고했는데
https://johngrib.github.io/blog/2017/03/12/telegram-bot/
여기에 기똥차게 되어있어서.. 심지어 heroku까지..

근데 설명이 너무 심플해서 제가 좀 더 살을 붙일꺼구요

그럼 정신승리 봇을 만들어보겠습니다.

정신승리봇이란 ?

스팀 가격을 업비트기준으로 정해진 시간마다 알려주는 봇입니다. 여기에 정신승리를 해야하니깐 끝에 0을 하나 더 붙이겠습니다.

일단 프로젝트를 만듭니다.
한글로 만들수는 없으니.. 일단 영문검색부터..

이름이 기니깐 줄여서 mv , mvbot 으로 시작하죠

일단 폴더만 만들어둡니다.
mvbot

vscode 로 해당 폴더를 연다음
터미널을 열고 npm init을 쳐줍니다


귀찮게 여러가지 물어보는데 엔터쳐주면 됩니다.

package.json 중간에 이걸 추가해줍니다.

```
"dependencies": {
    "express": "^4.16.3",
    "get-json": "0.0.3",
    "node-telegram-bot-api": "^0.30.0",
    "sync-request": "6.0.0"
  }
```
그리고 scripts 에
"start": "node index.js"
도 추가해줍니다.

.gitignore 파일 만드셔서

./node_modules
./vscode
package-lock.json

이거 추가해두세요. heroku에 올릴때 제외시킬겁니다.

추가해놓고 npm install 하면 적어둔 필요한 라이브러리들을 좌르륵 세팅 됩니다. 너무 편해요

설명을 좀더 쓸려고 했는데
https://johngrib.github.io/blog/2017/03/12/telegram-bot/
여기가 너무 잘되어있어서 양심에 찔립니다.

위 사이트를 참고하시고 나머지 파일구조는 bot.js web.js index.js 는 똑같이 해줍니다.

업비트 시세가져오는걸 찾아봅시다
https://steemit.com/kr/@segyepark/api
segyepark 님 감사합니다. 혹시 멘션갈수 있으니 @는 붙이지 않았습니다.

https://crix-api-endpoint.upbit.com/v1/crix/candles/weeks?code=CRIX.UPBIT.KRW-STEEM
스팀원화 가격 주소는 이거네요.
어떤값이 가격인지 봐야하니 결과값을
https://jsonformatter.curiousconcept.com/
요기에서 확인해봅시다.
tradePrice 값 이걸 이용하면 될것 같습니다.

이걸로 버무리면

생각보다 오랜시간 뒤( 아.. 캐마)

const  TelegramBot  =  require('node-telegram-bot-api');
var  http  =  require('http');
var  request  =  require('sync-request');

const  getToken  = (function () {
const  token  =  process.env.TELEGRAM_TOKEN;
return  function () {
return  token;
};
})();

//사용자 id 저장
var  g_idSet  =  new  Set();
//스팀 가격 주소
var  g_upbitSteem  =  "https://crix-api-endpoint.upbit.com/v1/crix/candles/weeks?code=CRIX.UPBIT.KRW-STEEM";
// 정신승리를 위한 뻥튀기
var  g_mentalVictory  =  10;
// 앞에 문구
var  g_pre  =  "우와 스팀가격이 ";
// 뒤에 문구
var  g_after  =  "원 이에요!";

const  bot  =  new  TelegramBot(getToken(), { polling:  true });

bot.onText(/\/start/, (msg, match) => {
    if(g_idSet.has(msg.chat.id) ==  false) {
g_idSet.add(msg.chat.id);
}
});

bot.onText(/\/cancel/, (msg, match) => {
    if(g_idSet.has(msg.chat.id)) {
    g_idSet.delete(msg.chat.id);
}
});

setInterval(function() {
let  res  =  request('GET', g_upbitSteem);
let  steems  =  JSON.parse(res.getBody().toString("utf8"));
steems.map(steem  => {
for(let  id  of  g_idSet) {
bot.sendMessage(id, g_pre  +  steem.tradePrice  *  g_mentalVictory  +  g_after);
}
});
}, process.env.INTERVAL);

..쉽게 보여주기위해서 간단이 작성한 코드입니다. 매우매우 부끄럽습니다. 좀 더 이쁘고 효율적으로 만들고 싶으면 다른분들꺼 참고하세요. 이 코드 처럼 하시면 안됩니다.
그리고 아마 1인용으로만 제대로 동작할꺼에요. 여러명이 쓰시면.. 에러가 나올확률이 높습니다.

process.env.TELEGRAM_TOKEN
process.env.INTERVAL
은 이따가 heroku 사이트에서 정의하는겁니다. 이따 설명할께요

이제 heroku에 올려봅시다.
http://heroku.com/ 가입하세요
https://devcenter.heroku.com/articles/heroku-cli
설치하세요. heroku 에 올리는데 필수입니다.


heroku 에 접속해서 new app 하시고 적당한 이름으로 만듭니다.


요 메뉴에서 settings


눌러서 아까 이상한 값들 세팅합니다

1000 = 1초입니다.
이렇게 하는 이유는 편하게 시간도 바꾸고 싶구요.
git 에 올라가니깐 노출될 위험이 있으니 .. 따로 세팅해두는겁니다.
혹시 스팀잇 봇 만들꺼면 .. 포스팅키까지 지원되는 기능으로 가지고 노세요. heroku가 나쁜마음 먹으면 X되는겁니다.


다시 이메뉴에서 Deploy 메뉴에 들어가서 하라는 대로 하면됩니다.

굳이 설명과 과정을 보여드리겠습니다. .. 친절 친절..

이제 작업한 결과물을 올려서 동작시켜봐야겠죠?

로그인 하시구요 (heroku 이메일 / 비번)

git init
깃 기본 세팅
heroku git:remote -a test-mv
깃 저장소 세팅

git add .
현재 프로젝트 파일을 깃 현재 저장소에 등록하고
$ git commit -am "make it better"
현재 저장소에 저장하고
$ git push heroku master
heroku 서버에 올리고 동시에 프로그램이 시작됩니다.


정상적으로 되면 deploy done!
이제 확인해봅시다

mv-result.gif

잘되네요 ㅎㅎ heroku 에서 10초마다 해놔서 계속 울리니 끕시다. 시간을 바꿀려면 끈다음에 값을 변경하고 다시 키면되요.


오버뷰화면에서 저걸 눌러서

오른쪽에 있는 편집버튼 눌러서 모드를 변경하고

파란색 버튼눌러서 끄거나 키시구요. 빨간색 버튼으로 저장해줍니다.


다시 오버뷰 화면에 들어와서 수정하시면 됩니다.

heroku 가 일정시간동안 요청이 없으면 sleep 상태로 들어간데요 그래서 위에 참조 주소에도 나와있듯이
uptimerobot.com
여길 이용해서 30분 정도에 한번씩 요청시켜주면 계속 살아있습니다.

.. 설명이 부실한듯 보이지만 다들 알아보셨을거라 믿습니다. ㅠㅠ..

참조한 사이트
https://steemit.com/kr/@jys5220/7awbnk
https://johngrib.github.io/blog/2017/03/12/telegram-bot/

작성하고 보니 구글 어디엔가 있을것 같습니다...
그래도 heroku 좋으니까 써보세요! 보다는 그래도 성의를 보이는게 맞을것 같아서 한번 만들어봤네요. 생각보다 간단하게 만들어서 돌려볼수 있다! 라는걸 알려드리고 싶었습니다.
이러한 메뉴얼을 써본지 오래되었는데 .. 정말 힘드네요. 기존에 매뉴얼 만드신분들 정말 존경합니다. 너무 힘들어요...

이런식으로 평소 F5 누르거나 매일 어디 들어가서 정보를 보고 싶으면 이런식으로 만들어서 써먹으시면됩니다. 그 순간부터 당신은 이미 개발자에요.

그리고 혹시 설명이 매우 허접해서... 제가 다룬 내용들에 대해서 궁금하신분들이 계신다면 댓글달아주세요. 아는 한도내에서 답변해드릴께요.


그나저나 ... 완전 나락으로 빠지다가 그래도 조금 회복했네요. 다들 화이팅 합시다!


이런식으로라도 정신승리를 해봅시다.

Sort:  

ㅋㅋㅋ정신승리로봇이 스팀가격이 1,000,000원 이에요! 하길..

ㅋㅋㅋ 그러면 진정한 정신승리를 할 수 있어요! ㅎㅎㅎ

스티밋의발전을 위해서날마다고생많으십니다.

ㅎㅎ 감사합니다. 마이님이 더 고생이시죠

정말 볼때마다 너무대단하세요!!

저도 정리해주신 그림 볼때마다 감탄나옵니다~!

저는 아무리 봐도 무슨말을 하는지 모르겠네요! ㅋㅋ
마지막은 감명 깊었습니다~ 스팀 가격이 20500원이에요~ 가즈아^^

저의 설명부족으로 ㅠㅠ
이럴때일수록 희망을 바라봐야죠 ㅎㅎ 가즈아~!

짱짱맨 호출로 왔습니다!
한주 수고하세요

매번 와주셔서 감사합니다. 힘찬 한주 ㄱㄱ!

에고 아시나요님 블로그 놀러와서 글 읽어보고 있었는데 그와중에 다녀가셨단 알람이 뜨고 있네요! :)
근데 훌륭한 일 하시는 분이신것.....같다는... 생각을 해봅니다! :D

저는 개발쪽 언어에 무지해서 (설명을 못하셔서가 아니라) 이런걸 만드시는 분들을 보면 참으로 대단하다는 생각 밖에는 하지 못하거든요!
(소귀에 경읽기라 당연히 안해주셔도 됩니다 ㅋㅋ)

아무튼 그전까지 생면부지의 저를 도와주시고 댓글도 여러번 달아주시고..
응원해 주셔서 제가 감사해 하고 있다는걸 아시나요..... (죄송;;;)
하시는 일 술술 풀리시길 바라고, 또 놀러오겠습니다.
좋은 밤 되세요!! ^-^//

이런 .. 알람을 지나쳐버려서 너무 늦게 답변을 드린점 죄송합니다. ㅠㅠ..

비록 힘이 미약하지만 피해를 입으신분이 눈에 띄이는데 지나칠수가 없죠 ㅠㅠ..
그래도 이제 완전히 회복하셔서 정망정말 다행입니다. 그 사건 이후로 댓글을 봤을때 정말 기뻣어요!
비록 안좋은일로 인해 만나게되었지만 이것도 인연이니 저도 놀러가겠습니다. ㅎㅎ
지금은 낮이니 행복한 하루 되세요~!
행복을.. 아시나요? ㅎㅎ

아,, 아니에요!
저도 맨날 이렇게 일이 밀리면 스팀잇 못들어오고 있어요 ^^
같이 기뻐해 주셨다니 제가 참 복이 많은가봐요!
행복을... 행복을 느낍니다! ㅎㅎㅎ

대단합니다.^^ 프로그램 하시는 분들은 정말 대단하신 것 같아요~!!
정말 지금 시세에 0 하나만 더 붙으면 원이 없겠습니다.ㅋㅋ

제가 가진 나머지 코인들도 0이 하나만 더붙으면 여한이 없겠네요 ㅠㅠ..

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
저도 우울할때마다 저 mvbot 틀어놓고 싶네요!! ㅋㅋㅋㅋㅋㅋ
아 마지막 짤.... ;ㅁ ;
더도말고 덜도말고 일단 저정도까지만 가즈아!!! ㅋㅋㅋㅋ

ㅋㅋㅋㅋ 오늘 하루종일 켜놨는데 .. ㅠㅡ.. 제 눈이 알아서 필터링 합니다. ㅠㅠ... 그래서 결국... 끔..ㅠㅠ
스팀은 곧 날라갈겁니다. 가즈아~!

오 굿이에요~ 뭔가 꾸준히 나옵뉘다!!
저쪽은 잘 몰라서 그러는데 무료 호스팅 서버
보안 문제는 괜찮은 건가요?

보안쪽은 주의깊게 보지 않아서 모르겠네요 ㅠㅠ..
아마 장난감정도의 용도로만 사용하는게 안심될거 같아요.

Congratulations @asinayo! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of comments received
Award for the number of comments
Award for the number of posts published

Click on any badge to view your own Board of Honor on SteemitBoard.

To support your work, I also upvoted your post!
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

Upvote this notification to help all Steemit users. Learn why here!

Coin Marketplace

STEEM 0.20
TRX 0.12
JST 0.029
BTC 60250.72
ETH 3377.07
USDT 1.00
SBD 2.52