This tutorial is part of a series where different aspects of programming with steem-python
are explained. Links to the other tutorials can be found in the curriculum section below. This part will explain how to set up SMS notifications for votes on the STEEM Blockchain
Repository
https://github.com/steemit/steem-python
What will I learn
- Installing and configuring twilio
- Process votes
- Calculate $ value of a post
- Construct and send a SMS
Requirements
- Python3.6
steem-python
- twilio
Difficulty
- basic
Tutorial
Preface
Nowadays users often become bombarded with notifications and for this reason I have personally shut off almost all of them. I barely receive any texts though so I figured I would look into setting up custom notifications by sms for votes performed by utopian-io
on this account.
Setup
Download the files from Github. There 2 are files notifier.py
which is the main file that scans the STEEM Blockchain and takes two arguments account
and number
, twilio_api.py
which contains the code for uploading sending an SMS via the Twilio API.
Run scripts as following:
> python notifier.py steempyturials +31612345678
Installing and configuring twilio
Installation is simple using pip:
pip3 install twilio
However, to use the Twilio API an account is required. There is a free trail account. Go to the following link and create an account. After that you register your number and also receive a number to send messages from and obtain the account_sid
and auth_token
. Add this information inside notifier.py
. Include the + for the number.
# Your Account Sid and Auth Token from twilio.com/console
account_sid = ''
auth_token = ''
number = ''
client = Client(account_sid, auth_token)
# Send sms and return sid
def send_sms(to, body):
message = client.messages.create(body=body, from_=number, to=to)
return(message.sid)
The trail account comes with $15 of credit. Depending on which country you are in this can be a lot of texts. The rate in the US is less than 1 cent.
Process votes
The block stream is set up to filter for votes
. More information about that in this tutorial. A vote
has the following structure.
{
'voter': 'fxtuber10',
'author': 'sherbanu',
'permlink': 'steemtuner-fun-at-live-session-sudden-surprise-quiz-competition-with-exciting-rewards',
'weight': 10000
}
In this example we will look for only incoming votes from the utopian-io
account.
if voter == 'utopian-io' and author == account:
With this information it is possible to send a notification text that a vote has been received, at what time, in which block and with what upvote weight. However, the weight does not give information about the $ value en we would like to know this.
Calculate $ value of a post
This can be done by constructing a Post
object and extracting additional information about the post from it.The identifier
to create the post is made up out of a @
, the user account
and the permlink
of the post.
# Construct post from the permlink to retrieve vote rshares
post = Post(f'@{self.account}/{permlink}', self.steem)
From the post we can then extract the active_votes
list. This is a list containing all the current votes on a post. We will need to filter for the vote made by utopian-io
. This returns an number in rshares
. Which is a %
of the current reward pool
and still has to be converted to $.
# Look for utopian in active_votes
active_votes = post['active_votes']
for vote in active_votes:
if vote['voter'] == 'utopian-io':
payout = self.convert_rshares(vote['rshares'])
To convert the rshares
to dollar value we use the code provided by @emrebeyler in his tutorial about rshares:
def convert_rshares(self, rshares):
reward_fund = self.steem.get_reward_fund()
reward_balance, recent_claims = (reward_fund["reward_balance"],
reward_fund["recent_claims"])
base_price = self.steem.get_current_median_history_price()["base"]
fund_per_share = Amount(reward_balance).amount / float(recent_claims)
payout = float(rshares) * fund_per_share * Amount(base_price).amount
return payout
Construct and send a SMS
The sms function takes a number
to send the text to and the body of the text. The number
has already been set so only the body
has to be constructed. In this example we choose to have the $ amount
included, as well as convert the permlink
to an url
so it becomes clickable from the phone and include the block
and timestamp
.
# Construct sms
url = f"http://steemit.com/@{self.account}/{permlink}"
body = (f"Upvote from Utopian-io for ${payout:.2f}\n" +
f"\n{url}\n\nBlock: {self.block}" +
f"\n{self.timestamp}")
self.send_sms(body)
def send_sms(self, memo):
print(twilio_api.send_sms(self.number, memo))
Running the script
Running the code will scan the blockchain until a vote is found by utopian-io
and send an sms with the details about the upvote and the $ value. This script can easily be adjusted for any kind of custom notifications. It can be used to receive a text from every upvote from every account. Or filter out votes that have a value greater than a preset amount. As there is a small fee to send the sms it is recommended to set some reasonable parameters.
Another great use case is to receive notifications when a running programs fails. So by putting in into the Exception block and having it send the error to you. Like:
try:
Program code
except Exception as error:
self.send_sms(error)
Curriculum
Set up:
- Part 0: How To Install Steem-python, The Official Steem Library For Python
- Part 23: Part 23: Retrieve And Process Full Blocks From The Steem Blockchain
The code for this tutorial can be found on GitHub!
This tutorial was written by @juliank.
Thank you for your contribution.
Your contribution has been evaluated according to Utopian policies and guidelines, as well as a predefined set of questions pertaining to the category.
To view those questions and the relevant answers related to your post, click here.
Need help? Write a ticket on https://support.utopian.io/.
Chat with us on Discord.
[utopian-moderator]
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hey @steempytutorials
Thanks for contributing on Utopian.
We’re already looking forward to your next contribution!
Want to chat? Join us on Discord https://discord.gg/h52nFrV.
Vote for Utopian Witness!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hi @steempytutorials,
I've been using your tutorials and finding them incredibly useful in learning to Python and Steem at the same time. Thanks so much for doing them.
With HF20 coming up, do you think you could do one for building an autovoter with a time-delay? I want to move my votes from immediate to 15 minutes, and at the moment I'm seeing a bunch of possible ways to do that, none of which I like very much. I figure there's probably a simpler way I'm missing.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit