굳헬로의 스팀 프로그램 일기!! 스물두번째 #22 오늘부터 새로운 도전!! 자동 보팅 만들기!! 그 첫번째 스팀코인판의 소각글에 자동보팅을 해보자!! 첫번째 시간 (1/N)

in #sct5 years ago

steem.jpg

정말 무더운 여름 잘 보내고 계신가요??

어젠 조금 시련이 있어 슬럼프가 왔는데, 오늘은 잠시 다른 방향으로 시선을 돌려 새로운 프로그램에 도전을 해보기 위해 공부를 하고 있습니다.

그럼 그 이야기를 프로그램 일기로 남겨보도록 하겠습니다.


먼저 어제는 임대내역을 가져와서 데이터베이스에 저장하는 프로그램을 만들어 돌리면서 특정계정에서 뭔가 알수 없는 문제를 만났었는데요.

@banguri 님의 임대내역에서 오류가 있어서 그 이유를 찾느라 고생을 했었죠.

그런데 오늘 그 이유를 의외의 곳에서 찾았네요.

이렇게 임대가 2번 들어간게 데이터베이스에 저장되었는데..

그 이유는 임대를 받는 사람의 이름을 적을때 공백이 있어서 그랬던 거였습니다.

보시면 "naha.sct" 로 임대를 보냈어야 했는데 "naha.sct공백" 이렇게 naha.sct 뒤에 공백이 들어간 상태로 임대를 보내셨군요.

시스템에서 공백 처리를 해줬어야 했는데, 공백까지 아이디에 포함되어 임대가 가버린게 블록에 기록이 되어져 버렸네요.

어젠 이걸 못 찾아서 이것저것 찾아다니며 헤매느라 힘들었는데...

지금은 시스템에서 수정이 되어졌나 모르겠네요.

혹시 모르니 아이디 뒤에 공백여부를 잘 확인해야 할 것 같습니다.

그것 외에는 오늘도 열심히 최신 블록을 검사하며 임대 내역을 찾아 데이터베이스에 잘 저장되고 있는것 같습니다.


그나저나 오늘은 잠시 쉬어가는 시간으로 스팀엔진 공부를 잠시 접어두고 그동안 만들고 싶었던, 자동 보팅에 대해서 공부를 해보았습니다.

거창한 자동 보팅 프로그램은 아니고, 특정 포스팅의 정보를 가져와 보고, 그 포스팅에 보팅까지 되도록 파이썬으로 만들어 보겠습니다.

먼저 스팀의 포스팅 정보를 가져와보겠습니다.

from steem.blog import Blog
blog = Blog("goodhello")
post = next(blog)
post_json = post.export()
print(post_json)

steem.blog 를 이용하여 최신의 포스팅 정보를 가져와서 출력을 하는 코드입니다.

어제 작성했던 최신글의 여러가지 정보들이 출력되는군요.

출력결과를 알아보기 쉽게 하기 위해 pprint 라는걸 사용해 보도록 하겠습니다.

이번에 새로 알게된 출력 명령어인데 너무 너무 좋네요.

pprint.pprint(post_json)


...

정말 다양한 정보들이 출력이 되는군요.

이 정보들을 잘 활용할수 있을것 같습니다.

그리고 보팅을 하는 코드는

from steem import Steem
user = Steem(keys=["포스팅 키"])
post_id = 포스팅 주소
weight = 보팅%
user.commit.vote(post_id , weight, "goodhello")

이렇게 간단히 포스팅 주소와 포스팅키만 있으면 보팅을 할 수 있습니다.

위의 2개의 코드를 합치면

from steem import Steem
from steem.blog import Blog

from steem.blog import Blog
blog = Blog("goodhello")
post = next(blog)
post_json = post.export()

post_id = post['identifier']
weight = 100
user.commit.vote(post_id , weight, "goodhello")

저의 최신글의 정보를 가지고 와서, 거기에서 포스팅 주소를 post_id = post['identifier'] 이렇게 가지고 와서 user.commit.vote(post_id , weight, "goodhello") 코드를 이용해 보팅을 하게 됩니다.

