굳헬로의 스팀 프로그램 일기!! 쉰아홉번째 #59 새로운 프로그램 공부를 시작!! 스팀몬스터 자동화를 위해 스팀몬스터 API를 분석해보자!! 그 첫시간!!

in #sct5 years ago

추석 연휴 잘 보내셨나요??

어느덧 연휴의 마지막 날 밤이라니...

내일부터 다시 일상이 시작되는군요.

너무나도 피곤하지만... 힘내서 오늘도 프로그램 일기 남겨보겠습니다.


이제까지는 스팀코인판 조합의 자동 분배 프로그램과 자동 보팅 프로그램, 그리고 이러한 정보들을 웹 페이지에서 확인하는 프로그램, 또 텔레그램을 이용하여 비트코인이나 스팀, 스팀엔진 토큰들의 시세를 알아보는 프로그램등을 만들어 보았었는데요.

오늘부터는 스팀에서 제일 잘 나가고 있는 스팀몬스터 게임을 파이썬으로 다루는 것을 공부해 보도록 하겠습니다.

스팀몬스터를 파이썬으로 다루는 API를 역시나 스팀엔진 API를 만들어 주었던 holgern님이 만들어 놓았는데요.

https://github.com/holgern/steemmonsters

위의 링크에서 소스 코드를 확인할 수 있습니다.

전 이 코드를 이용해 제가 원하는 프로그램을 만들어 보도록 하겠습니다.

예전부터 스팀몬스터 자동화에 관심이 많았었는데요.

이전에는 개발신 원사마님께서 node.js로 된 코드를 일부 공유해 주셔서 그것을 이용해서 자동화 프로그램을 돌려보기도 했고, 하지만 스팀몬스터가 업그레이드 되고, 새로운 룰 추가로 인해 계속 사용할 수 없게 되었을때 holgern의 파이썬 코드를 알게되었습니다.

그런데 그 당시에는 파이썬 프로그래밍에 대해 잘 몰랐기에 나중에 공부해야지 하고 생각만 하다가 이제서야 드디어 코드를 분석해 보게 되었네요.

오늘은 그 첫시간으로 스팀몬스터 API를 설치하고 간단하게 이용해 보도록 하겠습니다.

스팀몬스터 API는

pip install steemmonsters

명령어를 이용해 설치할 수 있습니다.

스팀몬스터 API 코드는

