steem API로 자동 보팅 봇 만들어보기 with Python
안녕하세요 @tmkor입니다.
오늘은 일전에 설치한 steem-python API를 이용해서 뭘 해볼까 하다가... 간단한 자동 보팅 봇을 만들어보았습니다. 간단한 toy example이지만, 나름 steem API를 골고루 쓰는 것이라 포스팅 해봅니다.
본 예제는 특정 ID의 게시글의 최신글에 보팅하는 가장 단순한 시나리오를 대상으로 합니다.
아래 내용이 구현된 소스코드는 https://github.com/taeminlee/steem.autovote 에서 확인하실 수 있습니다. 필요하신 분들 가져다가 쓰셔도 무방합니다.
자동 보팅 처리 흐름
자, 먼저 보팅을 위해서 우리가 스팀잇에서 하는 행동을 순차적으로 정리해 봅시다.
- 로그인
- 특정 ID의 첫번째 포스트 열람
- 업보트
저 4가지에 해당하는 함수를 구현하면 됩니다.
1. 로그인
steem-python API는 꽤나 직관적으로 구성되어 있습니다. 로그인은 아래 2줄의 코드로 구현 가능합니다.
from steem import Steem
user = Steem(keys=["POST_KEY"])
- 첫번째 줄은 라이브러리를 사용하기 위한 구문이고,
- 두번째 줄은 posting key를 이용해서 로그인 하는 부분입니다.
- 우리가 업보트 하기위한 최소한의 권한은 posting key 이므로, 요것만 넣으셔도 됩니다.
- 로그인이 완료되면 사용자 개체가 반환됩니다.
2. 특정 ID의 첫번째 포스트 열람
from steem.blog import Blog
blog = Blog("TARGET_USER_ID")
post = next(blog)
post_json = post.export()
- 첫번째 줄은 특정 ID의 블로그를 접근하는 라이브러리를 import 하는 구문입니다.
- 두번째 줄은 보팅을 할 대상 ID의 블로그 객체를 가져오는 구문입니다.
- 세번째 줄은 첫번째 포스트 객체를 가져오는 구문입니다.
- 블로그 객체의 경우 포스트를 가져오는 generator로 next가 호출 될 때마다 최신 순으로 하나씩 포스트를 yield합니다.
- 네번째 줄은 포스트 내용을 포스트 객체에서 읽는 구문입니다. 우리가 steemd에서 자주보는 그 내용을 여기서 볼 수 있습죠!
3. 업보트
postId = post['identifier']
user.commit.vote(postId, weight, "USER_ID")
- 먼저 포스트의 identifier를 가져옵니다. identifier는 글의 고유 주소로, 우리가 보고 있는 글의 주소창에 나와있는 URL이라 보시면 됩니다.
- 앞서 로그인에서 받은 사용자 개체의 commit.vote 함수를 이용해서 voting 하면 됩니다.
- 인자는 3개로, voting할 포스트의 identifier, 업보트의 비중(100 = 풀봇, -100=너 나랑 싸우자), 보팅하는 사용자의 ID 입니다.
결론
스팀 API를 이용하면 간단한 구문으로 쉽게 자동화된 행동을 구현할 수 있습니다. 이를 이용한 다양한 비즈니스 모형이 우리 주변에도 많이 존재하고 있습니다. 이 가이드 문서가 새로운 비즈니스 모형을 만드시는 분들께 도움이 되길 바랍니다.
- 실행 가능한 소스코드는 https://github.com/taeminlee/steem.autovote 에서 확인 가능합니다. ^^
-100 = 너 나랑 싸우자 ㅎㅎㅎㅎ 재밌어요~! 감사합니다~
아!! 파이썬으로 하고 싶다. 진도가 잘 나가시는군요. 근데 내가 원하는 금액으로 upvote하는 계산식을 못 찾았어요. 혹시 아시나요?
파이썬 언어 특성상 적은 코드로 표현이 가능해서 그런 것 같습니다. ^^;
흠, 원하는 금액으로 upvote하는건 꽤 여러단계의 연산이 필요하겠네요. ;ㅅ; 요건 서베이 해보고 알려드릴께요~
스팀파이는 사용하기 편하게 되어있는것 같군요. 저는 자바 개발자라 steemj를 좀 써봤는데 생각보다 좀 불편합니다 ㅎㅎ
스팀파이 꽤 편합니다~ 근데 노드가 뻗어서인지 지금은 잘 안되네요... ;ㅅ;
멋져라! 감사합니다.
감사합니다. ^^
api도 구현이 잘되있었군요. 나중에 스팀잇 관련 좋은 아이디어 나오면 한번 써봐야겠네요
네, 몇번 써보았는데 꽤나 원하는대로 조물딱 거릴 수 있습니다. 다만, 명령어당 실행 딜레이가 있는지라, 연산량이 많은 작업을 수행하시려면 비동기를 쓰거나, 자체 노드를 구축해야 될 것 같습니다.
멋지네요 저도 따라서 해봐야겠네요 ^~^ 보팅 팔로우 합니다 감사합니다
댓글 감사드립니다. ^^ 저도 팔로우 할께요~ 개발 글 자주 올려주세요 'ㅅ')/
글 잘봤습니다!! 팔로우했습니다~ 맞팔부탁드려요 ^O^
댓글 감사드립니다. ^^
리스팀 합니다!ㅎㅎ
리스팀 감사드립니다! ^^
팔로우 감사합니다 ^^ 좋은글 많이 올려주시는거 많이 참고할게요!
댓글 감사드립니다. 게임 리뷰.. 기대하겠습니다.