그럼 이 코드를 활용하여 실전에 들어가 보겠습니다.

제가 만들고 싶었던 스팀코인판이나 AAA등 원하는 포스팅에 자동보팅!!

오늘은 먼저 스팀코인판에서 수익극대화를 위해 소각글에 자동보팅 할 수 있도록 도전!!

스팀코인판은 저자보상과 큐레보상이 다음과 같이 셋팅되어 있습니다.

author_curve_exponent : 1.3
curation_curve_exponent : 0.9

스팀코인판은 저자보상이 1.3승이라 보팅이 몰리면 몰릴수록 보상인 높아진답니다.

그리고 큐레이션 보상은 0.9로 셋팅되어 있어 글 쓴 후 15분에 보팅을 했을때 큐레이션 보상이 가장 높고 이후에는 조금씩 줄어든다고 생각하면 됩니다.

그러니 소각을 예상하는 좋은글에 15분에 딱 보팅하면 가장 좋겠죠.

그런데 이건 실시간으로 지켜보지 않는한 어려운 일이고, 바쁘거나 밖이거나 여행중일때는 거의 불가능하죠.

이럴때를 대비해 누군가 소각을 하게 되면 그것을 알림으로 받고 그 글에 보팅을 직접 혹은 자동으로 할 수 있으면 큐레이션 수익 극대화에 도움이 많이 될거라 생각하여 도전을 해보았습니다.

먼저 소각글이 어떤건지를 알아야겠죠.

소각글은 스팀코인판에서

홍보 버튼을 눌러

SCT를 지불하고 홍보를 하는 글입니다.

홍보를 하게 되면 @null 계정으로 SCT가 송금되면서 이를 소각이라 하고, 그래서 홍보글을 소각글이라고 하는것 같습니다.

https://www.steemcoinpan.com/@null/transfers

@null 계정의 지갑을 확인해 보면

오늘도 이렇게 뜨겁게 소각전쟁이 이루어지고 있는군요.

이 글들의 목록을 파이썬으로 가져와 보겠습니다.

token_history = api.get_history("null", "SCT", limit=10)
pprint.pprint(token_history)

@null 계정은 송금을 받는일 외에는 하는일이 없기에, api.get_history("null", "SCT", limit=10) 간단하게 목록을 가지고 올 수 있습니다.

[{'block': '1121386',
  'from': 'hyokhyok',
  'from_type': 'user',
  'memo': '@hyokhyok/sct-event-1',
  'quantity': '176',
  'symbol': 'SCT',
  'timestamp': '2019-08-08T06:28:21.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': '8bd65c88e661cf7af163a26aded000e264951f12'},
 {'block': '1120346',
  'from': 'innovit',
  'from_type': 'user',
  'memo': 'search and click: @donekim/dtube-dtc',
  'quantity': '0.5',
  'symbol': 'SCT',
  'timestamp': '2019-08-08T05:13:24.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': 'bf114636ee4994d4bc3cdd7e78a97896cd15cc07-1'},
 {'block': '1120235',
  'from': 'sct.jcob',
  'from_type': 'user',
  'memo': 'search and click: @jayplayco/sct1004',
  'quantity': '0.5',
  'symbol': 'SCT',
  'timestamp': '2019-08-08T05:03:57.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': '448742247cc8f4971fdbaef71ee8e09807077bd0-1'},
 {'block': '1117467',
  'from': 'jayplayco',
  'from_type': 'user',
  'memo': '@jayplayco/coinnews-fiu',
  'quantity': '152',
  'symbol': 'SCT',
  'timestamp': '2019-08-08T01:24:03.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': '5937af68888c558562ff3c2e74ff47aff3b34afd'},
 {'block': '1116948',
  'from': 'zzings',
  'from_type': 'user',
  'memo': '@zzings/binance-launchpad-8-perlin-perl',
  'quantity': '214',
  'symbol': 'SCT',
  'timestamp': '2019-08-08T00:56:42.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': '6f2b1f7f63fe6351643097d5684d61f17561696b'},
 {'block': '1116382',
  'from': 'chocolate1st',
  'from_type': 'user',
  'memo': '@chocolate1st/0002',
  'quantity': '175',
  'symbol': 'SCT',
  'timestamp': '2019-08-08T00:15:27.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': '9c05ace5e2fd0e4f9635ad31badc533f1e72a9a7'},
 {'block': '1115816',
  'from': 'oldstone',
  'from_type': 'user',
  'memo': '@oldstone/yg7wu',
  'quantity': '160',
  'symbol': 'SCT',
  'timestamp': '2019-08-07T23:38:21.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': '1701f583f73059f2ef24da848d990da28a26b326'},
 {'block': '1115132',
  'from': 'donekim',
  'from_type': 'user',
  'memo': '@donekim/sctr',
  'quantity': '156.5',
  'symbol': 'SCT',
  'timestamp': '2019-08-07T22:50:57.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': '5865bc85f8a9a1035aed5f2f044470e543ab86d7'},
 {'block': '1115057',
  'from': 'tradingideas',
  'from_type': 'user',
  'memo': '@tradingideas/5pcnci',
  'quantity': '156.1',
  'symbol': 'SCT',
  'timestamp': '2019-08-07T22:45:21.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': 'e58d5e98f96ed96b6c8c1014acb6d79719056833'},
 {'block': '1114273',
  'from': 'lovelyyeon.sct',
  'from_type': 'user',
  'memo': '@lovelyyeon.sct/steem',
  'quantity': '156',
  'symbol': 'SCT',
  'timestamp': '2019-08-07T21:48:51.000Z',
  'to': 'null',
  'to_type': 'user',
  'txid': '637e1fa158ef08eabf441f6eeee27897f3a6abc9'}]

이 중에서 보팅을 하고 싶은 글의 주소를 뽑아내야 하겠죠.

저는 @null 계정으로 150 SCT 이상 소각한 글의 주소를 뽑아서 보팅을 해보도록 하겠습니다.

    token_history = api.get_history("null", "SCT", limit=10)


    for token in token_history:
        if float(token["quantity"]) >= 150 :
            post_id = token["memo"]
            print("150SCT 이상 소각한 글의 주소 : " + post_id)

최근 10개의 글중에서 150 SCT 이상 @null로 보내서 소각한 글들을 출력하였습니다.

150SCT 이상 소각한 글의 주소 : @hyokhyok/sct-event-1
150SCT 이상 소각한 글의 주소 : @jayplayco/coinnews-fiu
150SCT 이상 소각한 글의 주소 : @zzings/binance-launchpad-8-perlin-perl
150SCT 이상 소각한 글의 주소 : @chocolate1st/0002
150SCT 이상 소각한 글의 주소 : @oldstone/yg7wu
150SCT 이상 소각한 글의 주소 : @donekim/sctr
150SCT 이상 소각한 글의 주소 : @tradingideas/5pcnci
150SCT 이상 소각한 글의 주소 : @lovelyyeon.sct/steem

앞에서 살펴본 보팅을 하는 코드에 들어가는 포스트 주소에는 @가 들어가지 않기 때문에

post_id = post_id.replace("@", "")

코드를 추가하여

150SCT 이상 소각한 글의 주소 : hyokhyok/sct-event-1
150SCT 이상 소각한 글의 주소 : jayplayco/coinnews-fiu
150SCT 이상 소각한 글의 주소 : zzings/binance-launchpad-8-perlin-perl
150SCT 이상 소각한 글의 주소 : chocolate1st/0002
150SCT 이상 소각한 글의 주소 : oldstone/yg7wu
150SCT 이상 소각한 글의 주소 : donekim/sctr
150SCT 이상 소각한 글의 주소 : tradingideas/5pcnci
150SCT 이상 소각한 글의 주소 : lovelyyeon.sct/steem

주소를 잘 뽑아내었네요.

    token_history = api.get_history("null", "SCT", limit=10)

    for token in token_history:
        if float(token["quantity"]) >= 150 :
            post_id = token["memo"]
            post_id = post_id.replace("@", "")
            user = Steem(keys=["POST_KEY"])
            weight = 100

            user.commit.vote(post_id , weight, "goodhello")
            time.sleep(3)