class Api(object):
    """ Access the steemmonsters API
    """
    __url__ = 'https://steemmonsters.com/'

    def get_card_details(self):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "cards/get_details")
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_purchases_stats(self):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "purchases/stats")
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def settings(self):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "settings")
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def players_leaderboard(self):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "players/leaderboard")
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def find_cards(self, card_ids):
        if isinstance(card_ids, list):
            card_ids_str = ','.join(card_ids)
        else:
            card_ids_str = card_ids
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "/cards/find?ids=%s" % card_ids_str)
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()
    
    def get_open_all_packs(self, player, edition, token):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "cards/open_all_packs/%s?player=%s&edition=%d&token=%s&username=%s" % (player, player, edition, token, player))
            cnt2 += 1
        return response.json()

    def get_open_packs(self, uuid, player, edition, token):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "cards/open_pack/%s?player=%s&edition=%d&token=%s&username=%s" % (uuid, player, edition, token, player))
            cnt2 += 1
        return response.json()

    def get_cards_packs(self, player, token):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "cards/packs/%s?token=%s" % (player, token))
            cnt2 += 1
        return response.json()

    def get_collection(self, player):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "cards/collection/%s" % player)
            cnt2 += 1
        return response.json()

    def get_player_login(self, player):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "players/login?name=%s" % player)
            cnt2 += 1
        return response.json()

    def get_player_details(self, player):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "players/details?name=%s" % player)
            cnt2 += 1
        return response.json()

    def player_save_team(self, name, team, player, token, mana_cap):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "players/save_team?name=%s&team=%s&mana_cap=%d&token=%s&username=%s" % (name, team, mana_cap, token, player))
            cnt2 += 1
        return response.json()

    def player_delete_team(self, name, player, token, mana_cap):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "players/delete_team?name=%s&mana_cap=%d&token=%s&username=%s" % (name, mana_cap, token, player))
            cnt2 += 1
        return response.json()

    def get_player_saved_teams(self, player, token, mana_cap):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "players/saved_teams?mana_cap=%d&token=%s&username=%s" % (mana_cap, token, player))
            cnt2 += 1
        if str(response) == '<Response [500]>':
            print(response.content)
            return {}
        return response.json()

    def get_player_teams_last_used(self, player, mana_cap):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "players/saved_teams?mana_cap=%d&team=Last%%20Used&player=%s" % (mana_cap, player))
            cnt2 += 1
        if len(response.content) == 0:
            return ""
        return response.json()

    def get_player_quests(self, player):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "players/quests?username=%s" % player)
            cnt2 += 1
        return response.json()

    def get_for_sale(self):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "market/for_sale")
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_purchases_settings(self):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "purchases/settings")
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()
    
    def get_purchases_status(self, uuid):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "purchases/status?id=%s" % uuid)
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_from_block(self, block_num):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "transactions/history?from_block=%d" % block_num)
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_transaction(self, trx):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "transactions/lookup?trx_id=%s" % trx)
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_cards_stats(self):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "cards/stats")
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_market_for_sale_by_card(self, card_detail_id, gold, edition):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "market/for_sale_by_card?card_detail_id=%d&gold=%s&edition=%d" % (card_detail_id, gold, edition))
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_market_for_sale_grouped(self):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "market/for_sale_grouped")
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_market_status(self, market_id):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 10:
            response = requests.get(self.__url__ + "market/status?id=%s" % market_id)
            if str(response) != '<Response [200]>':
                time.sleep(2)
            cnt2 += 1
        return response.json()

    def get_battle_history(self, player="%24top"):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 20:
            response = requests.get(self.__url__ + "battle/history?player=%s" % player)
            if str(response) != '<Response [200]>':
                time.sleep(1)
            cnt2 += 1
        return response.json()

    def get_battle_result(self, ids):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 20:
            response = requests.get(self.__url__ + "battle/result?id=%s" % ids)
            if str(response) != '<Response [200]>':
                time.sleep(1)
            cnt2 += 1
        return response.json()

    def get_battle_status(self, ids):
        response = ""
        cnt2 = 0
        while str(response) != '<Response [200]>' and cnt2 < 20:
            response = requests.get(self.__url__ + "battle/status?id=%s" % ids)
            if str(response) != '<Response [200]>':
                time.sleep(1)
            cnt2 += 1
        return response.json()

위와 같으며, 메소드 이름으로 유추해 보자면

카드 정보를 가지고 올 수 있는 get_card_details(), 리더보드 정보를 불러오는 players_leaderboard() 카드 팩을 오픈하는 get_open_all_packs()퀘스트 정보를 가져오는 get_player_quests 를 비롯하여 스팀몬스터 마켓 정보까지 다양한 기능들이 담겨져 있습니다.

이 API를 잘 사용할 수 있게 된다면 스팀몬스터 전투 자동화와 일일 퀘스트 진행, 카드 구매와 판매 등 유용한 프로그램을 만들수 있을겁니다.

그럼 오늘은 간단하게 몇개만 테스트 해보도록 하겠습니다.

먼저 사용자의 소유 카드 정보를 가져오는 get_collection()을 사용해 보았습니다.

import pprint
from steemmonsters.api import Api

api = Api()
response = api.get_collection("goodhello")
pprint.pprint(response)

코드를 실행하면

