Hive的网页客户端有一个消息通知功能(Notificaitons),每次登录Hive之后,就会看到和你账户相关的信息,比如:谁给你点赞,留言,转发,提到你等等信息。
但是,通过这种方式来查看各种通知的体验并不好。首先需要打开hive/peakd的页面,然后需要从菜单中选择查看通知才能够看到。而且,我们不可能总去刷Hive的网页吧。因此,更为便捷和方便的方式就是通过读取Hive区块链的信息,进行分析,找出自己感兴趣的信息,然后发送给自己的Telegram客户端/其他客户端。
要实现这个功能,需要考虑以下这些因素:
1)区块链信息的读取。这部分可以通过调用Hivepy库中的相关功能来实现。
2)定义你感兴趣的规则。比如:所有给你点赞的信息你都想得到通知,某位大鲸发的所有贴子你都想得到通知,任何和你账户相关的转账操作。等等等等。
3)配置一个Telegram机器人,一旦第二步中有符合条件的消息,发送给Telegram客户端。当然,这里非常灵活,你可以配置自己喜欢的客户端,比如Slack,Discord等等,道理都是类似的。
这篇文章主要来说一说如何检测Hive区块链的信息。
基本思路就是:首先获取当前区块,然后检测当前块中是否有自己感兴趣的信息,如果有的话,存储到一个变量中以便后面发送/处理。之后向前回溯上一个区块,再做同样的检测,如此进行下去,一直检测到指定数目的区块后停止。
这里就涉及一个基本的问题:究竟该向前回溯多少个区块呢?这就取决于你这个程序被执行的频率了。举个例子,如果你这个程序每三秒运行一次,而Hive区块链每三秒生成一个块(印象中Steem区块链是每三秒一块,Hive应该没有变),那么你的程序就不需要进行回溯了。如果你的程序每一分钟运行一次的话,那么你的程序需要回溯60/3 - 1次。
下面先看看如何读取当前区块:
from hive import Hive
from hive.blockchain import Blockchain
hblocks = Hive()
b = Blockchain()
cb = b.get_current_block()
print(cb)
运行上面程序,可以看到其输出结果为:
{'block_id': '0285ea9524d0cc9609991b4e15f52dfbae4663a5', 'signing_key': 'STM6ZHuTjdyS2vPLsaTyd1bsguGo28jsNcKKASFFTbckBWNKpFqdo', 'timestamp': '2020-04-07T11:07:54', 'extensions': [], 'transaction_merkle_root': 'ce9c9aea30054f975f69be2bbf852b1804c2eee1', 'transaction_ids': ['e2134800e3a04dd519d43242d33b938d446508b1', 'e5a979e66d092b5c4c2936bbdc68fa9287a244d9', 'c2cf361839450ab9f3a0176135edeb6d81b9bd90'], 'witness': 'blocktrades', 'witness_signature': '1fd20adda3b1f85adcb864661fef0d696a626b3eb9f4301b0381e69bd3aded604f4d77bfa409554ba4c0a42e43fe368ff992360039f2714e28f5b2fdb20356ad0d', 'previous': '0285ea94c52b1aeda5ed28063a7c64fb5b881f31', 'transactions': [{'block_num': 42330773, 'ref_block_prefix': 4010214059, 'transaction_num': 0, 'signatures': ['1f116bb1406e8479fd0644e7e8288510f4ea61d65bd1614e03fd67e204c0c2fa0f1a4ebb3d0632131005b0c44f5191b75bec768e96b08c6fc983e049c5d1c61864'], 'extensions': [], 'transaction_id': 'e2134800e3a04dd519d43242d33b938d446508b1', 'expiration': '2020-04-07T11:17:45', 'ref_block_num': 60034, 'operations': [['vote', {'weight': 10000, 'voter': 'news-steem', 'permlink': '20200407t104855949z-post', 'author': 'minimalpris'}]]}, {'block_num': 42330773, 'ref_block_prefix': 3413890307, 'transaction_num': 1, 'signatures': ['205471fe218b0b09b9a0a2ad860286b0a110ebb6d7ef3df6b624b976506054fc645f1cfe2e371a236cd79bb97d7a7a8682ffa00994d3fefd18bf62289ebc3a3e63'], 'extensions': [], 'transaction_id': 'e5a979e66d092b5c4c2936bbdc68fa9287a244d9', 'expiration': '2020-04-07T11:08:21', 'ref_block_num': 60051, 'operations': [['vote', {'weight': 4000, 'voter': 'retinox', 'permlink': 'it-was-all-about-green-a-restful-pleasant-color', 'author': 'priyanarc'}]]}, {'block_num': 42330773, 'ref_block_prefix': 3519458629, 'transaction_num': 2, 'signatures': ['204064b9720aa2aa1a8380e7b81bdb0f332a628608db586fd4a9abf1ddd03fa4137d7db804973b639032a0683f1108a1a1ed0b71c1ec4c8dd0df59fd8a6b192cfe'], 'extensions': [], 'transaction_id': 'c2cf361839450ab9f3a0176135edeb6d81b9bd90', 'expiration': '2020-04-07T11:17:48', 'ref_block_num': 60035, 'operations': [['vote', {'weight': 600, 'voter': 'ctime', 'permlink': 'it-was-all-about-green-a-restful-pleasant-color', 'author': 'priyanarc'}]]}]}
如果向前回溯一次,共读取两个块的代码如下:
NUMBER_OF_BLOCKS_TO_CHECK = 2
for i in range(NUMBER_OF_BLOCKS_TO_CHECK):
print("block id: %s" % cb["block_id"])
print("==========================")
for transaction in cb["transactions"]:
for operation in transaction["operations"]:
print(operation[0])
previousid = int(cb["previous"][:8], base=16)
cb = b.hive.get_block(previousid)
其运行结果如下:
block id: 0285eb1b051eb25a0475e4867499303f48d7d77e
==========================
transfer
vote
custom_json
vote
vote
block id: 0285eb1aff2e699579bdd7136493f3a5ea4dedbf
==========================
vote
vote
vote
vote
vote
vote
vote
vote
vote
vote
vote
vote
至此,我们已经可以读取块中的信息,下一篇文章会说说怎么定义感兴趣的规则。
So it's like notification in steemit? I'm using peakd most of the time..
It's similar, but different. In Hive/Steemit, you pull information from their web application by accessing the notification page, here is talking about pushing notifications to your Telegram/Slack etc.