How to build a steem-engine token upvote bot

in steem-engine •  20 days ago

I wrote yesterday about my new steemengine python library, which can be use to receive token balances and transfer history about every steem-engine token.

I'm now using this library to build a small upvote bot example.

In my example, @beembot is the upvoting account. When DRAGON token have been send to it, the account will upvote. There is a whitelist, so only whitelisted accounts will be upvoted. 1 DRAGON is one 100% upvote.


First I sent 1 DRAGON from @holger80 to @beembot with the url as memo:

The transfer succeeded:

and my post was upvoted:

How does it work

I chose the get_history function for receiving the token transfer history. It would be also possible to use getBlockInfo and go through all blocks of the sidechain. get_history seems to me as a simpler solution, so I used that.

get_history returns the last limit transfers. I implemented a check with last_steem_block to skip old blocks. It would be a good idea to store this value for the case that the script is stoped and started again.


pip install beem
pip install steemengine

and setup a beem wallet

beempy createwallet

add the posting key of the upvote account in the prompt:

beempy addkey


# This Python file uses the following encoding: utf-8
# (c) holger80
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from beem import Steem
from beem.comment import Comment
from beem.nodelist import NodeList
from steemengine.api import Api
import time

if __name__ == "__main__":
    nodelist = NodeList()
    stm = Steem(node=nodelist.get_nodes())
    api = Api()
    # edit here
    upvote_account = "beembot"
    upvote_token = "DRAGON"
    token_weight_factor = 100 # multiply token amount to get weight
    min_token_amount = 0.01
    max_post_age_days = 3
    whitelist = ["holger80"]
    blacklist_tags = []
    only_main_posts = True
    last_steem_block = 1950 # It is a good idea to store this block, otherwise all transfers will be checked again
    while True:
        history = api.get_history(upvote_account, upvote_token, limit=1000, offset=0, histtype='user')
        for h in history:
            if int(h["block"]) <= last_steem_block:
            if h["to"] != upvote_account:
            last_steem_block = int(h["block"])
            if len(whitelist) > 0 and h["from"] not in whitelist:
                print("%s is not in the whitelist, skipping" % h["from"])
            if float(h["quantity"]) < min_token_amount:
                print("Below min token amount skipping...")
                c = Comment(h["memo"], steem_instance=stm)
                print("%s is not a valid url, skipping" % h["memo"])
            if c.is_comment() and only_main_posts:
                print("%s from %s is a comment, skipping" % (c["permlink"], c["author"]))
            if (c.time_elapsed().total_seconds() / 60 / 60 / 24) > max_post_age_days:
                print("Post is to old, skipping")
            tags_ok = True
            if len(blacklist_tags) > 0 and "tags" in c:
                for t in blacklist_tags:
                    if t in c["tags"]:
                        tags_ok = False
            if not tags_ok:
                print("skipping, as one tag is blacklisted")
            already_voted = False
            for v in c["active_votes"]:
                if v["voter"] == upvote_account:
                    already_voted = True
            if already_voted:
                print("skipping, as already upvoted")
            upvote_weight = float(h["quantity"]) * token_weight_factor
            if upvote_weight > 100:
                upvote_weight = 100
            print("upvote %s from %s with %.2f %%" % (c["permlink"], c["author"], upvote_weight))
            c.upvote(weight=upvote_weight, voter=upvote_account)

Store the script as and run it by



This script is only an example for a possible use case for my python library. What do you think? Do you have a idea for which I should create a script? Let me hear.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Wow. Pretty cool. So all these tokens at least get some utility. :-) Will try to get it running for my JAR token too. :-)

check your wallet :)

This was very cool. Thanks for your work on it.


Great :)
Thanks a lot, I will keep improving my python library.

Ich schätze ich scheiße nun auf mein Abi und fang endlich an die Dinge, welche mich interessieren, zu lernen anstatt für Schule..

Z.b. Python

Hi @holger80!

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

In our last Algorithmic Curation Round, consisting of 255 contributions, your post is ranked at #1. Congratulations!

Evaluation of your UA score:
  • Your follower network is great!
  • The readers appreciate your great work!
  • Great user engagement! You rock!

Feel free to join our @steem-ua Discord server

These is really great. But that means the upvote bot must also have a lot of sp holding I suggest

Hi, @holger80!

You just got a 2.9% upvote from SteemPlus!
To get higher upvotes, earn more SteemPlus Points (SPP). On your Steemit wallet, check your SPP balance and click on "How to earn SPP?" to find out all the ways to earn.
If you're not using SteemPlus yet, please check our last posts in here to see the many ways in which SteemPlus can improve your Steem experience on Steemit and Busy.

This post has been included in the latest edition of SoS Daily News - a digest of all you need to know about the State of Steem.