{'cards': [{'alpha_xp': 20,
            'buy_price': None,
            'card_detail_id': 1,
            'delegated_to': None,
            'delegation_tx': None,
            'edition': 1,
            'gold': False,
            'last_transferred_block': None,
            'last_used_block': 36411909,
            'level': 10,
            'market_id': None,
            'player': 'goodhello',
            'skin': None,
            'uid': 'C1-1-7J75R5OTA8',
            'xp': 7565},
           {'alpha_xp': None,
            'buy_price': None,
            'card_detail_id': 1,
            'delegated_to': None,
            'delegation_tx': None,
            'edition': 1,
            'gold': True,
            'last_transferred_block': 33119927,
            'last_used_block': None,
            'level': 4,
            'market_id': None,
            'player': 'goodhello',
            'skin': None,
            'uid': 'G1-1-7UGPIGW51C',
            'xp': 200},
           {'alpha_xp': None,
            'buy_price': None,
            'card_detail_id': 1,
            'delegated_to': None,
            'delegation_tx': None,
            'edition': 1,
            'gold': True,
            'last_transferred_block': 33119926,
            'last_used_block': 28872574,
            'level': 4,
            'market_id': None,
            'player': 'goodhello',
            'skin': None,
            'uid': 'G1-1-EAAHX3GFHC',
            'xp': 200},
           {'alpha_xp': None,
            'buy_price': None,
            'card_detail_id': 1,
            'delegated_to': None,
            'delegation_tx': None,
            'edition': 1,
            'gold': False,
            'last_transferred_block': None,
            'last_used_block': None,
            'level': 1,
            'market_id': None,
            'player': 'goodhello',
            'skin': None,
            'uid': 'C1-1-G31CDLC4E8',
            'xp': 0},
           {'alpha_xp': None,
            'buy_price': None,
            'card_detail_id': 1,
            'delegated_to': None,
            'delegation_tx': None,
            'edition': 1,
            'gold': False,
            'last_transferred_block': None,
            'last_used_block': None,
            'level': 1,
            'market_id': None,
            'player': 'goodhello',
            'skin': None,
            'uid': 'C1-1-VWP2SM5JB4',
            'xp': 0},
           {'alpha_xp': None,
            'buy_price': None,
            'card_detail_id': 1,
            'delegated_to': None,
            'delegation_tx': None,
            'edition': 1,
            'gold': False,
            'last_transferred_block': None,
            'last_used_block': None,
            'level': 1,
            'market_id': None,
            'player': 'goodhello',
            'skin': None,
            'uid': 'C1-1-QOQNTAT25C',
            'xp': 0},
           {'alpha_xp': None,
            'buy_price': None,
            'card_detail_id': 1,
            'delegated_to': None,
            'delegation_tx': None,
            'edition': 1,
            'gold': False,
            'last_transferred_block': None,
            'last_used_block': None,
            'level': 1,
            'market_id': None,
            'player': 'goodhello',
            'skin': None,
            'uid': 'C1-1-I2BU7DDWI8',
            'xp': 0},
           {'alpha_xp': None,
            'buy_price': None,
            'card_detail_id': 1,
            'delegated_to': None,
            'delegation_tx': None,
            'edition': 1,
            'gold': False,
            'last_transferred_block': None,
            'last_used_block': None,
            'level': 1,
            'market_id': None,
            'player': 'goodhello',
            'skin': None,
            'uid': 'C1-1-69XUKTC6GG',
            'xp': 0},
...

제가 가진 카드들이 주르르륵 출력됩니다.

다음으로 goodhello의 퀘스트 정보를 가져와 보겠습니다.

response = api.get_player_quests("goodhello")
pprint.pprint(response)

퀘스트 정보를 가져오는 get_player_quests() 메소드에 goodhello 계정명을 담아서 출력을 해보았습니다.

[{'claim_date': None,
  'claim_trx_id': None,
  'completed_items': 1,
  'created_block': 36410896,
  'created_date': '2019-09-14T09:44:20.075Z',
  'id': '0b2dfb283e7cb2ba31be5cca9b76293c39a22e7a',
  'name': 'Pirate Attacks',
  'player': 'goodhello',
  'rating': 3400,
  'refresh_trx_id': '329bd978e30520415da8df390f93e67bcb6ff17d',
  'reward_qty': 20,
  'total_items': 5}]

퀘스트를 받은 시간과 퀘스트 이름 name : Pirate Attacks 물덱 퀘스트 입니다.

그리고 현재 1승을 진행중이니 completed_items 값이 1이라고 나오고 있네요.

이렇게 퀘스트 정보를 가지고 와서 해당 덱의 퀘스트를 5승 할때까지 배틀을 돌리면 일일 퀘스트 자동화를 만들 수 있을 것 같습니다.

지금 당장은 만들기 어렵겠지만, 하나씩 하나씩 공부해 나가다 보면 충분히 만들수 있을거라 생각합니다.

앞으로 스팀몬스터 API를 연구하면서 실력을 키워나가 보겠습니다.

그럼 첫시간은 이정도로 마무리 하도록 하며...

여러분들 연휴 마지막날 푹 쉬시고 내일부터 시작되는 새로운 한주도 파이팅 하시길 바랍니다.


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

#1 Python 프로그램 설치 && steemengine 파이썬 api 설치 && 간단한 steemengine 예제

#2 비주얼 스튜디오 코드 프로그램 설치 && 비주얼 스튜디오 코드를 사용하여 파이썬 다루기 && 간단한 steemengine 예제

#3 스팀엔진 토큰의 정보를 가져오는 findOne() && 누군가의 토큰 사용 내역을 가져오는 get_history() && JSON 데이터 출력

#4 steemengine Token 클래스 && Token.get_holder() && Token.get_market_info() && Token.get_buy_book() && Token.get_sell_book()

#5 스팀엔진 블록을 뒤져서 원하는 정보를 찾아보자!! 스팀엔진 마켓 거래 내역을 뽑아내는 예제

#6 파이썬으로 스팀엔진 토큰들을 클레임 해보자.

#7 드디어 첫 실전!! 무한 반복 작업 수행하기!! 이제 직접 클레임 하는 손맛은 잊자. 무한 반복 자동 클레임!!

#8 텔레그램 봇을 이용해 알림을 받아보자!! && 무한 반복 자동 클레임의 정보를 텔레그램으로 받아보기!!

#9 무한 반복 자동 클레임 업그레이드!! && 토큰 잔고 확인 && 토큰 전송과 토큰 전송 내역을 텔레그램으로 받아보기!!

#10 토큰 전송내역을 검사하고, 토큰을 전송 받으면 텔레그램으로 알림을 받아보기!!

#11 스팀엔진 토큰 임대내역 추적. 쉽지 않았던 머나먼 여정 (1/2)

#12 스팀엔진 토큰 임대내역 추적. 쉽지 않았던 머나먼 여정 (2/2) 스팀엔진 토큰 임대내역 추적 완료!!

#13 웹 프로그래밍의 시작!! 파이썬을 이용하여 정보를 MySQL 데이터 베이스에 저장해보기!!

#14 파이썬을 이용하여 데이터베이스로부터 정보를 가져오기 && 스팀코인판 3대풀 임대내역 데이터베이스 작업 완료!!

#15 웹 프로그래밍을 이용하여 스팀코인판 3대조합의 임대 내역을 웹으로 확인해보자 !!

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

#17 조합들이 필요한 기능 드디어 완성!! 자동 클레임과 자동 분배 기능!!

#18 스팀코인판 3대 조합의 임대내역과 실시간 예상 분배 금액을 웹으로 확인해보자!!

#19 어제 만든 프로그램 업그레이드!! 개별 상세내역보기 기능 추가!!

#20 시행착오... 그리고 시련... 하지만 원사마님 덕분으로 엄청난 레벨업!! 감사합니다. 더욱 발전하겠습니다.

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

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

#23 스팀코인판의 소각글의 정보를 가지고 와서 자동보팅을 해보자!! 그 두번째 시간 (2/N)

#24 스팀코인판 3대조합의 임대내역을 웹으로 확인해보자!! 업그레이드!!

#25 스팀코인판 3대조합의 임대내역을 웹으로 확인해보자!! 업그레이드 2!! 그리고 개발 예정 사항 공개!!

#26 드디어 첫 실전 가동 준비중... 스팀코인판 유니온 조합의 수익 자동분배 작업 완료중...

#27 스팀코인판 유니온 조합 첫 자동 분배 결과!! 그리고 보완!!

#28 스팀코인판 유니온 조합 자동 분배 프로그램의 결과를 웹으로 확인해 보자!!

#29 스팀코인판 유니온 조합 자동 분배 상황을 텔레그램으로 확인!! 임내 확인 페이지 정렬 기능 추가!!

#30 스팀코인판 조합의 임대량 페이지 정렬 기능 업그레이드!! 그리고 임대량 파이 차트 완성!!

#31 스팀코인판 조합의 하루하루 임대량 변화를 차트로 확인해보자!!

#32 트리플A를 이용하면서 그동안 번거로웠던 클레임 스테이킹 전송 작업 이젠 안녕!! 자동으로 AAA를 전송하고 클레임하고 스테이킹을 해보자!!

#33 굳헬로가 만든 스팀코인판 조합 자동 클레임과 자동 분배 프로그램 원피스 조합에도 사용 개시!!

#34 스팀코인판 조합 원피스 자동 클레임과 자동 분배 프로그램 업그레이드!! 텔레그램 봇으로 그룹 메시지를 받아보자!!

#35 스팀에서 새글 정보를 텔레그램으로 받아보자!! 함께 정보를 받아보는 텔레그램 그룹방 개설!!

#36 스팀엔진 블록 검사 놓치는 블록이 없도록 해보자!! 파일 입출력 기능 활용!!

#37 스팀엔진 블록을 검사하여 본인글의 댓글을 텔레그램 알람으로 받아보자!!

#38 드디어 완성!! 보팅 알람봇!! 스팀엔진 블록을 검사하여 본인글에 보팅이 찍히면 텔레그램 알람으로 받아보자!!

#39 파이썬과 텔레그램을 이용한 챗봇 프로그래밍의 시작!! 그 첫번째!! 챗봇과 대화를 해보고,특정 메시지에 반응을 해보자!!

#40 파이썬과 텔레그램을 이용한 챗봇 프로그래밍!! 파이썬에 CommandHandler를 사용하여 특정 명령어를 내려보자!!

#41 굳헬로의 텔레그램 보팅알람 서비스 일단은 완성!! 앞으로 다양한 기능 추가 예정!! 사용해보고 후기 남겨주세요!!

#42 업비트의 원화 마켓 코인들의 시세를 텔레그램으로 받아보자!! /get 비트코인, /get 스팀, /get 코인이름 명령어 등록!!

#43 업비트의 원화 마켓 코인들의 시세를 텔레그램으로 받아보자2!! 알려줘 비트코인, 알려줘 스팀 노노!! 이제 바로 비트코인 스팀 명령어 등록!!

#44 매일 매일 새로운 기능이 추가되고 있는 굳스팀 챗봇!! 챗봇을 이용하여 스팀엔진 토큰의 시세 정보를 받아보자!!

#45 텔레그램 챗봇을 이용하여 최신 코인 주요 뉴스를 받아보자!! 굳스팀 챗봇 소개!!

#46 굳스팀 텔레그램 챗봇 새 기능 추가!! 굳스팀 챗봇을 이용하여 최신 헤드라인 뉴스 정보를 받아보자!!

#47 뉴스를 구독해보자!! 명령어 입력없이 특정 시간 챗 봇이 뉴스를 자동으로 보내 드립니다.

#48 본격적으로 스팀코인판 조합의 자동 보팅시스템 제작 돌입!! 기본 설계 및 보팅 설정 페이지 작업 완료!!

#49 스팀코인판 조합의 자동 보팅시스템 제작 2번째 시간!! 보팅 설정에 따라 각 조합원 별로 보팅룰을 적용해 보자!!

#50 스팀코인판 조합의 자동 보팅시스템 제작 3번째 시간!! 설 정된 보팅룰을 파이썬 자동 보팅 프로그램에 가져오기!!

#51 스팀코인판 조합의 자동 보팅시스템 제작 4번째 시간!! 블록을 검사하여 설정된 보팅룰로 보팅하기!!

#52 스팀코인판 조합의 자동 보팅시스템 제작 5번째 시간!! 자동 보팅시스템 테스트 현황!! 굳!! 따봉~~

#53 스팀코인판 조합의 자동 보팅시스템 제작 6번째 시간!! 보팅룰 검사 프로그램과 자동 보팅 프로그램의 분리!!

#54 스팀코인판 조합의 자동 보팅시스템 제작 마지막 시간!! 드디어 실전 가동!! 오류 수정 및 보팅 현황 확인 웹 페이지 제작 완료!!

#55 이번에는 유니온 조합의 자동보팅 시스템을 만들어 보자!! 유니온 조합의 보팅설정 프로그램과 보팅 설정 결과 확인 기능 완료!!

#56 스팀 블록을 검사하여 유니온 조합의 조합원 글에 보팅 룰셋 적용 및 자동 보팅 수행!!

#57 유니온 조합 우량 임대자 우대 조치!! 특별 규칙에 따른 보팅 설정 적용!!

#58 유니온 조합 자동 보팅 프로그램 테스트 결과 성공!! 보팅 현황을 확인할 수 있는 웹 페이지 추가 완료!!

Sort:  

jcar토큰 9월 구독 보팅입니다.
좋은 하루 보내세요. ^^

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.

Which bots are they abusing?

Hi @goodhello!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 4.012 which ranks you at #3993 across all Steem accounts.
Your rank has not changed in the last three days.

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

Evaluation of your UA score:
  • Some people are already following you, keep going!
  • The readers like your work!
  • Try to work on user engagement: the more people that interact with you via the comments, the higher your UA score!

Feel free to join our @steem-ua Discord server

Congratulations @goodhello! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You published a post every day of the week

You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Vote for @Steemitboard as a witness to get one more award and increased upvotes!

스몬 자동화 완전 대박일 것 같아요. ㅎㅎㅎ

Coin Marketplace

STEEM 0.25
TRX 0.11
JST 0.032
BTC 61041.41
ETH 2947.17
USDT 1.00
SBD 3.85