[야매코딩] 누구나 만들어보는 스팀봇! - (4) 스팀 API 심화, 블록체인 & 포스트

in #kr-dev6 years ago (edited)

0. 여기까지 따라온 프린이, 아주 칭찬해요.

이번 글에는 선착순 10명에게 약 $1 업보트 숙제 이벤트가 있어요 :)

코딩 1도 몰라도 일단 따라하면 되는, '누구나' 하는 야매코딩 시리즈입니다.

누구나 만들어보는 스팀봇! 강좌 네번째 편에 오신 것을 환영합니다. 이제 딱 두편만 남았어요 :)

반가워요 프린이(프로그래밍 어린이) 여러분!

혹시 처음 오셨다면, 소개편이 있습니다. 강좌가 새로 올라오면 소개편에 링크가 업데이트 되니, 리스팀/북마크 해두면 편할겁니다 :)

저번 시간에 처음으로 스팀 API를 설치하고 기본적인 활용법까지 배웠죠?

이제 슬슬 어렵게 느껴지는 부분들이 있을겁니다. 처음 코딩해보는 프린이라면, 지금 당장 모든걸 이해하려고 스트레스 받지 마세요. 일단 단계별로 따라오세요.

스팀봇은 이렇게 만들어지는구나,를 경험해보시고 기본기 다지기는 그 이후 차차 해나가면 되요.

이번 편은 스팀과 대화할 수 있는 직통 전화기 스팀 API를 좀 더 깊이 다뤄보는 연습을 해볼게요. 그리고 에러 야매 대처법을 알려드리죠!

프린이 여러분, 귀찮아 하지 말고 함께 따라해봐요 :) 그냥 읽는것 보다 백배 도움될겁니다!

A. 개발 환경설정 따라하기 I - Google Cloud 세팅
B. 개발 환경설정 따라하기 II - Conda 세팅
C. 스팀 API 설치 및 살펴보기 101
D. 스팀 API 심화, 블록체인 & 포스트
E. 예제로 따라하는 스팀봇 뚝딱
F. nohup으로 자동화, 알아서 언제나 24/7

그럼 본격적으로 시작해볼까요?

난이도: 中上
소요시간: 약 30분

이미지 출처 - https://dribbble.com/shots/3974885-Bumblebee by Pat Grivet

1. Conda야, 세팅 부탁해!

자 언제나 그렇듯 VM인스턴스에 접속을 해야겠죠?

이젠 부엌에 입장한다는 표현을 쓰지 않아도 잘 알죠! 역시 참 프린이!

그래도 혹시 모르니 간단히 소개드립니다 :)

  1. 구글 클라우드 콘솔 사이트로 이동하고
  2. Compute Engine 항목을 클릭하여
  3. VM인스턴스의 SSH 버튼을 눌러주면 끝! (꺼뒀다면 켜야겠죠?)

다만 저번 편에서 한 가지 더 추가된거 기억나시죠?

새롭게 검은 화면을 띄우면 저번 시간에 입력줄 맨 앞에 있던 (steembot)이 없어졌음을 확인 할 수 있을겁니다. Conda를 불러서 스팀봇 요리를 위해 미리 준비해둔 세팅을 다시 펼치라고 해야겠죠?

source activate steembot을 입력해주세요.

명령을 받는 줄 맨 앞에 (steembot)이 다시 붙었죠?

자 그럼 복습을 해볼까요? 살짝 다른 방법으로요.

2. 레시피를 만들어봐요.

저번에 딱 3줄로 원하는 계정의 기본 정보를 스팀API를 통해 받아오는 연습을 해봤죠?

from steem import Steem
s = Steem()
s.get_account('프린이계정')

그리고 이걸 저번에 어떻게 입력했었죠?

python3을 입력해서 리눅스 명령어 대신 파이썬을 입력할 수 있는 입력줄을 불러왔었습니다. 그리고 한 줄씩 엔터를 치면서 입력했죠.

그런데 매번 계정 정보를 확인하고 싶을 때마다 그렇게 하려면 귀찮잖아요?

새로운 요리법을 네이버 블로그에서 찾았는데, 어디에 적어두면 매번 그 블로그 찾느라 헤매지 않고 편하게 노트를 참고할 수 있듯 말이죠!

그래서 레시피를 적어서 부엌에 붙여둘까요? 이름은 test라고 똑같이 정하죠.

vim test.py

메모장을 불러오는 명령어가 vim이고 레시피 이름 test 뒤에 .py 확장명을 붙여줘야 컴퓨터가 파이썬 코드가 들어있음을 파악할 수 있어요!

