0. 프린이 여러분, 수고했어요. 마지막입니다.
코딩 1도 몰라도 일단 따라하면 되는, '누구나' 하는 야매코딩 시리즈입니다.
누구나 만들어보는 스팀봇! 강좌 마지막 편에 오신 것을 환영합니다.
저번 편에서 꽤 많은 내용을 다뤘습니다.
스팀 블록체인에서 받아오는 permlink 개념을 알아봤고, .export()
를 이용해 포스트의 정보를 읽어보기도 했습니다. 에러를 해결하기 위해 노드도 변경하고 while문과 try/except문을 조합하기도 했죠.
뿐만 아니라 특정문구가 언급됐는지 실시간으로 체크가 가능해졌고, 포스팅 키를 넣어 대댓글도 달 수 있게 되었습니다.
즉 기본적인 기능을 갖춘 스팀봇이 드디어 완성됐었죠!
하지만 아직 원하는 문구를 인식하고, 실시간으로 지정된 문장으로 대댓글을 다는 정도입니다. 더 강려크한 기능을 갖췄으면 좋을텐데 말이죠! 그래서 추가 편성으로 심화편에서 보다 다양한 기능들을 3~4개 정도 소개하겠습니다.
자 이번 편에서는 VM인스턴스 화면을 닫아도 프린이만의 스팀봇이 24/7 작동하도록 하는 방법을 배워볼게요 :)
A. 개발 환경설정 따라하기 I - Google Cloud 세팅
B. 개발 환경설정 따라하기 II - Conda 세팅
C. 스팀 API 설치 및 살펴보기 101
D. 스팀 API 심화, 블록체인 & 포스트
E. 예제로 따라하는 스팀봇 뚝딱
F. nohup으로 자동화, 알아서 언제나 24/7 ☜
그럼 본격적으로 시작해볼까요?
- 난이도: 中
- 소요시간: 약 10분
이미지 출처 - https://dribbble.com/shots/3974885-Bumblebee by Pat Grivet
1. 한 가지 팁을 드릴게요.
여기까지 함께한 프린이라면 이제 강좌를 위한 준비 단계는 거뜬히 혼자 할 수 있다고 믿어요. VM인스턴스(부엌) 접속하고 조리기구 세팅까지 해주세요.
- 구글 클라우드 콘솔 사이트로 이동하고,
- Compute Engine 항목을 클릭하여,
- VM인스턴스의 SSH 버튼을 눌러 접속해주세요.
- 그리고
source activate steembot
을 입력해주세요. (조리기구 세팅)
자 준비됐나요?
응? 어디서 읽어본듯한 데자뷰...라고요? 아닙니다!!
저번가지 완성했던 레시피(코드) 부터 다시 볼까요?
from steem.blockchain import Blockchain
from steem.post import Post
from steem import Steem
s = Steem(nodes=["https://rpc.buildteam.io"], keys=["Key Goes Here!"])
b = Blockchain(s)
while True:
try:
stream = map(Post, b.stream(filter_by=['comment']))
for post in stream:
if "@야매코딩" in post.export()['body']:
print(post.export()['body'])
post.reply("Hi there!","","hellocrypto")
except:
print("뀨")
그러고 보니 위에 레시피(코드)에서 한 가지 문제점이 있었죠?
분명 stream = map(Post, b.stream(filter_by=['comment']))
에서 filter_by=['comment']
의 역할이 실시간으로 읽어오는 블록체인 정보중에서 댓글만 필터해야 하는데, 포스트랑 댓글 둘 다 인식하고 있죠.
아무래도 댓글만 인식했으면 좋겠으니, 이걸 간단히 고쳐볼까요?
사실 저번 편에서 언급했어야 하는 내용인데 잊고 말았습니다 (데헷) 친절히 지적해주신 마아냐 @maanya님 감사합니다 :)
딱 한 줄만 추가하면 됩니다 :) if post.is_comment():
if "@야매코딩" in post.export()['body']:
if post.is_comment():
print(post.export()['body'])
post.reply("Hi there!","","hellocrypto")
그럼 이제 레시피(코드) 로직이,
- 블록체인에서 실시간으로 정보 받아오다가
- "@야매코딩"이 들어가 있고
- 해당 정보가 포스트가 아닌 댓글이라면
- 해당 내용을 인쇄해주고, 댓글을 단다!
가 되겠네요. 포스트라면 무시를 하겠죠 이제.
그리고 if문 끝에 (:) 콜론이 있으니 기존 코드 두 줄은 한 번 탭을 해서 안으로 밀어주는거 잊지 말고요! 파이썬은 띄어쓰기에 민감합니다.
(한 번 더 탭!)print(post.export()['body'])
(한 번 더 탭!)post.reply("Hi there!","","hellocrypto")
만약 반대로 댓글이 아닌 포스트만 인식하고 싶다면
if post.is_main_post():
를 사용하시면 됩니다.
2. 영.원.히. 일해라 스팀봇!
지금까지 스팀봇을 작동시키려면 python3 blockpost.py
를 이용하고 있었죠?
하지만 이제 잘 알다시피 VM인스턴스 검은화면을 닫으면 종료되어 버린다는 단점을 갖고 있습니다. 스팀봇을 24/7 작동해야 의미가 있는데 말이죠.
그래서 해결책으로 리눅스의 nohup이라는 명령어를 사용해볼까 해요.
nohup python3 blockpost.py &
본래의 python3 blockpost.py
앞에 nohup
그리고 뒤에는 &
가 추가됐죠?
VM인스턴스를 SSH키를 이용해 접속하면 검은화면이 떴었는데, 이를 닫는다는 것은 접속, 즉 연결을 끊다는 뜻이죠. 그래서 기존 실행되던 스팀봇도 멈췄고요.
그런데 nohup
은 '연결이 끊겨도 상관없이~'라는 뜻을 가져요.
그리고 &
는 백그라운드에서 실행시켜! 라는 뜻을 가지죠.
백그라운드(background)에서 실행시키는게 무슨 차이가 있냐고요?
python3 blockpost.py
를 실행하면 검은화면에서는 스팀봇이 돌아가면서 나오는 결과들만 계속 나왔죠. 다른 일을 할 수가 없었어요! 그런데 백그라운드로 보내면 뒷쪽에서 해당 일이 진행되고, 그동안 프린이 또 다른 작업을 할 수 있죠.
nohup python3 blockpost.py &
을 입력하고 엔터를 누르셨나요? 그럼 아래와 같은 결과가 나와요.
리눅스에서 자동으로 해당 일(프로세스)에 번호를 매깁니다. 저 같은 경우에는 9886이라고 지정됐네요.
그리고 두 번째 사진을 보면 해당 결과는 nohup.out이라는 파일에 저장된다고 나옵니다.
결과가 파일에 저장되야 하는 이유요? 이제는 백그라운드에서 스팀봇이 돌아가니까, 에러 메세지나 성공했을 때 출력하던 댓글의 내용 등을 바로바로 검은 화면에서 못 보잖아요.
그래서 해당 내용을 파일에 저장해두면, 언제든 다시 돌아와서 확인할 수 있죠. 다른 말로는 로그(log)를 남긴다고 하죠.
이제 뒷쪽에서 잘 돌아가고 있는지 아닌지, 알 수가 없으니 확인해봐야겠죠?
ps
라는 명령어를 쓰면 됩니다. 입력 후 엔터를 눌러주세요 그럼 아래와 같은 결과가 보입니다 :)
중간에 python3가 보이죠? 번호는 9886이네요.
아까 nohup으로 실행시킬 때 보였던 번호죠.
다행히 잘 실행되고 있네요 :)
이번에는 ls
명령어로 저장된 파일들 목록을 살펴볼까요?
이제 nohup.out이 추가됐네요! 이제 언제든지 cat nohup.out
으로 안의 내용을 조회해볼 수 있습니다.
마지막으로 백그라운드에서 돌아가는 스팀봇을 중지시키고 싶을 때 방법을 알려드리겠습니다.
여러 방법들이 있겠지만, 저는 개인적으로 kill
이라는 살벌한 명령어를 사용합니다.
아까 프로세스 번호를 뒤에 입력하면 되죠.
짜잔! terminated 즉 종료됐다고 나옵니다.
이제 방법을 잘 아시겠죠? nohup을 이용하시면 바로 검은화면을 닫아 VM인스턴스 접속을 끊어도 스팀봇은 열심히 24/7 일하고 있을겁니다.
3. 마무리.
길면 길고, 짧다면 짧은 야매코딩 여정이었습니다.
A. 개발 환경설정 따라하기 I - Google Cloud 세팅
B. 개발 환경설정 따라하기 II - Conda 세팅
C. 스팀 API 설치 및 살펴보기 101
D. 스팀 API 심화, 블록체인 & 포스트
E. 예제로 따라하는 스팀봇 뚝딱
F. nohup으로 자동화, 알아서 언제나 24/7 ☜
많은 프린이 여러분(그리고 뜻밖의 굇수분들)이 함께 해주셔서 힘이 났습니다. 덕분에 여기까지 약 9일만에 달려왔네요 :)
아무것도 몰랐던 프린이라도, 일단 기본적인 형태의 스팀봇을 직접 만들어 보는 경험을 함께 하고 싶었습니다. 꼭 코딩을 잘해야 누릴 수 있는게 아니라고 보여주고 싶었죠.
그 의지가 잘 전달됐을지 궁금하네요 하핳.
여기까지 야매코딩 시리즈의 '누구나 만들어보는 스팀봇!' 편이었습니다.
조금 충전의 시간을 가지고, 새로운 야매코딩 강좌로 찾아뵙겠습니다!
이만 상병 크립토 @hellocrypto였습니다. 필승!