이제 소각한 글들의 주소를 뽑아내어 보팅을 하는 코드가 완성이 되었네요.

글 하나에 보팅을 하고 3초뒤 다음 글에 보팅하도록 time.sleep(3) 코드도 추가를 하였습니다.

하지만 이렇게 실행한다면 문제가 많을겁니다.

이미 보팅된 글에 또 보팅을 하게 되는 문제도 있고, 글이 언제 올라왔는지, 15분이 지난 글인지, 혹시 페이아웃이 지난글은 아닌지 이런 문제를 해결을 해야 할 것 같네요.

여러가지 문제에 대한 해법을 찾아서 현재 코드를 만들고 있는데요.

아직 파이썬 초보인 저에게는 쉽지 않네요.

시간이 조금 더 많이 필요할 것 같습니다.

그럼 다음 시간에 @null 계정의 지갑을 검사하며 누군가 @null 계정으로 150 SCT 이상 보내 글을 소각했다면, 그 글에 보팅을 자동으로 하도록 하는 코드를 살펴볼 수 있도록 힘내 보겠습니다.

그럼 여러분들도 오늘 하루 행복하시구요~

파이팅입니다~


굳헬로의 스팀 프로그램 일기!! 시리즈

#1 굳헬로의 스팀 프로그램 일기!! 대망의 시작 #1 Python 프로그램 설치 && steemengine 파이썬 api 설치 && 간단한 steemengine 예제

#2 굳헬로의 스팀 프로그램 일기!! 그 두번째 #2 비주얼 스튜디오 코드 프로그램 설치 && 비주얼 스튜디오 코드를 사용하여 파이썬 다루기 && 간단한 steemengine 예제

#3 굳헬로의 스팀 프로그램 일기!! 세번째 #3 스팀엔진 토큰의 정보를 가져오는 findOne() && 누군가의 토큰 사용 내역을 가져오는 get_history() && JSON 데이터 출력

#4 굳헬로의 스팀 프로그램 일기!! 네번째 #4 steemengine Token 클래스 && Token.get_holder() && Token.get_market_info() && Token.get_buy_book() && Token.get_sell_book()

#5 굳헬로의 스팀 프로그램 일기!! 다섯번째 #5 스팀엔진 블록을 뒤져서 원하는 정보를 찾아보자!! 스팀엔진 마켓 거래 내역을 뽑아내는 예제

#6 굳헬로의 스팀 프로그램 일기!! 여섯번째 #6 파이썬으로 스팀엔진 토큰들을 클레임 해보자.

#7 굳헬로의 스팀 프로그램 일기!! 일곱번째 #7 프로그램 일기도 어느덧 1주일!! 드디어 첫 실전!! 무한 반복 작업 수행하기!! 이제 직접 클레임 하는 손맛은 잊자. 무한 반복 자동 클레임!!

#8 굳헬로의 스팀 프로그램 일기!! 여덟번째 #8 텔레그램 봇을 이용해 알림을 받아보자!! && 무한 반복 자동 클레임의 정보를 텔레그램으로 받아보기!!

#9 굳헬로의 스팀 프로그램 일기!! 아홉번째 #9 무한 반복 자동 클레임 업그레이드!! && 토큰 잔고 확인 && 토큰 전송과 토큰 전송 내역을 텔레그램으로 받아보기!!

#10 굳헬로의 스팀 프로그램 일기!! 열번째 #10 토큰 전송내역을 검사하고, 토큰을 전송 받으면 텔레그램으로 알림을 받아보기!!

#11 굳헬로의 스팀 프로그램 일기!! 열한번째 #11 스팀엔진 토큰 임대내역 추적. 쉽지 않았던 머나먼 여정 (1/2)

#12 굳헬로의 스팀 프로그램 일기!! 열두번째 #12 스팀엔진 토큰 임대내역 추적. 쉽지 않았던 머나먼 여정 (2/2) 스팀엔진 토큰 임대내역 추적 완료!!

#13 굳헬로의 스팀 프로그램 일기!! 열세번째 #13 웹 프로그래밍의 시작!! 파이썬을 이용하여 정보를 MySQL 데이터 베이스에 저장해보기!!

#14 굳헬로의 스팀 프로그램 일기!! 열네번째 #14 파이썬을 이용하여 데이터베이스로부터 정보를 가져오기 && 스팀코인판 3대풀 임대내역 데이터베이스 작업 완료!!

#15 굳헬로의 스팀 프로그램 일기!! 열다섯번째 #15 웹 프로그래밍을 이용하여 스팀코인판 3대조합의 임대 내역을 웹으로 확인해보자 !!

#16 굳헬로의 스팀 프로그램 일기!! 열여섯번째 #16 스팀엔진 최신 블록을 검사하여 필요한 정보를 데이터베이스에 저장하기!! 3대 조합의 임대내역을 최신으로 저장하기!!

#17 굳헬로의 스팀 프로그램 일기!! 열일곱번째 #17 조합들이 필요한 기능 드디어 완성!! 자동 클레임과 자동 분배 기능!!

#18 굳헬로의 스팀 프로그램 일기!! 열여덟번째 #18 스팀코인판 3대 조합의 임대내역과 실시간 예상 분배 금액을 웹으로 확인해보자!!

#19 굳헬로의 스팀 프로그램 일기!! 열아홉번째 #19 어제 만든 프로그램 업그레이드!! 개별 상세내역보기 기능 추가!!

#20 굳헬로의 스팀 프로그램 일기!! 어느덧 스물번째 #20 시행착오... 그리고 시련... 하지만 원사마님 덕분으로 엄청난 레벨업!! 감사합니다. 더욱 발전하겠습니다.

#21 굳헬로의 스팀 프로그램 일기!! 스물한번째 #21 레벨업을 했지만 또 다시 찾아온 시련!! 프로그램 결과와 블록체인에 기록된 결과가 다르다!! 어떻게 해야 할까...

Sort:  

슬럼프에 빠지면서까지 왜 하시려고 하나요? 저랑 놀아요~~ ㅋㅋ
술마시고~ 노래하고~ 춤?? 춤까진 안되겠네요! ㅋㅋㅋㅋㅋ

ㅎㅎㅎ 술마시고 노래하고 춤까지 하셔야죠~~

스팀잇에 개발자분들이 많으시군요. 스팀시세가 회복되면 행복해지실텐데..

전.. 딱히 개발자는 아닌데... 하다보니 잼나서 계속 공부하게 되네요~

보팅 감사히 받겠습니다. 나날이 발전하시는군요.

ㅎㅎㅎㅎ 앞으로 가야할길이 무궁무진하네요~

와~ 정말 대단하세요!!! 점점더 실용적으로 가는것 같습니다~ ^^

아직 대단할건 없구요... 언젠간 대단한걸 하게 될지도 모르죠~ ㅎㅎㅎ

오늘도 대박 일기 잘 읽었습니다!! ㅋ

ㅎㅎ 너모 소소한 글인데... 감사합니다~

부계정들 자동 보팅으로 하고 싶네요.

이미 많은 자동 보팅 시스템이 있는데..

전 공부삼아 이것저것 만들어 보는중입니다~

union.sct님이 goodhello님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
union.sct님의 [공지] 스판유니언 조합원 대상 23차 큐레이션 수익배분 완료 안내

... 13 19 2차 추가 goodhello/td> 3000 2.52% 13 <td...

Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.

Hi @goodhello!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 3.991 which ranks you at #4035 across all Steem accounts.
Your rank has dropped 148 places in the last three days (old rank 3887).

In our last Algorithmic Curation Round, consisting of 284 contributions, your post is ranked at #129.

Evaluation of your UA score:
  • You're on the right track, try to gather more followers.
  • The readers like your work!
  • Good user engagement!

Feel free to join our @steem-ua Discord server

Coin Marketplace

STEEM 0.25
TRX 0.11
JST 0.034
BTC 63549.78
ETH 3107.39
USDT 1.00
SBD 3.88