엔터를 눌러 명령을 전달하면, 처음보는 화면으로 휙 넘어갔죠?

아직 아무것도 누르지 마시고, 여기서 잘 따라와주세요.

처음 vim 쓰시는거라면 살짝 헷갈릴 수 있어요.

좌측 하단에 보시면 레시피(파일명)이 보이죠?

이 상태에서 i한 번 눌러주세요. 엔터 누르지 말고요!

그럼 파일명에서 --INSERT--라는 문구로 바뀝니다.

혹시 한국어 타자가 켜있었다면 아래처럼 됩니다ㅎㅎ 당황하지 마시고 바로 한/영 전환해서 i 한 번 클릭하면 되요.

좌측 하단에 --INSERT--가 떠야 레시피를 작성할 수 있게 됩니다. 그 전에는 안 되고요.

그럼 이제 그대로 세 줄을 입력해줄까요? '프린이계정' 대신 꼭** 본인 계정명 써주세요** :)

from steem import Steem
s = Steem()
s.get_account('프린이계정')

자 이제 저장을 하고 본래 화면으로 나가볼겁니다.

먼저** ESC 버튼을 한 번 눌러주세요**. --INSERT--가 사라집니다.

그 다음, :wq를 입력하고 엔터를 눌러주세요.

그럼 본래 화면으로 돌아왔죠?

참고로 w가 저장, 그리고 q가 종료라는 뜻입니다. 많이 써보신 메모장 프로그램이나 워드랑 마찬가지죠.

그럼 레시피가 잘 작성되고 저장됐는지 확인해볼까요?

cat test.py를 입력해주세요. cat 명령어는 vim에 들어가지 않아도 test.py 내용을 볼 수 있게 해줍니다.

음! 프린이 여러분의 첫 레시피가 잘 작성됐네요 :)

그런데 어디에 저장되어 있냐고요?

저번에 conda를 위한 설치파일을 받은 뒤 잘 다운 됐는지 ls 명령어를 썼었죠?

가장 오른쪽에 보면 test.py 파일(레시피)가 보이네요!

이제 언제든 레시피대로 실행시키고 싶으면 python3 test.py를 입력하면 됩니다.

다만 지금은 그렇게 입력해도 무반응일겁니다 :) 프린이라면 어리둥절일텐데, 곧 알려드릴게요. 팔로우미!

저는 개인적으로 테스트를 할 때는 python3로 파이썬을 바로 입력하면서 결과값을 받아보고요, 정리된 코드(레시피)가 있으면 저렇게 저장해둡니다 :)

3. 블록체인 & 포스트, 너는 도대체!?

자 새로운 레시피를 짜볼겁니다.

잘 알다시피 스팀은 블록체인 위에 놓여진 블로그 같은 존재죠.

그렇다면 스팀과 대화를 할 때 블록체인에 어떤 포스트/댓글이 저장됐는지 물어볼 수도 있겠네요?

레시피 이름은 블록체인+포스트 해서 'blockpost'라고 할게요.

vim blockpost.py

그럼 아까처럼 메모장에 들어오게 되죠.

마찬가지로 i를 눌러서 --INSERT--가 보이게 해요.

그리고 다음 2줄을 쳐봐요.

from steem.blockchain import Blockchain
from steem.post import Post

저번에 썼던 from steem import Steem과 사뭇 다르죠?

스팀API와 기본적인 대화를 하기 위해 from steem import Steem로 충분했지만, 이제 블록체인과 포스트에 대한 심도 있는 대화를 나누려면 위와 같은 2줄이 필요합니다.

어떻게 알 수 있냐고요?

저번에 말씀드린 스팀API 문서(공략법)에 나왔있습니다. 다만 프린이가 처음부터 보기에 내용이 벅찰 수 있어서 핵심만 뽑아온겁니다.

하지만 스팀봇 야매코딩 시리즈 끝까지 따라한 뒤에는 꼭 천천히 살펴보세요. 원하는 스팀봇으로 개조할 때 도움이 될겁니다!

그럼 저번처럼 일단 스팀 블록체인을 b 손에 들게 할까요?

b = Blockchain()

그리고 한 줄 더 추가해주세요.

stream = map(Post, b.stream(filter_by=['comment']))

마지막 추가된 줄이 많이 어려워보일겁니다. 실제로 프린이에게 어려운 개념이고요. 궁금하시면 아래 글을 읽어주시고, 아니면 일단 넘어가도 좋습니다, 당분간 마법의 주문으로 남겨둬도 되요.

그래도 알고 싶다면! 수학공식처럼 읽어 나가면 됩니다. 1x2/(3+4x(5-6))이 있으면 가장 안쪽 (5-6) 괄호부터 시작하듯이 말입니다.

  1. 그럼 가장 안쪽 (filterby=['comment'])을 보면 comment를 filterby 한다고 되어 있죠? 댓글들만 필터해서 읽는다는 뜻이네요.
  2. b.stream(filter_by=['comment'])에서 b. 은 저번에 봤던 형식이죠? b = Blockchain() 즉 블록체인을 b에다 저장했는데 이를 b.stream(~~~)으로 이어붙였네요? 다시 말해 스팀 블록체인은 약 3초마다 하나씩 생겨나는데 이를 스트리밍 해서 읽겠다는 뜻입니다. 즉 생길 때마다 댓글만 필터해서 불러온단 말이죠.
  3. 그런데 블록체인에서 불러는 왔지만 아직 프린이가 쉽게 읽을 수 없는 데이터 뭉치입니다. 컴퓨터만 이해하는 데이터죠. 그래서 from steem.post import Post를 이용해 스팀API에게 다시 물어봐야 합니다. 이거 포스트 형식으로 해석해줘! 그럼 스트리밍 될 때마다 일일이 그래야겠죠? 그게 map()의 역할입니다. 그래서 map(Post, b.stream(~~~))가 되죠.
  4. 마지막으로 그 결과가 그냥 허공으로 날라가면 안 되잖아요. 그래서 stream에다가 저장합니다. 최종적으로 stream = map(~~~)가 됩니다. # 그 다음에는 for post in stream: 입력해주세요. 끝에 콜론(:)이 있습니다!

그리고 엔터를 쳐서 다음줄로 넘어가면 어느정도 공간이 띄어져 있죠?

파이썬에서 콜론(:)이 있으면 그 다음 줄은 인덴트(indent) 즉 탭(tab) 하나가 필요해요(아님 띄어쓰기 4번 혹은 2번). 해당 내용 다음 줄들은 그에 속한다는 뜻이죠.

for post in stream: 의미는,

이제 스팀에서 새로운 블록체인이 생길 때마다 댓글만 필터 되어 stream에 저장되고 있는데, 한 둘이 아니겠죠?

for X in Y 뜻(갑자기 영어 문법 수업) 'Y 뭉치에서 하나씩 X라고 이름을 붙여서 다뤄볼게'라는 의미를 갖고 있어요.

마지막으로 다음 줄print(post)라고 입력해주세요.

stream 뭉치에서 하나씩 떼어 post라고 이름을 붙였는데, 이걸 프린이에게 보여질리면 인쇄가 되야 합니다. 그래서 print(post)라고 하죠.

자 이제 레시피를 저장하고 나올까요?

기억하시겠지만, ESC 버튼을 한 번 누르고, :wq을 입력한 뒤 엔터를 눌러주세요 :)

4. 분명 레시피는 완성됐거늘...!

자 레시피를 실행시켜봐야겠죠?

python3 blockpost.py

오오오!! 실시간으로 뭔가 막 나와요!!

그러다가, 덜컥!

에러가 발생하고 자동으로 종료되네요ㅠㅠ

기본적으로 파이썬 스팀API가 갖고 있는 문제 중에 하나인데요, 이를 극복하는 방법은 다음 시간에서 배우겠습니다.

오늘의 수업은 여기까지입니다. 내용이 꽤 많았죠? 싸지방 이용시간이 다 되어서, 갑작스러운 수업종료(...)

그 사이에 한 번 숙제로 레시피 본문을 살짝 수정해보세요.

print(post.export())으로 말이죠.

그리고 다시 한 번 python3 blockpost.py레시피를 실행시켜 어떻게 결과가 바뀌는지 확인해보세요 :)

캡쳐해서 댓글로 올려주시면, '참 잘했어요' 도장과 함께 선착순 10분에게 약 $1 업보트 드리겠습니다 :) 여기까지 따라와주셔서 고마워요 프린이 여러분!

오늘의 스팀API 맛보기 꼭 한 번 따라해보세요!

이제 다음 편(E. 예제로 따라하는 스팀봇 뚝딱)으로 찾아뵙겠습니다. 오늘 만든 레시피에 살을 이어붙이는 작업입니다.

드디어 기본적인 기능을 갖춘 스팀봇이 탄생하게 됩니다!

