Telegram Bot개발의 단상

View this thread on: d.buzz | hive.blog | peakd.com | ecency.com
·@jeaimetu·
0.000 HBD
Telegram Bot개발의 단상
![image.png](https://gateway.ipfs.io/ipfs/QmbNsVPL8Fc33jh6j4LAm12YaNq1dXZWy1qhEXy4wqPwW4)

**BUSY.ORG에서 작성했는데..tag가 깨지는 버그가 있는 것 같습니다.**

최근에 개발하면서 얻은 know how와 고생한 것들에 대한 기록입니다. 별도 telegram을 통한 bot제작과 github 소스 공개를 하겠지만, 거기에 적기에는 조금 성격이 다른 것 같아서 별도로 글을 남기고자 합니다.<BR>

1. Telegram bot개발
Telegram bot은 생각보다 처음에는 쉬웠습니다. 카카오톡의 플러스친구처럼 별도의 web page가 필요하지도 않고, telegram에 @BotFather라는 분에게 bot의 생성을 요청하면 되니까요..<BR>
문제는 flow제어 인데요...이게 생각보다 쉽지 않았습니다. 단순한 echo bot이면 쉽겠지만, 질의 응답을 하는 형태의 Bot은 다소 난이도가 있었습니다.<BR>
우선 telegram bot은 message가 trigger event입니다. 그 이외에도 사용자가 입력하는 action, command등이 trigger event가 됩니다. 더욱이 여기서 중요한 것은 이 event가 telegram server queue에 남아 있는 다는 것입니다. 즉 bot client가 이를 처리하지 않으면 계속해서 쌓이는 형태가 되는 것이죠. 따라서 bot client에서 pending이 발생하면 이 bot에 붙어 있는 사용자들 전체에 delay가 propagation됩니다.<BR><BR>

2. Node.js와 python의 사용 with Heroku
Node.js를 주로 사용해서 bot client의 개발을 진행했습니다. 그런데 문제는 꼭 필요한 API인데, 그냥 구현하기는 어렵고 NPM을 찾아보아도 없는 library가 있었는데...다행스럽게도 python에 있더라구요.<BR>최근에 CNN으로 image blur처리를 한 적이 있어서 python은 익숙한 편이라 python을 쓰면 되겠지 했는데 난관에 봉착합니다.<BR>
heroku에서 일단 node.js로 setting을 했는데...python은 어떻게 써야 하지?<BR>
다행스럽게도...shell 형태로 python과 연동하는 node.js library를 찾았습니다. 일단 이걸 package.json에 넣고, python파일을 만들고 실행을 하니....실행이 안됩니다. 서버가 먹통이 되었습니다. 오호...무슨일이..<BR>
그래서 예전의 commit으로 모두 되돌리고 다시 시험을 하니....역시 안됩니다.<BR>너무 간단한 거였는데 한참 헤멨습니다. 결론은..<BR>
node.js로 짠 프로그램은 npm start와 같이 시작을 해야 합니다. 그리고 start에 대한 세부 내용은 package.json에 저장이 되죠. Heroku에서는 node.js로만 된 환경에서는 자동으로 npm start를 해주는데, 제가 python 환경을 install하는 순간 무얼 실행해야 할지 모르니 먹통이 된 것입니다. 즉 아무도 제 node.js code를 실행시켜 주지 않은거죠.<BR>
그래서 이건, heroku에서 지원하는 Procfile을 새로 생성하여 해결했습니다. Procfile은 web또는 worker의 시작 명령어를 dyno와 연결하는 것이라고 보시면 됩니다.<BR>
<BR>
3. Heroku에서 library의 install
node.js의 경우 package.json에 dependency를 지정하면, 해당 library를 자동으로 설치해 줍니다. 그러면 python은? 분명 유사 기능이 있을 것 같아서 검색을 해보니..있습니다. requirements.txt를 새로 생성해서 편집해 주면 됩니다.<BR><BR>

4. node.js와 python의 연동 2
python에서 print문으로 찍으면, node.js에서 return result가 array로 생성됩니다. 즉 python에서 standard output으로 출력한 모든 것을 알 수 있단 이야기 입니다. 생각보다 쉽죠?<BR><BR>

5. Telegram bot 2
message event는 다른 event를 override합니다. 즉 다른 event를 아무리 만들어도 message event catcher가 제일 앞에 있으면 다른 것들이 무용지물이 됩니다.<BR>
사용자의 action에 따라서 message 또는 callbackequery와 같이 접근할수 있는 자료 구조가 달라집니다. <BR>
Telegram의 username, 즉 카톡의 별명?과 같은 것은 optional입니다. 처음에 이게 항상 모두 주어지는 고유한 값인 줄 알고, DB에서 key처리를 했다가 DB가 꼬이는 초유의 불상사가 발생했습니다.<BR>
Telegram에서 chat별로 session정보를 저장할수 있습니다. 이 기능이 매우 유용한데요, 사용자별로 서로 다른 입력을 받아서 이 정보를 개별로 저장해야 할 때 session을 쓰시면 됩니다.<BR><BR>

6. node.js의 자잘한 처리..
이거 너무도 당연한 건데, 너무도 당연히 생각한 어이 없는 실수에 대한 내용입니다. 보통 string으로 된 숫자를 정수로 바꿀때 parseInt(x, 10) 이렇게 사용을 하는데요..<BR>
1,000,000을 이렇게 하니 아무리 해도 1밖에 안나오더라구요. 그래서 뭐가 잘못되었나 보니...<BR>
중간에 ","가 있으면 안되는 것이었죠. 크.너무 당연한 건데요..<BR>
JAVA에는 numberformat으로 처리해주는 library가 있는데 node.js에서는 따로 찾지는 못했습니다. 그냥 간단히 regex를 써서 /,/g 이렇게 ,를 제거해 주면 됩니다.<BR>
역시나 소수점 이하는 처리가 안되니..만약 1,000,000.111 이렇게 있다면 .111 이하를 모두 제거하거나..(split으로) 그게 아니라면 111을 정수로 변환해서 자리수만큼 나누어서 더하면 됩니다.<BR><BR>

7. Bitshare
Decentralized 거래 사이트 입니다. 관련해서 BTS 라는 coin도 있구요..근데 여기 설명이 정말 짠합니다. 아무런 개발에 도움이 되지 않는 설명들이..게다가 이걸 쓰려면 마치 개인 서버를 구축해야 하는 것 처럼..<BR>
사실 그럴 필요는 없습니다. 공개된 open server가 몇개 있어서 그것을 사용하면 됩니다. Steem과 사용이 거의 유사한데요, steem보다 많이 불친절한 정도라고 보시면 될 것 같습니다. 그리고 가능하면 Bitshare는 node.js보다는 python library가 잘되어 있으니 이것을 사용하는 것이 좋아 보입니다. <BR><BR>

8. Telegram bot 3
Telegram관련해서 몇몇 bot의 소스가 open되어 있고, 여기에서 친절하게도 여러가지 template을 제공합니다. setup wizard형태로 있고 여러가지 UI들이 있습니다. 여기에서 UI는 참고할만 하지만 정확한 flow control이 어렵다면 template으로 제공되는 flow control은 사용을 안하시는 편이 정신건강에 이로울 수 있습니다.<BR>그리고 UI가 굉장히 rich합니다. 써보시면 얼마나 powerful한지 쉽게 느끼실 것 같습니다.<BR><BR>

9. Producer & Consumer 구조
전에 tarot bot을 개발하면서, 궁극적으로 나아가야 할 구조라고 생각을 했는데요, 이번에는 그렇게 구현을 했습니다 mongo cloud db를 쓰고, 이 DB에 telegram bot client와 service client가 producer와 consumer로 연동하는 구조입니다.<BR><BR>

10. Map & Reduce
DB를 쓰게 되면 필연적으로 사용해야 하는 pattern인데..어렵습니다. Interface의 문제일수도 있는데요, MongoDB에서 이를 잘 쓰는 것은 참 어려운 일이었습니다.<BR><BR>

11. Callback, Async & Promise
Callback지옥이 node.js에는 도사리고 있습니다. 이를 잘 피해 나가셔야 합니다. 특히 db나 사용한 socket을 close하는 경우, callback이 올라올때까지 이를 유지해야 하므로, 어느 시점에 db를 close할 것인지를 잘 결정해야 합니다. 그렇지 않으면 정말 이상한 error에 직면하게 됩니다. 친절하게 callback이 올라왔는데 db가 close되어 사용 불가하다는 이런 친절한 메시지가 나오지 않습니다.

👍 , , , , , , , , , , , , , , , , , , ,