class Upvote(Keys): def __init__(self): self.s = Steem(keys=self.keys_list) def upvote(self, weight, identify): post = Post(post=identify, steemd_instance=self.s) voters_list = self.voters(identify) voted = {} for username in self.keys_username: try: post.vote(weight, username) voted[username] = { "status": True, "weight": weight, "not": "voted" } except: if username in voters_list: voted[username] = { "status": False, "weight": weight, "not": "already voted" } else: voted[username] = { "status": False, "weight": weight, "not": "Unknown" } return voted def voters(self, identify): author, permlink = identify.split("/")[4:] return [ i["voter"] for i in self.s.get_active_votes(author.replace("@", ""), permlink) ]
from steem import Steem import random #create steem instance s = Steem() #set your username #my username as example user = '******' #set the link to your post #my previous post for example postLink = 'getting-started-with-steem-python-upvote-and-comment-bot-examples-linux' #get all the people who voted on the post voters = s.get_active_votes(user, postLink) #create a list of all the voters voterList = [user['voter'] for user in voters] #get a list of all the people who reblogged the post reblogs = s.get_reblogged_by(user, postLink) #get of your follower count followerCount = s.get_follow_count(user)['follower_count'] #retrieve all your followers names followers = s.get_followers(user, 0, 'blog', followerCount) #create a list of all your followers followerList = [follower['follower'] for follower in followers] #create a list of all the people who voted, reblogged and followed you potentialWinnerList = [] for potentialWinner in voterList: if potentialWinner in reblogs and potentialWinner in followerList: #user is following us and reblogged our post so lets add them to the list
class GuideDog: log = logging.getLogger(__name__) def __init__(self, config, db): self.config = config self.db = db keypath = os.path.expanduser(self.config['keyfile_path']) with open(keypath) as key_file: key_file_json = json.load(key_file) self.steem = Steem(keys=key_file_json['krguidedog']) self.message1 = readFile(self.config['guidedog']['mild_warning_file']) self.message2 = readFile( self.config['guidedog']['moderate_warning_file']) self.message3 = readFile(self.config['guidedog']['hard_warning_file']) self.copyright = readFile(self.config['guidedog']['copyright_file']) self.copyright_eng = readFile( self.config['guidedog']['copyright_file_eng']) self.last_daily_report = None self.daily_report_generator = Publisher(self.db) self.daily_report_timestamp = None def claim_reward(self): self.steem.claim_reward_balance(account='krguidedog') def reputation(self, number, precision=2): rep = int(number) if rep == 0: return 25 score = max([math.log10(abs(rep)) - 9, 0]) * 9 + 25 if rep < 0: score = 50 - score return round(score, precision) def create_post(self, post_id, body, author='krguidedog'): comment = self.steem.commit.post(title='', body=body, author=author, permlink=None, reply_identifier=post_id, json_metadata=None, comment_options=None, community=None, tags=None, beneficiaries=None, self_vote=False) post_item = comment['operations'][0][1] post_id = '@%s/%s' % (post_item['author'], post_item['permlink']) limit = 3 while True: sleep(1) try: double_check = Post(post_id) return comment except Exception as e: limit -= 1 if limit == 0: raise 'Posting check failure' else: self.log.info( 'Failed to confirm the post creation. retry ' + limit) def vote(self, post_id, power, voter): try: self.steem.commit.vote(post_id, power, voter) self.log.info('%s voted on %s with %s percentage' % (voter, post_id, power)) except Exception as e: self.log.info("Failed to vote: " + str(e)) pass def transfer(self, send_to, amount, memo): try: self.steem.commit.transfer( to=send_to, amount=amount, asset='SBD', account=self.config['guidedog']['account'], memo=memo) self.log.info('Transferred %s to %s: %s' % (amount, send_to, memo)) except Exception as e: self.log.info("Failed to transfer: " + str(e)) raise def resteem(self, post_id, resteemer): try: self.steem.commit.resteem(post_id, resteemer) self.log.info('Resteemed %s by %s' % (post_id, resteemer)) except Exception as e: self.log.info("Failed to resteem: " + str(e)) pass def daily_report(self): last_daily_report = None try: with open("db/daily_report", "r") as f: last_daily_report = f.read().splitlines()[0] except: self.log.info('Failed to read daily_report file!!') return try: theday = datetime.now() - timedelta(days=1) if last_daily_report == theday.strftime("%d %b %Y"): # Already created until the last available day return newday = datetime.strptime(last_daily_report, "%d %b %Y") + timedelta(days=1) result = self.daily_report_generator.generate_report( newday.strftime("%d %b %Y")) if result == None: self.log.info('No activiey is found in ' + newday.strftime("%d %b %Y")) else: self.log.info('Creating a daily report for ' + newday.strftime("%d %b %Y")) comment_options = { 'max_accepted_payout': '0.000 SBD', 'percent_steem_dollars': 0, 'allow_votes': True, 'allow_curation_rewards': True, 'extensions': [] } comment = self.steem.commit.post(title=result['title'], body=result['body'], author='krguidedog', permlink=str(uuid.uuid4()), reply_identifier=None, json_metadata=None, comment_options=None, community=None, tags='kr krguidedog antispam', beneficiaries=None, self_vote=False) # All succeeded. Update the last report day with open("db/daily_report", "w") as f: f.write(newday.strftime("%d %b %Y")) except Exception as e: self.log.info(e) self.log.info('Failed to create a daily report for ' + newday.strftime("%d %b %Y")) #traceback.print_exc(file=sys.stdout) return def work(self): data = self.db.queue_get('post') if data: try: self.handle_post(data['data']) self.db.queue_finish('post', data) except Exception as e: self.log.error('Failed: post (will retry)') self.log.error(data) self.log.error(e) data = self.db.queue_get('vote') if data: try: self.log.info(data) voting = data['data'] self.vote(voting['post_id'], voting['power'], voting['voter']) self.db.queue_finish('vote', data) except Exception as e: self.log.error('Failed: vote (will retry)') self.log.error(data) self.log.error(e) data = self.db.queue_get('transfer') if data: try: transfer = data['data'] self.transfer(transfer['send_to'], transfer['amount'], transfer['memo']) self.db.queue_finish('transfer', data) except Exception as e: self.log.error('Failed: transfer (will retry)') self.log.error(data) self.log.error(e) data = self.db.queue_get('resteem') if data: try: resteem = data['data'] self.resteem(resteem['post_id'], resteem['resteemer']) self.db.queue_finish('resteem', data) except Exception as e: self.log.error('Failed: resteem (will retry)') self.log.error(data) self.log.error(e) self.daily_report() # Prevent wasting the donated funds #self.claim_reward() def handle_post(self, post): self.log.info( "New Command [%s -> %s -> %s] : %s" % (post['author'], post['bot_signal'], post['parent_author'], post)) if post['signal_type'] == 'spam': if self.db.is_reported(post): self.log.info('Skip request: already reported') return rep = self.reputation( self.steem.get_account(post['author'])['reputation']) if rep < 35: self.log.info('Skip request: reputation is too low (%s, %s) ' % (post['author'], rep)) return self.process_spam( post, self.db.get_reported_count(post['parent_author']) + 1) elif post['signal_type'] == 'praise': if self.db.is_already_consumed_comment(post): self.log.info('Skip request: already consumed comment') return point = self.db.get_usable_point(post['author']) self.log.info('Praise request - user: %s point: %s' % (post['author'], point)) if post['author'] in self.config["praise_curator"]: self.leave_praise(post) elif point >= 1: self.leave_praise(post) self.db.use_point(post['author'], 1) else: self.log.info('Not enough point! %s %s' % (post['author'], point)) # self.send_no_point_alarm(post) elif post['signal_type'] == 'promote': if self.db.is_promoted(post): self.log.info('Skip request: already promoted') return point = self.db.get_usable_point(post['author']) self.log.info('Promote request - user: %s point: %s' % (post['author'], point)) if post['author'] in self.config["promote_curator"]: self.promote(post) elif point >= 1: self.promote(post) self.db.use_point(post['author'], 1) else: self.log.info('Not enough point! %s %s' % (post['author'], point)) self.send_no_point_alarm(post) elif post['signal_type'] == 'welcome': if post['author'] not in self.config["welcome_curator"]: self.log.info('Skip request: Not allowed user') return if self.db.is_welcomed(post): self.log.info('Skip request: already welcomed') return rep = self.reputation( self.steem.get_account(post['parent_author'])['reputation']) if rep > 50: self.log.info( 'Skip request: reputation is too high (%s, %s) ' % (post['parent_author'], rep)) return self.log.info('Welcome %s (%s)!' % (post['parent_author'], rep)) self.welcome(post) else: pass def generate_warning_message(self, post, reported_count): if post['bot_signal'] == "@저작권안내": greet = ('저작권 안내입니다.' if reported_count <= 1 else '%s 번째 안내입니다.' % reported_count) greet_eng = ('this is the %s copyright warning.' % ordinal(reported_count)) lines = [ 'https://i.imgur.com/2PPRCJq.png', '#### Hey @%s, %s' % (post['parent_author'], greet_eng) ] lines.extend(self.copyright_eng) lines.append('---') lines.append('#### 안녕하세요 @%s님, %s' % (post['parent_author'], greet)) lines.extend(self.copyright) return '\n'.join(lines) else: if reported_count <= 5: greet = ('Nice to meet you!' if reported_count <= 1 else 'We have met %s times already!' % reported_count) lines = [ sys_random.choice(self.config['guidedog']['mild_photo']), '## Woff, woff!', '#### Hello @%s, %s' % (post['parent_author'], greet) ] lines.extend(self.message1) return '\n'.join(lines) elif reported_count <= 10: greet = ('We have met %s times already!' % reported_count) lines = [ sys_random.choice( self.config['guidedog']['moderate_photo']), '#### Hello @%s, %s' % (post['parent_author'], greet) ] lines.extend(self.message2) return '\n'.join(lines) else: greet = ('We have met %s times already!' % reported_count) lines = [ sys_random.choice(self.config['guidedog']['hard_photo']), '#### Hey @%s, %s' % (post['parent_author'], greet) ] lines.extend(self.message3) return '\n'.join(lines) def vote_on_post(self, post, supporters): post = post['operations'][0][1] self.supporters_vote(post['author'], post['permlink'], supporters) def supporters_vote(self, author, permlink, supporters): votes = self.steem.get_active_votes(author, permlink) voters = set() for vote in votes: voters.add(vote['voter']) for supporter in supporters: # Skip already voted supporters if not supporter['account'] in voters: voting_power = self.steem.get_account( supporter['account'])['voting_power'] if voting_power > supporter['voteOver']: self.db.queue_push( 'vote', { 'power': supporter['weight'], 'post_id': '@%s/%s' % (author, permlink), 'voter': supporter['account'] }) else: self.log.info('%s already voted' % supporter) def process_spam(self, post, reported_count): my_comment = self.create_post( post['parent_post_id'], self.generate_warning_message(post, reported_count)) self.db.store_report(post) self.vote_on_post(my_comment, self.config['spam_supporters']) if reported_count > 10: self.supporters_vote(post['parent_author'], post['parent_permlink'], self.config['spam_downvoters']) def generate_benefit_message(self, post): reward = "0.4 SBD" rt = [ '멋진', '섹시한', '훈훈한', '시크한', '알흠다운', '황홀한', '끝내주는', '요염한', '흥분되는', '짱재밌는', '잊지못할', '감동적인', '배꼽잡는', '러블리한', '쏘쿨한', '분위기있는' ] pet = sys_random.choice(self.config['guidedog']['pets']) pet_name = '<a href="/%s">%s</a>' % (pet['parent'], pet['name']) pet_photo = sys_random.choice(pet['photo']) if post['bot_signal'] == '@칭찬해': msg = ( '%s @%s님 안녕하세요! %s 입니다. %s @%s님 소개로 왔어요. 칭찬이 아주 자자 하시더라구요!! ' '%s 글 올려주신것 너무 감사해요. 작은 선물로 %s를 보내드립니다 ^^' % (sys_random.choice(rt), post['parent_author'], pet_name, sys_random.choice(rt), post['author'], sys_random.choice(rt), reward)) elif post['bot_signal'] == '@축하해': msg = ( ('%s @%s님 안녕하세요! %s 입니다. %s @%s님이 그러는데 정말 %s 일이 있으시다고 하더라구요!! ' '정말 축하드려요!! 기분좋은 날 맛좋은 ' + sys_random.choice(['개껌 하나', '개밥 한그릇', '개뼈다구 하나']) + ' 사드시라고 %s를 보내드립니다 ^^') % (sys_random.choice(rt), post['parent_author'], pet_name, sys_random.choice(rt), post['author'], sys_random.choice(rt), reward)) elif post['bot_signal'] == '@감사해': msg = ( '%s @%s님 안녕하세요! %s 입니다. %s @%s님이 너무너무 고마워 하셔서 저도 같이 감사드리려고 이렇게 왔어요!! ' '%s 하루 보내시라고 %s를 보내드립니다 ^^' % (sys_random.choice(rt), post['parent_author'], pet_name, sys_random.choice(rt), post['author'], sys_random.choice(rt), reward)) elif post['bot_signal'] == '@위로해': msg = ( ('@%s님 안녕하세요. %s 입니다. @%s께 이야기 다 들었습니다. ' + sys_random.choice( ['세상사 다 그런것 아닐까요?. ', '인생지사 새옹지마라고 하잖아요. ']) + '힘든일이 있으면 반드시 좋은일도 있대요! 기운 내시라고 %s를 보내드립니다.') % (post['parent_author'], pet_name, post['author'], reward)) elif post['bot_signal'] == '@홍보해': msg = (( '@%s님 안녕하세요. %s 입니다. @%s님이 이 글을 너무 좋아하셔서, 저에게 홍보를 부탁 하셨습니다.' + ' 이 글은 @krguidedog에 의하여 리스팀 되었으며, 가이드독 서포터들로부터 보팅을 받으셨습니다. 축하드립니다!' ) % ( post['parent_author'], pet_name, post['author'], )) msg = ('<table><tr><td>%s</td><td>%s</td></tr></table>' % (pet_photo, msg)) return msg def leave_praise(self, post): my_comment = self.create_post(post['parent_post_id'], self.generate_benefit_message(post)) self.db.store_praise(post) self.vote_on_post(my_comment, self.config['praise_supporters']) # Push transfer to queue self.db.queue_push( 'transfer', { 'send_to': post['parent_author'], 'amount': 0.4, 'memo': '@%s 님께서 가이드독 활동을 통해 모은 포인트로 감사의 표시를 하였습니다.' '해당 글을 확인해 주세요! https://steemit.com/%s' % (post['author'], post['parent_post_id']) }) def promote(self, post): my_comment = self.create_post(post['parent_post_id'], self.generate_benefit_message(post)) self.db.store_promote(post) self.vote_on_post(my_comment, self.config['praise_supporters']) self.db.queue_push( 'resteem', { 'post_id': post['parent_post_id'], 'resteemer': self.config['guidedog']['account'] }) self.supporters_vote(post['parent_author'], post['parent_permlink'], self.config['promotion_supporters']) def welcome(self, post): # Message message = [ "### @%s님 스팀잇에 오신것을 환영합니다!" % post['parent_author'], "스팀잇 정착을 도와드리기 위하여 @%s님의 부탁을 받고 찾아온 @easysteemit 입니다. 힘찬 출발을 응원하는 의미로 서포터 보팅을 해드립니다." % post['author'], "", "### [이지스팀잇]", "@easysteemit은 처음에는 낮설고 복잡해 보일수 있는 스팀잇을 더욱 쉽게 접할수 있도록 만들어진 스팀잇 안내서입니다. @easysteemit 을 팔로우하시고 필요한 것들을 하나하나 익혀보세요! 스팀잇 활동이 더욱 더 즐거워질거에요 :)", "", "<a href='/@easysteemit'><img src='https://steemitimages.com/300x0/https://steemitimages.com/DQmZmqw2L61Rrnvy92WAH5xSnn3Ud1ZcMJWWFcff141DPqV/daemoon.png'></a>" ] # Process my_comment = self.create_post(post['parent_post_id'], '\n'.join(message), 'easysteemit') self.db.store_welcome(post) self.supporters_vote(post['parent_author'], post['parent_permlink'], self.config['welcome_supporters']) def send_no_point_alarm(self, post): memo = '가이드독 포인트가 부족합니다. 스팸글 신고를 통해 포인트를 쌓아주세요. 자세한 정보는 다음 링크에서 확인해 주세요. https://steemit.com/kr/@asbear/33kqka-kr' self.db.queue_push('transfer', { 'send_to': post['author'], 'amount': 0.001, 'memo': memo })
import pprint from pick import pick # initialize Steem class from steem import Steem s = Steem() query = { "limit":5, #number of posts "tag":"" #tag of posts } #post list for selected query posts = s.get_discussions_by_active(query) title = 'Please choose post: ' options = [] #posts list for post in posts: options.append(post["author"]+'/'+post["permlink"]) # get index and selected filter name option, index = pick(options, title) # posts[index] would also have active voters info # but in this tutorial we are showing usage of get_active_votes of post where author and permlink is known/selected voters = s.get_active_votes(posts[index]["author"],posts[index]["permlink"]) # print post details for selected post pprint.pprint(voters) pprint.pprint("Selected: "+option)
from steem import Steem s = Steem() def get_payout_from_votes(votes): fund_per_share = reward_balance / float(recent_claims) total_reward = 0 for vote in votes: rshares = vote["rshares"] payout = float(rshares) * fund_per_share * base_price total_reward += payout return total_reward reward_fund = s.get_reward_fund() reward_balance = float(reward_fund["reward_balance"].split(' ')[0]) recent_claims = float(reward_fund["recent_claims"]) base_price = float(s.get_current_median_history_price()["base"].split(' ')[0]) author = 'antonsteemit' permlink = 'kura-sushi' votes = s.get_active_votes(author, permlink) total_payout = get_payout_from_votes(votes) print(total_payout)
account_postkey = sys.argv[3] vote_weight = sys.argv[4] s = Steem("https://api.steemit.com", keys=[account_postkey]) target_post = {} history = s.get_account_history(target_username, index_from=-1, limit=1000) for operation in reversed(history): op = operation[1]['op'] if op[0] == 'comment': if op[1]['parent_author'] == '': _permlink = op[1]['permlink'] # Check if the Post has already been upvoted by my account if account_name in [ v["voter"] for v in s.get_active_votes(target_username, _permlink) ]: print("Already voted on this. Skipping... {}".format( op[1]['title'])) continue # Save target vote in a dictionary structure target_post["permlink"] = _permlink target_post["title"] = op[1]['title'] target_post["identifier"] = '@{}/{}'.format( target_username, target_post["permlink"]) print('Target Post: {}'.format(target_post["identifier"])) upvote(account_name, target_post, 5) break
# variables ACCOUNT_NAME = 'jjb777' POST_NAME = 'check-your-followers-with-steem-python' # from https://steemd.com/ reward_balance = 689021.232 #steem recent_payouts = 253293929348078529 #rshares steem_price = 1.327 rshares_sdb_value = steem_price * (reward_balance / recent_payouts) print(reward_balance) print(recent_payouts) print(rshares_sdb_value) # start code voters = s.get_active_votes(ACCOUNT_NAME, POST_NAME) file = open('upvoters_post_{}_{}.html'.format(ACCOUNT_NAME, timestamp), 'w') file.write( '<html><body><table><tr><th>account</th><th>percent</th><th>upvote</th><th>time</th><tr>' ) file.write( '<h3>Upvoters of post <a href="https://steemit.com/@{}/" target="blank">{}</a> - {}</h3>' .format(ACCOUNT_NAME, ACCOUNT_NAME, POST_NAME, timestamp)) count_sdb = 0.0 for voter in voters: name = voter['voter'] percent = voter['percent'] rshares = voter['rshares']