마켓에 매물로 나와 있는 카드 중 소각 가능한 카드를 자동으로 매수하는 프로그램을 만들어 봅니다.
팔 카드를 찾는 코드는 일전에 만든 마켓에 있는 카드를 읽어서 종류 별로 저가 부터 출력해주는 부분을 활용하면 됩니다.
기존 코드는 단순히 카드 가격만 출력해주었는데, 이번에는 카드를 매수해야하기 때문에 steem 계정을 연동하는 부분이 추가되었습니다.
마켓에 있는 매물 정보를 받아온 후 오름차순으로 정리한 카드 정보가 slist에 들어있습니다. 여기에 있는 카드들을 한 장씩 보면서 카드 종류 별로 최저 매수가에 마진(현재 3%)을 추가한 가격보다 낮은 경우에 매수를 하는 코드입니다.
for cd in slist :
ty = types[cd[1][1]]
if (cd[4] < min_price[ty] * MARGIN) :
print("buy : ", types[cd[1][1]], cd[4], format(cd[1][0], "20s"))
self.buyCard(cd)
break
실제 매수는 peakmonsters에게 살 카드의 market_id와 금액을 전달해 주면 됩니다. beem에 있는 transfer() api를 사용하였습니다.
def buyCard(self, card):
memotext = "sm_market_purchase:" + card[5] # + "-0"
ret = self.stm_account.transfer('peakmonsters', card[4], "STEEM", memotext)
스팀d에서 확인을 해보니 원하는 형태로 전달이 되었군요.
스몬카드 마켓에도 저가 카드를 매수하는 봇들이 많습니다. 방금 소개한 방식을 조금만 응용을 하면 저가 카드 매수 봇도 만들 수 있을 것 같습니다.
카드 구매와 관련하여 중요한 부분 코드를 올립니다.
def buy_cards_within_condition(self) :
global MIN_PRICES
slist, sglist = get_cards_price(1,0) # (print_all = 1, from file = 1)
min_price = MIN_PRICES['general_beta_rewards']
buying = []
cnt = 1
# cd = [id, [name, rarirty(카드종류)], 가격(str), 0, 가격(float)]
# common or intersting card
print('common : less than ', min_price['common'] * MARGIN)
print('rare : less than ', min_price['rare'] * MARGIN)
print('epic : less than ', min_price['epic'] * MARGIN)
print('leg : less than ', min_price['leg'] * MARGIN)
types = {1:'common', 2:'rare', 3:'epic', 4:'leg'}
for cd in slist :
ty = types[cd[1][1]]
if (cd[4] < min_price[ty] * MARGIN) :
print("buy : ", types[cd[1][1]], cd[4], format(cd[1][0], "20s"))
self.buyCard(cd)
break
# cd[4] price, [5] market_id,
def buyCard(self, card):
memotext = "sm_market_purchase:" + card[5] # + "-0"
# self.stm.transfer('peakmonsters', amount=card[4], asset="STEEM", memo=memotext, account=self.account_name)
ret = self.stm_account.transfer('peakmonsters', card[4], "STEEM", memotext)
print('bought')