최대한 쉽게 하려 했는데 생각보다 입문자들에게 어려웠을 내용이었겠네요. 궁금하신 점, 지적하실 점(환영합니다) 혹은 문제가 발생했다! 싶으면 댓글 언제든 남겨주세요. 빠른 답변은 아니겠지만(...) 대답드리겠습니다 :)

이만 상병 크립토였습니다. 필승!

Sort:  

@야매코딩

궁금한거, 어려웠던거, 더 알고 싶은거 있으면 꼭 댓글 남겨주세요! (선착순 10명 이벤트는 과연 몇 분이나 참여하실지... 10명은 될까...?)

흠... 척봐도 10명은 넘은것 같지만 일단 숙제발표 해봅니다!
일단 길이부터가 다르네요!
숙제.png
일단 수정하라고 하셨던 부분은 아마도 파이썬 명령어로 export가 결과값을 따로 끄집어내서 저장한다는것 같구요(명령어로도 유추할수 있겠지만, 결과값이 수정전엔 훨신 간결했는데, 수정하고나선 딕셔너리 형태로 표현되서 아마 이걸 저장하려고 다 끄집어낸게 아닌가 싶습니다.), 수정전과 수정후에도 에러가 뜬 이유는 아마 모듈상의 명령어 문제로 실행이 되질 않은것 같습니다. 제가 유추한게 맞나요?

에러코드를 찬찬히 읽어보니 integer가뭔가해서 찾아봤는데, 소위 int로 쓰던 정수타입의 약자더군요! 아마 현재 저장된 타입값이 없어서 저장된 데이터 타입을 int로 바꿔야 저장될것 같습니다!

  1. 네 맞습니다. export로 결과값을 꺼내어 해당 게시물/댓글의 작성자와 내용을 따로 저장하는 과정이 다음 편에 있을 예정입니다.
  2. 파이썬에서는 다른 언어랑 달리 타입값을 따로 지정하지는 않습니다 (print 등 특수 경우 제외) 해당 오류 때문에 전에 한참 검색했었는데, 그냥 스팀 API 스크립트상 오류라 직접 수정해주거나 try/except문을 써야합니다 :) 다음 시간에 다시 마저 설명드릴게요!

허허 생각보다 엉뚱한(?)곳에 답이 숨겨져있었네요. 아무튼 다음시간을 기다려보겠습니다.

허허 고수님이 여기 또 계시네요....
https://steemit.com/kr-qna/@dailypro/kr-dev-py
이 문제 풀이좀 해주세요~~~~~~~~~제발~

ㅠㅠ 저도 그 글읽어봤는데 당최 뭔소린지... 저 파이썬배운지 2~3달정도밖에 안되서 잘은 모릅니다...
그리고 뭣보다도 스팀잇개발을 하려면 스팀잇 모듈을 한번 뜯어서 함수설정을 어떻게 했는지 봐야되는데 그부분도 잘 몰라서요;; 능력밖의 문제라 도와드릴수 없어서 죄송합니당...

숙제.jpg

아직 뭔지 잘 모르고 그냥 따라하고 있습니다 ㅋㅋ
지도 편달 부탁드립니다 ^,.^;; 꾸벅...

스팀봇 완성까지만이라도 따라와주세요ㅎㅎ 참 잘했어요!

캄사합니다 ^.^ 열심히 따라(?)해 보겠습니다 ㅎ

요렇게 하면 숙제 잘 한건가요? :)

homework.jpg

맞습니다 :) 참 잘 했어요!!

숙제 완료입니다!!
캡처.PNG

숙제 잘 하셨습니다!! 도장 쿡! :)

숙제는 했는데 무슨의미인지모르겠어요 ㅠ

으아닛 오치님! 네 애매하게 끊어버리는 바람에... 다음 편에서 마저 설명드릴게요 :)

3.JPG
숙제끝!!!

와 참 잘 했어요!! :)

저도 숙제 했습니다. ^^ 재밌는 강의 감사합니다. ^^

스크린샷 2018-04-19 20.57.06.png

하핳 감사합니다 :) 어서 마무리까지 달릴게요!

열심히 따라가겠습니다! 거듭 감사합니다! ^^

ㅋㅋ.png
여기까지 따라해보았습다. ^^

잘 하셨습니다ㅎㅎ :) 다음 편도 곧 올릴테니 함께 해주세요!

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.033
BTC 64513.89
ETH 3155.04
USDT 1.00
SBD 4.00