ย ย ํ์ด ๋ฏธ๋์ ๋-๋ชจ, ๋ฒ์ธ์ผ ์คํฐ๋ฏธ์ธ ๋ง์๋ ์
๋๋ค (ํ์ ) . ์์ผ๋ก python์ ์ด์ฉํ์ฌ steem๊ณผ ๊ด๋ จ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ , ๋ง๋๋ ๊ณผ์ ์ ์๊ฐํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ๋ํ, ์์ผ๋ก ์์ฑํ ์ฝ๋ฉ ํฌ์คํธ ์๋ฆฌ์ฆ๋ฅผ '์ฝ๋ฉ๋ชฐ๋ผ์ฌ' ๋ก ์ด๋ฆ ๋ถ์ด๊ธฐ๋ก ํ์ต๋๋ค. ์๋ ์ผ์ ์ณ๋ค๋ณด๊ธฐ ์ซ์ ๋ฒ์ด๋๊น์. 'ใ
'b
โฒ ์ด๋ฐ ๋๋. (์ด๊ฒ๋ ํ์ )
๊ทธ๋ผ ํ์ด ์๋ฉ ๋ค์ด๊ฐ ์ฒซ ํธ! ๋น ๋ฅด๊ฒ ์์ํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ํ๊ฒฝ ์ค์ ์ ์ด ํฌ์คํธ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
ย ย ์ด์ Anaconda Prompt๋ฅผ ์ด๊ณ , ๋ง๋ค์ด๋ ๊ฐ์ ํ๊ฒฝ์ activateํ๊ณ , ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ฒ์ ์ต์ํด์ง์ จ์ผ๋ ค๋์? ^^ steem-python์ ์ค์น๋ ์ผ๋ง ์ ๊น์ง ๊ณ ํต์ค๋ฌ์ ์ง๋ง ์ต๊ทผ์ ๊ฐ๋จํด์ก์ต๋๋ค. Anaconda Prompt์์ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.
conda install -c conda-forge steem
y
์ฒซ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ์ค์นํ ๊ฑด์ง ๋ฌผ์ด๋ณด๋ ๋ฉ์ธ์ง๊ฐ ๋์ค๋๋ฐ y๋ ๊ทธ ๋ ์ ์ด์ฃผ์๋ฉด ๋ฉ๋๋ค. ์ค์น์๋ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆฌ๋ ๊ธฐ๋ค๋ ค์ฃผ์ธ์. ์ด๊ฒ ๋์
๋๋ค. ๊ฐ๋จํ์ฃ ?
ย ย pycharm์ ์คํํด์ ์์ ์ด ์คํ ๋ฌ๋ฌ๋ฅผ ์ผ๋ง๋ ๊ฐ์ง๊ณ ์๋์ง ์ถ๋ ฅํ๋ ๊ฒ์ผ๋ก ํจํค์ง๊ฐ ์ ์ค์น๋์๋์ง ํ์ธํด๋ด ์๋ค.
์ฝ๋
from steem import Steem
s = Steem()
print(s.get_account('maanya')['sbd_balance'])
๊ฒฐ๊ณผ
12.039 SBD
ย ย ์ ๋ 12.039 SBD๋ฅผ ๊ฐ์ง๊ณ ์๋ค์. maanya ๋์ ์ ์ฌ๋ฌ๋ถ๋ค์ ๊ณ์ ๋ช ์ ์ ๋ ฅํ๋ฉด ์ฌ๋ฌ๋ถ๋ค์ ์คํ ๋ฌ๋ฌ๊ฐ ์ผ๋ง๋ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. get_account๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์๋ ์ ๋ณด๊ฐ ๋ฌด์์ด ์๋์ง ํ์ธํ๋ ค๋ฉด ['sbd_balance'] ๋ฅผ ๋นผ๊ณ ์คํํด๋ณด๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ผ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ป์ด์ฌ ์ ์์ต๋๋ค.
ย ย ์คํ์ ์ธ์์ ๋ฌด์์ด ์ธ์์ ๋๋ค. ๋ชจ๋ ํ๋์ ๋ค์์์ ๋ณผ ์ ์์ต๋๋ค. ํ์ค์ ์์ ๊ณผ ์ฐ๊ฒฐ์ ์ด ์๋๋ก ์กฐ์ฌํฉ์๋ค. ๊ทธ๋์ ์ ๊ฐ ๋ฒ์ธ์ผ ์คํฐ๋ฏธ์ธ์ ์งํฅ ์ค์ ๋๋ค.
ย ย ์ผ์ ์ @wanabe ๋๊ป์ ๋ณดํ
ํ์๊ฐ 99.5% ์ด์์ด ๋์์ ๋ ์๋ ค์ฃผ๋ ์ฑ๋ด์ ๊ตฌํํ๋๊ฑด ์ด๋จ์ง ์ด์ผ๊ธฐํด์ฃผ์
จ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. :D
ย ย ๊ฐ๋จํ๋ get_account์ ์ ๋ณด ์์ voting_power ๊ฐ ์์ต๋๋ค. ์ ์ ๊ฐ์ผ๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ 100์ผ๋ก ๋๋ ์ฃผ๋ฉด ๊ตฌํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ํด๋์ค์ธ steem.account์๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ์ฐ์ถํฉ๋๋ค.
print(float(s.get_account('maanya')['voting_power']) / 100.0)
ย ย ๊ฒฐ๊ณผ๋ฅผ steemd.com ์์ ํ์ธํด๋ณด๋ฉด... ๊ฐ์ด ๋ค๋ฆ ๋๋ค. busy์ steemd์์ ํ์ธ๋๋ ๋ด Voting Power๋ ๊ฐ์๋ฐ API๋ฅผ ํตํด ๊ตฌํด๋ณด๋ ๊ฐ์ด ๋ค๋ฆ ๋๋ค. ํน์๋ ํด์ Voting Power๊ฐ 100%์ธ ๊ณ์ ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์ต๋ ๊ฐ์ด 9,800์ ๋๋ค. ๋จ์ํ ์๊ฐํ๋ฉด 10,000์ด์ด์ผํ๋๋ฐ์. ๊ทธ๋์ 9,800์ผ๋ก ๋๋์ด๋ด๋ ๊ฐ์ด ์ฐจ์ด๊ฐ ๋ฉ๋๋ค.
ย ย ๊ทธ๋์ ๋ค๋ฅธ ๊ณ์ฐ ๊ณต์์ ์ฐพ์๋ค๋๋ ์ค, ์๋์ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
from dateutil.parser import parse
from datetime import datetime
def get_voting_power(account_data):
last_vote_time = parse(account_data["last_vote_time"])
diff_in_seconds = (datetime.utcnow() - last_vote_time).seconds
regenerated_vp = diff_in_seconds * 10000 / 86400 / 5
total_vp = (account_data["voting_power"] + regenerated_vp) / 100
if total_vp > 100:
return 100
return "%.2f" % total_vp
ย ย ๊ฐ์๊ธฐ ์ฝ๋๊ฐ ๋ณต์กํ๊ฒ ๋ณด์ด๋์? ์ฒ์ฒํ ๊ฐ์ด ์ดํด๋ด
์๋ค. ๋จผ์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ณดํ
ํ ์๊ฐ์ ๊ฐ์ ธ์ต๋๋ค (last_vote_time). ๊ทธ๋ฆฌ๊ณ ํ์ฌ ์๊ฐ๊ณผ ์ต๊ทผ์ ๋ณดํ
ํ ์๊ฐ์ ์ฐจ์ด๋ฅผ ์ด ๋จ์๋ก ๊ณ์ฐํฉ๋๋ค (diff_in_seconds). ์ด๋ฅผ ์ด์ฉํ์ฌ ์๊ฐ์ ๋ฐ๋ผ ํ๋ณต๋ ๋ณดํ
ํ์๋ฅผ ๊ณ์ฐํฉ๋๋ค (regenerated_vp). ๋ณดํ
ํ์๋ ํ๋ฃจ์ 2,000์ฉ ์ถฉ์ ๋๋ ๋ชจ์์ด๋ค์. ๊ณ์ ์ ๊ธฐ๋ก๋ ๋ณดํ
ํ์์ ์์ฑ๋ ๋ณดํ
ํ์๋ฅผ ๋ํด์ ํ์ฌ ๋ณดํ
ํ์ (total_vp) ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋ง์ฝ 100% ๊ฐ ๋๋ ๊ฒฝ์ฐ์ 100% ๋ผ๊ณ ํ๊ธฐํด์ฃผ๊ธฐ ์ํด ์กฐ๊ฑด๋ฌธ์ผ๋ก ์กฐ์ ํด์ฃผ์๋ค์.
ย ย ์ํ! ์ด๋ก์จ ๋ชจ๋ ์์๊ป๋ผ๊ฐ ํ๋ ธ์ต๋๋ค. ๋ณดํ ํ์๋ ์ต๋ 10,000๊น์ง ์ถฉ์ ๋๋๊ฒ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ API๋ก ๋ถ๋ฌ์จ ๋ณดํ ํ์์ ๋ํ ๊ธฐ๋ก์ ์ฐ๋ฆฌ๊ฐ ๋ณดํ ์ ํ์ ๋์ ๊ธฐ์ค์ผ๋ก ์ ์ฅ๋์ด์๋๊ฑฐ๊ตฐ์. ์ฐ๋ฆฌ๋ ๋ณดํ ํ ๋, (ํ๋ณดํ ๊ธฐ์ค) ํ์ฌ ๊ฐ์ง๊ณ ์๋ ๋ณดํ ํ์์ 2%๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ๋ณดํ ํ์๊ฐ 100%(10,000)์ผ ๋, ๋ณดํ ์ ํ๋ ์๊ฐ 2%(200)๊ฐ ์๋ชจ๋๋ฉด์ 98%(9,800)์ ๊ฐ์ด ๋ณด์๋ ๊ฒ์ด๊ตฐ์.
ย ย ์ ๋ฆฌํด์, ํ์ฌ ๋ณดํ ํ์๋ฅผ ๊ตฌํ๋ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
์ฝ๋
from steem import Steem
from dateutil.parser import parse
from datetime import datetime
def get_voting_power(account_data):
last_vote_time = parse(account_datat["last_vote_time"])
diff_in_seconds = (datetime.utcnow() - last_vote_time).seconds
regenerated_vp = diff_in_seconds * 10000 / 86400 / 5
total_vp = (account_data["voting_power"] + regenerated_vp) / 100
if total_vp > 100:
return 100
return "%.2f" % total_vp
s = Steem()
account = s.get_account('maanya')
print(get_voting_power(account))
๊ฒฐ๊ณผ
74.86
ย ย ํ์ฌ ๋ณดํ ํ์๋ฅผ ํ์ธํ๋ ๊ธฐ๋ฅ์ ์์๋ดค์ผ๋ ์ฑ๋ด์ ๊ธฐ๋ฅ์ผ๋ก ๋ฃ์ด๋ณผ๊น์? ์ ์ฑ๋ด์ธ ์น์ด์๊ฒ ํํํ ์ ๋ณดํ ํ์๋ฅผ ํ์ธํ๊ณ ๋ณดํ ํ์๊ฐ 99.5%๋ฅผ ๋์ผ๋ฉด ๋ฉ์ธ์ง๋ก ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
ย ย 'ํํํ ๋ณดํ ํ์๋ฅผ ํ์ธ' ํ๋ ๊ธฐ๋ฅ์ python์ timer๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํด์ผ ํฉ๋๋ค. 1์ด์ ๋ณดํ ํ์๊ฐ 0.23 ์ ๋ ์ถฉ์ ๋๋, ๋ณดํ ํ์ 1% ์ถฉ์ ์ ์ฝ 430์ด๊ฐ ํ์ํฉ๋๋ค. ํ์ธํ๋ ์๊ฐ๊ณผ ๋ณดํ ํ์๋ ์ทจํฅ์ ๋ฐ๋ผ ์ค์ ํด์ฃผ์ธ์. ๊ด์ฐฐํ์ค ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
chatbot.py
import sys
import ChatBotModel
import threading
from steem import Steem
from dateutil.parser import parse
from datetime import datetime
def proc_stop(bot, update):
chii.sendMessage('์น์ด ๋ด์ด ์ ๋ญ๋๋ค.')
chii.stop()
def get_voting_power(account_data):
last_vote_time = parse(account_data\["last_vote_time"])
diff_in_seconds = (datetime.utcnow() - last_vote_time).seconds
regenerated_vp = diff\_in_seconds * 10000 / 86400 / 5
total_vp = (account_data\["voting_power"] + regenerated_vp) / 100
if total_vp > 100:
return 100
return "%.2f" % total_vp
def alarm_vp():
s = Steem()
account = s.get_account('maanya')
vp = get\_voting\_power(account)
if vp > 99.5:
chii.sendMessage('๊ณ ์์ง์ฌ๋ง, ๋ณดํ
ํ์๊ฐ %.2f ์์.' % vp)
threading.Timer(5, alarm_vp).start()
threading.Timer(5, alarm_vp).start()
chii = ChatBotModel.BotChii()
chii.add_handler('stop', proc_stop)
chii.start()
ย ย ์ด๋ ๊ฒ ํ์ฌ [์ฝ๋ฉ๋ชฐ๋ผ์ฌ] ์ ์ฒซ ํธ! steem-python์ ์์๊ณผ ๋์ ๋ณดํ ํ์๋ฅผ ์ฑ๋ด์ผ๋ก ์๋ ค์ฃผ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ดค์ต๋๋ค. ๋น์ ๊ณต์๋ผ๋ ๋ฐ๋ผํด๋ณผ ์ ์๋๋ก ์๋ดํด๋๋ฆดํ ๋ ๊ฒ๋ด์ง ๋ง๊ณ ํด๋ณด์๊ธธ ๋ฐ๋๋๋ค. ๊ด๋ จ ์ง๋ฌธ์ ์ธ์ ๋ ๋๊ธ๋ก ๋ฌ์์ฃผ์ธ์. :D steem-python์ผ๋ก ์ด๋ฐ ๊ฒ๋ ๊ฐ๋ฅํด์? ํ๋ ๊ถ๊ธ์ฆ ๊ฐ์๊ฑธ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ์ ๋ฅ๋ ฅ์ด ๋๋ํ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ^^7
ย ย ์ฌ๋์ด ๊ฐ์ฅ ๋์ด๋ณด์ธ๋ค๋ ์์์ผ ์ ๋
์ด๋ค์. ์ฃผ๋ง๊น์ง ์ดํ ๋จ์์ผ๋ ๋ชจ๋ ํ๋ด์๊ธธ ๋ฐ๋ผ์ :D
๋ง์๋(@maanya) ์์ต๋๋ค.