🏅 中文区近30天发帖用户排行榜(Reputation, Steem Power, Real SP)

昨天聊到下边两个话题

然后突然觉得中文区也应该有个排行榜
另外,神马持有多少STEEM, 多少SBD,多少存款(SAVING)和点赞收益一毛钱关系都没有,所以就不列出了。

重点是STEEM POWER,另外我引入一个新的条目RSP
RSP代表Real STEEM POWER, 计算方法是: RSP = SP + 别人代理过来的 - 代理给别人的
RSP是点赞操作中实际起作用的SP数量

另外一个重要参数是VP (Voting Power): 就是当前剩余的投票能量

点赞给作者增加的收益: RSP x VP x 投票百分比 x 系统参数


数据生成时间: 2017-07-14 02:26:44(UTC)
统计范围为30天内
这期间共有: 文章数3563, 发帖用户数748

🏅按声望分排序 / Top 30 authors (sorted by Reputation score)

Rank. ID REP SP RSP VP(%)
1 @sweetsssj 74.42 58161.55 339192.36 85.09
2 @officialfuzzy 73.22 19951.02 310172.16 80.97
3 @chinadaily 73.14 4731.88 4731.88 83.70
4 @elfkitchen 71.73 2551.54 2551.54 23.93
5 @myfirst 71.42 3046.85 4069.90 13.39
6 @birds90 71.26 2749.04 2749.04 13.78
7 @ace108 71.01 10481.77 58851.96 58.29
8 @oflyhigh 70.59 9018.10 55364.75 54.36
9 @exploretraveler 70.58 1663.62 1663.62 98.00
10 @bkkshadow 70.55 1167.34 1167.34 63.84
11 @deanliu 70.12 11900.52 60270.72 28.14
12 @fishingvideos 70.00 171.26 5.09 89.83
13 @helene 69.74 9814.08 9814.08 55.52
14 @shieha 69.60 3848.84 202.21 43.04
15 @ability 69.57 308.65 16.72 98.00
16 @lemooljiang 69.47 7994.70 7994.70 50.24
17 @abit 69.36 1952123.08 1952123.08 91.65
18 @writingamigo 69.02 788.22 788.22 64.60
19 @sulev 68.32 7208.82 6207.84 74.91
20 @rivalhw 68.24 2763.72 2763.72 90.73
21 @richristow 67.87 5686.19 5686.19 99.60
22 @firepower 67.78 24282.36 24282.36 79.70
23 @cnfund 67.75 2751.57 8.98 96.05
24 @beanz 67.50 2529.52 2529.52 80.86
25 @rea 67.28 24336.04 24336.04 96.10
26 @solarguy 67.20 5026.81 5026.81 66.38
27 @blakemiles84 67.09 14901.86 14901.86 84.61
28 @muzhu 66.92 74.72 5.29 98.00
29 @surpassinggoogle 66.86 5026.66 5026.66 78.64
30 @blueorgy 66.72 18153.82 18153.82 89.96

🏅按SP排序 / Top 30 authors (sorted by STEEM Power)

Rank. ID REP SP RSP VP(%)
1 @abit 69.36 1952123.08 1952123.08 91.65
2 @sweetsssj 74.42 58161.55 339192.36 85.09
3 @officialfuzzy 73.22 19951.02 310172.16 80.97
4 @boombastic 57.15 67920.78 67920.78 96.04
5 @deanliu 70.12 11900.52 60270.72 28.14
6 @ace108 71.01 10481.77 58851.96 58.29
7 @oflyhigh 70.59 9018.10 55364.75 54.36
8 @somebody 58.98 33594.58 33594.58 86.22
9 @nextgen622 64.36 32810.74 32810.74 42.69
10 @megaspore 64.15 25791.43 25791.43 86.34
11 @rea 67.28 24336.04 24336.04 96.10
12 @firepower 67.78 24282.36 24282.36 79.70
13 @testz 65.45 18919.29 18919.29 98.00
14 @blueorgy 66.72 18153.82 18153.82 89.96
15 @blakemiles84 67.09 14901.86 14901.86 84.61
16 @realcodysimon 51.64 13306.90 13379.58 94.96
17 @jack8831 61.06 12864.96 13364.99 97.74
18 @steameat 48.26 13165.17 13192.74 96.06
19 @joythewanderer 63.24 5966.05 11968.94 31.77
20 @helene 69.74 9814.08 9814.08 55.52
21 @cqf 49.82 9760.29 9760.29 69.19
22 @gaman 47.21 9194.42 9194.42 99.44
23 @pnc 62.47 8657.64 8657.64 70.52
24 @immarojas 64.82 8228.53 8228.53 98.00
25 @lemooljiang 69.47 7994.70 7994.70 50.24
26 @coinbitgold 63.97 7910.30 7910.30 58.94
27 @incrediblesnow 54.45 175.12 6953.86 60.24
28 @ydauti -3.16 6800.27 6800.27 76.10
29 @sulev 68.32 7208.82 6207.84 74.91
30 @pagandance 47.21 6170.75 6170.75 26.99

🏅按Real SP排序 / Top 30 authors (sorted by Real SP)

Rank. ID REP SP RSP VP(%) Online
1 @abit 69.36 1952102.89 1952102.89 96.28 465
2 @sweetsssj 74.42 58161.37 339191.33 85.04 344
3 @officialfuzzy 73.22 19950.96 310171.23 79.70 446
4 @boombastic 57.15 67920.58 67920.58 96.04 450
5 @deanliu 70.12 11900.49 60270.53 27.32 364
6 @ace108 71.01 10481.74 58851.78 58.29 361
7 @oflyhigh 70.59 9018.08 55364.58 54.07 353
8 @somebody 58.98 33594.48 33594.48 86.22 356
9 @nextgen622 64.36 32810.64 32810.64 42.87 349
10 @megaspore 64.15 25791.35 25791.35 86.34 276
11 @rea 67.28 24335.97 24335.97 95.65 364
12 @firepower 67.78 24282.29 24282.29 79.70 371
13 @testz 65.45 18919.23 18919.23 98.00 460
14 @blueorgy 66.72 18152.82 18152.82 89.96 365
15 @blakemiles84 67.08 14901.82 14901.82 83.27 409
16 @realcodysimon 51.64 13306.86 13379.54 94.96 44
17 @jack8831 61.06 12864.93 13364.95 97.74 326
18 @steameat 48.26 13165.13 13192.70 96.06 21
19 @joythewanderer 63.24 5966.03 11968.91 31.77 363
20 @helene 69.74 9814.05 9814.05 55.52 348
21 @cqf 49.82 9760.26 9760.26 69.19 95
22 @gaman 47.17 9194.39 9194.39 99.43 18
23 @pnc 62.47 8657.61 8657.61 69.82 435
24 @immarojas 64.82 8228.51 8228.51 98.00 337
25 @lemooljiang 69.47 7994.68 7994.68 50.73 362
26 @coinbitgold 63.97 7910.27 7910.27 59.16 400
27 @incrediblesnow 54.39 175.12 6953.84 71.81 20
28 @ydauti -3.16 6800.25 6800.25 76.10 40
29 @sulev 68.32 7208.80 6207.82 74.91 360
30 @pagandance 47.21 6170.73 6170.73 26.99 64

快来找找,你上榜了没有?

划重点

  • RSP x VP x 投票百分比 x 系统参数 决定点赞者给作者增加的收入
  • 同样RSP x VP x 投票百分比 x 系统参数 x 分配参数等 决定点赞者收入
  • 持有SP超过 1W,就可以排入中文区榜单前20 喽
  • @deanliu @ace108 的大腿很粗,快去抱紧啊 (给我留2块地方哦)

感谢阅读 / Thank you for reading.
欢迎upvote、resteem以及 following me @oflyhigh 😎


This page is synchronized from the post: 🏅 中文区近30天发帖用户排行榜(Reputation, Steem Power, Real SP)

STEEM POWER 与点赞收益(Curation Rewards)对照表

在之前的帖子中研究过点赞金额的问题

但是还没真计算对应一定数量的SP大致会有多少点赞收益。
今天恰逢 @htliao 抛出这个话题,于是写程序算了一下大致收益情况。

10000 STEEM POWER

假定为以下理想情况:

  • 按当前奖励池状况以及STEEM价格计算
  • 用户Voting Power 保持100%
  • 用户每当Voting Power恢复至100%时点出去权重为100%的upvote
  • 不考虑早鸟惩罚,亦不考虑给别的点赞者抬轿问题

以10000 SP 为例:

1
2
3
4
5
6
7
8
STEEM Power: 10000
Price: 1.226 SBD/STEEM
vesting shares: 20674550.112
rshares: 413491002249.121
Post rewards increased: 2.021 SBD, 1.648 STEEM
Curator rewards per post: 0.505 SBD, 0.412 STEEM
Curator rewards per day: 5.053 SBD, 4.121 STEEM
Curator rewards per month: 151.594 SBD, 123.617 STEEM

由此可见,理想状况下,10000个SP的点赞收益每月高达123.617 STEEM,还是非常可观的

SP and Curation Rewards

为了便于大家对比,我弄了个表格,每行代表持有不同SP数量对应的每帖、每天、每月收益
(Curation Rewards 数值为STEEM Power)

SP CR/Post CR/Day CR/Month
1000 0.041 0.412 12.366
2000 0.082 0.824 24.731
5000 0.206 2.061 61.828
10000 0.412 4.122 123.657
50000 2.061 20.610 618.287
100000 4.122 41.219 1236.575

大家快来对比一下吧

请注意,
以上为理想状况
考虑奖励池变化,STEEM价格变化,以及点赞时机,是否有他人点赞等诸多因素,这些数值会有所变动
以上内容仅供参考


感谢阅读 / Thank you for reading.
欢迎upvote、resteem以及 following me @oflyhigh 😎


This page is synchronized from the post: STEEM POWER 与点赞收益(Curation Rewards)对照表

steemit 隐藏神技之: 富豪榜 / The rich list of steemit & How to get it from SteemData

富豪榜 / The rich list

你可能见过steemit上的各种榜单,什么每日发帖排行榜、每日得奖排行榜、每日回复排行榜等等。 但是你知道吗,这里有一个很重要的榜单: 富豪榜

Here is a very important list: The rich list.
https://steemd.com/richlist

在这里,列出了持有SP最多的、持有STEEM最多的、持有SBD最多的各5000名用户
There are three accounts lists, sorted by
1) Amount of Holding SP
1) Amount of Holding STEEM
1) Amount of Holding SBD

快来看看你是否在这个列表里吧。

Top 10 of the lists

这里我把三个列表的前十名截取过来了,快来崇拜一下吧

Get rich list from SteemData

在之前的文章中,我们简要地介绍过SteemData
简单介绍一下SteemData

那么我们是否可以获取使用SteemData获取rich list呢?
答案是肯定的,而且我们还可以获取用户存款账户信息哦,这是上边richlist里不包含的哦。

1: Get Top 10 SP holders from SteemData

查询语句:
rets = db.Accounts.find({}, {'name':1, 'sp':1, '_id':0}).sort('sp',-1).limit(10)

结果如下:

1
2
3
4
5
6
7
8
9
10
{'name': 'steemit', 'sp': 70769848.699}
{'name': 'freedom', 'sp': 7190048.222}
{'name': 'steem', 'sp': 4917755.824}
{'name': 'dan', 'sp': 4165217.731}
{'name': 'ned', 'sp': 3552240.243}
{'name': 'blocktrades', 'sp': 2844940.108}
{'name': 'val-a', 'sp': 2545454.998}
{'name': 'mottler', 'sp': 2233127.725}
{'name': 'abit', 'sp': 1951864.398}
{'name': 'databass', 'sp': 1692808.919}

2: Get Top 10 STEEM holders from SteemData

查询语句:
rets = db.Accounts.find({}, {'name':1, 'balance.amount':1, '_id':0}).sort('balance.amount',-1).limit(10)

结果如下:

1
2
3
4
5
6
7
8
9
10
{'name': 'poloniex', 'balance': {'amount': 26664594.378}}
{'name': 'bittrex', 'balance': {'amount': 8382739.044}}
{'name': 'steemit2', 'balance': {'amount': 1022874.459}}
{'name': 'dantheman', 'balance': {'amount': 964296.224}}
{'name': 'firefire', 'balance': {'amount': 893204.0}}
{'name': 'imadev', 'balance': {'amount': 788297.713}}
{'name': 'tombstone', 'balance': {'amount': 678857.312}}
{'name': 'ben', 'balance': {'amount': 644064.704}}
{'name': 'steemit', 'balance': {'amount': 500001.183}}
{'name': 'openledger', 'balance': {'amount': 488797.205}}

3: Get Top 10 SBD holders from SteemData

查询语句:
rets = db.Accounts.find({}, {'name':1, 'sbd_balance.amount':1, '_id':0}).sort('sbd_balance.amount',-1).limit(10)

结果如下:

1
2
3
4
5
6
7
8
9
10
{'name': 'poloniex', 'sbd_balance': {'amount': 1408592.375}}
{'name': 'bittrex', 'sbd_balance': {'amount': 634380.987}}
{'name': 'imadev', 'sbd_balance': {'amount': 71103.439}}
{'name': 'teamsmooth-mm', 'sbd_balance': {'amount': 69739.446}}
{'name': 'openledger', 'sbd_balance': {'amount': 43110.053}}
{'name': 'blocktrades', 'sbd_balance': {'amount': 38257.748}}
{'name': 'teamsmooth', 'sbd_balance': {'amount': 28113.009}}
{'name': 'nextgencrypto', 'sbd_balance': {'amount': 23056.34}}
{'name': 'azeroth', 'sbd_balance': {'amount': 20966.206}}
{'name': 'dang007', 'sbd_balance': {'amount': 19965.703}}

4:Get Top 10 SAVINGS SBD holders in from SteemData

查询语句:
rets = db.Accounts.find({}, {'name':1, 'savings_sbd_balance.amount':1, '_id':0}).sort('savings_sbd_balance.amount',-1).limit(10)

结果如下:

1
2
3
4
5
6
7
8
9
10
{'name': 'cryptomancer', 'savings_sbd_balance': {'amount': 20000.0}}
{'name': 'leesunmoo', 'savings_sbd_balance': {'amount': 6000.0}}
{'name': 'permacryptofolio', 'savings_sbd_balance': {'amount': 5000.0}}
{'name': 'camilla', 'savings_sbd_balance': {'amount': 4175.353}}
{'name': 'superstar', 'savings_sbd_balance': {'amount': 4012.435}}
{'name': 'clains', 'savings_sbd_balance': {'amount': 3800.712}}
{'name': 'psylains', 'savings_sbd_balance': {'amount': 3297.548}}
{'name': 'opheliafu', 'savings_sbd_balance': {'amount': 2782.369}}
{'name': 'dan-atstarlite', 'savings_sbd_balance': {'amount': 2000.0}}
{'name': 'chitty', 'savings_sbd_balance': {'amount': 1500.0}}

5: Get Top 10 SAVINGS STEEM holders in from SteemData

查询语句:
rets = db.Accounts.find({}, {'name':1, 'savings_balance.amount':1, '_id':0}).sort('savings_balance.amount',-1).limit(10)

结果如下:

1
2
3
4
5
6
7
8
9
10
{'name': 'steemit', 'savings_balance': {'amount': 18372915.751}}
{'name': 'ned', 'savings_balance': {'amount': 1328211.4}}
{'name': 'val', 'savings_balance': {'amount': 419040.606}}
{'name': 'bitone', 'savings_balance': {'amount': 120106.303}}
{'name': 'thejohalfiles', 'savings_balance': {'amount': 114362.882}}
{'name': 'goldenunicorn', 'savings_balance': {'amount': 110101.011}}
{'name': 'skan', 'savings_balance': {'amount': 64999.9}}
{'name': 'arhag', 'savings_balance': {'amount': 60000.0}}
{'name': 'opheliafu', 'savings_balance': {'amount': 16038.007}}
{'name': 'sofaking2020', 'savings_balance': {'amount': 9000.0}}


是不是很有意思,这只是最简单的查询哦,你可以编程实现很复杂的查询和筛选,快来玩吧

感谢阅读 / Thank you for reading.
欢迎upvote、resteem以及 following me @oflyhigh 😎


This page is synchronized from the post: steemit 隐藏神技之: 富豪榜 / The rich list of steemit & How to get it from SteemData

也来试试点赞小鱼,仅仅是测试,限时开放[截止当日(7月12日)北京时间22点],快来玩吧

看网上突然冒出来一堆各种卖赞鲸鱼,比如说你转2美元随机给你点赞的、你转钱借你SP的、你向它投资SP获得分红的…… 好好个内容分发平台似乎一夜间变成了投资理财平台。

至于这些卖票行为是否值得肯定,有人认为内容为王,花钱买赞行为实不可取;也有人认为,我花自己的钱为文章增加收益无可厚非。对此, 本文姑且不去讨论。本文只是从技术角度分析和测试一下类似乱鲸鱼的实现机制,并且做了个简单的点赞小鱼,当然不指望卖票赚钱,只是玩玩而已,所以只开放2个小时多一点。

操作机制

其实乱鲸鱼操作机制整体上可分为三部分

1) 判断收钱
2) 计算额度
3) 点赞并回帖等

其中判断收钱的机制,我们在下面这篇文章中已经做过介绍:
SteemData Notify 代码学习二: Confirmation Worker / Code Study of SteemData Notify: Part two

计算额度 乱鲸鱼号称是随机额度,但是我看它很少点到50%以上,按说随机随机,百分比在50%以上的概率应该是50%以上才对呢。擦,我是不是又不小心说出了什么了不得的秘密?会被灭口不?我这个程序的点赞额度的计算机制可以参考:
聊聊点赞金额 ,发钱啦(限中文: 前3名回复送价值2SBD的点赞,前4-10送1SBD点赞)

点赞并回帖
这个没啥啦,通过计算出来的额度给予对应的帖子点赞即可。如果需要,再回个帖子,万一别人再给你点回来,就赚了嘛

我的点赞小鱼

经过上述分析,以及一系列测试,我的点赞小鱼程序出来了。

你转SBD给点赞小鱼,并指明帖子,我会通过点赞给对应的帖子增加双倍转账金额的SBD。
举例说,你转 1SBD 给 我, 指明帖子的Identifier为: @oflyhigh/xxxx, 我就会让这个帖子的金额增加 2SBD

一些限制如下:
1) 必须是发布6天零12个小时以内的,已经结算和快结算的无法操作
2) 我目前的点赞威力大概一次增加 8 SBD,建议你转账金额控制到2SBD以内,以免我能量下降100%也点不出来二倍金额
3) 我已经赞过的,无法参与
4) Memo中添写Identifier 而不是URL 哦 . 类似:@oflyhigh/3-2sbd-4-10-1sbd
5) 仅支持SBD转载,不支持STEEM哦

点赞支持主贴和回复

回复贴的Identifier可以通过点击回复右边的时间,然后截取#以后的字符串即可

或者你直接进你的comments
https://steemit.com/@yourid/comments
然后点对应的回复,就可以在浏览器中看到一大串字符串
比如我给刘老师回帖的链接:
https://steemit.com/steemit/@deanliu/my-milestone-rep-70-an-hf19-100-upvotes-and-sbds-giveaway-hf19-100-sbd#@oflyhigh/re-deanliu-re-deanliu-my-milestone-rep-70-an-hf19-100-upvotes-and-sbds-giveaway-hf19-100-sbd-20170712t111714714z
则其中Identifier就是:
@oflyhigh/re-deanliu-re-deanliu-my-milestone-rep-70-an-hf19-100-upvotes-and-sbds-giveaway-hf19-100-sbd-20170712t111714714z

关于退款

如果你正常操作,但是我没有点赞
回帖说明后,我会给你手工补点

如果你不按正常流程操作,那么不予退款哦,比如

  • 转的不是SBD而是STEEM
  • 没有写memo
  • memo 写的不是Identifier
  • Identifier 对应的内容不存在
  • 帖子已经结算或者进入结算期
  • 你的帖子我已经投过票了
  • 转账金额的2倍超出我的点赞能力

是否点赞小鱼会一直运行?

点赞小鱼仅仅是为了探索一下各种点赞鲸鱼的操作方式并且练习一下编写脚本,并不会作为盈利项目长期运作。测试期间也仅仅是为了测试以及与大家共同娱乐一下。

点赞小鱼开放测试时间: 现在至北京时间7月12日晚22点

划重点:

  • 点赞小鱼会给你转账金额(SBD) 2倍的点赞 (建议转账金额在2SBD以内)
  • 点赞小鱼支持主贴和回复
  • 点赞小鱼转账memo要填写Identifier
  • 点赞小鱼仅仅是为了测试与学习编程,所以限时开放,到期关闭

参与方式: 转账不超过2SBD至我的账户,并在memo中指定你要点赞内容的Identifier

好了,快来玩吧。


This page is synchronized from the post: 也来试试点赞小鱼,仅仅是测试,限时开放[截止当日(7月12日)北京时间22点],快来玩吧

机器人们肿么了?

或许有细心的朋友会注意到,昨天很多帖子的得票都要比前些天少一些。
是因为币价下跌导致大家无心投票嘛,答案是否定的。

get_ops_in_block 出毛病了

那么真实的情况是什么呢?那要先从我的点赞机器人(Curation Bot)说起。昨天一早起来关注了一下我的机器人,然后发现程序在跑着,但是既然一个POST也没抓到,看了一下日志,从7月11号凌晨起就没有数据进来,这不科学啊,不是每三秒一个block嘛,看STEEMIT上帖子和回复这么呢,我咋就一个没抓到呢?

不信邪,写了个简化的程序,还是没数据进来。
于是乎在测试环境下开始漫长的调试之旅,最后发现其它功能都正常,唯独:get_ops_in_block 这个API有毛病

1
2
3
4
5
6
7
/**
* @brief Get sequence of operations included/generated within a particular block
* @param block_num Height of the block whose generated virtual operations should be returned
* @param only_virtual Whether to only include virtual operations in returned results (default: true)
* @return sequence of operations included/generated within the block
*/
vector<applied_operation> get_ops_in_block(uint32_t block_num, bool only_virtual = true)const;

看一下steem代码中的定义和描述
这个API的功能就是把指定块(block)中的操作(operations)顺序取出。

而它出了啥毛病呢,举例说,一个块中会有一系列操作(发帖、回复、点赞、转账等等),可能多达几十上百个。没出问题的时候,这些操作都会被顺序取出,而11号凌晨出毛病之后,只返回零星的几个操作。就是说大部分操作被它搞丢了 😡

get_ops_in_block 如何影响机器人

点赞机器人的工作原理:
1) 挨个块遍历
2) 把块中操作取出
3) 如果有comment操作(发帖或回复),则交由程序其它部分判断是否点赞

因为get_ops_in_block 把大部分操作搞丢了,所以在第二步我们几乎没有取回任何操作,就甭提第三步的判断了。

然后,机器人就瞎了。STEEM网上有很多机器人应该是基于get_ops_in_block这个 API的,于是,就都瞎了。这也是点赞数变少的原因。

如何解决和避免

方法一: 换节点

发现这个问题以后,我测试了官网的几个节点,不出意料的全坏掉了。
然后又找了一堆第三方提供的节点,嗯,有两个还好用

  • gtg.steem.house:8090
  • seed.bitcoiner.me

但是不知道是不是我心里因素,总觉得这两个节点响应速度没官网的快呢,5555

方法二: 读回整个块

虽然get_ops_in_block 不好用了,但是测试了一下get_block还好用
所以另外一种方法就是弃用get_ops_in_block,用get_block读回整个块再处理
似乎数据量比前一种方法大了些(多出witness信息、签名信息等等),但是似乎也不是忍受不了

方法三: 静等修复

懒人的终极大法,除非是steemit官方刻意让这个API不好用,否则有问题他们都会去修复的,耐心等待即可。

方法四: 自己跑节点

呃,想想就头疼,能不自己跑,还是先偷懒吧

其它影响

我有测试除了上述API外,其它常用的功能都依然正确,所以如果不是从块中读数据或者同步数据,那么基本上不受啥影响。但是需要从块中读数据的可就不好说啦。

steemdata

  • 文章数据
    7月11日全天读入的文章数据:8601
    而7月10日这个值为: 16810

  • 点赞数据
    7月11日全天 点赞数: 97753
    而7月10日这个值为: 271373
    更恐怖的是在2017-07-11 0时至2017-07-11 17:00:00 (UTC) 点赞数据为空哦

以上数据一方面说明 get_ops_in_block API 造成的影响巨大,也说明了Steemdata 还有待完善。

SteemData Notify

我们之前对SteemData Notify 做过一些学习,清楚的知道,SteemData Notify 读取区块链上的操作所用的机制就是get_ops_in_block API,那么这段时间用户设置能否得到确认,或者用户操作能否得到通知,就可想而知了。

其它一些各种机器人

凡是需要读取区块数据,并且使用官网节点,并且使用的 get_ops_in_block API,那么都应该受此影响,但是那么卖票的机器人啥的不是用的这样的方式吧….

问题已经修复 & 思索

早晨重新测试,发现官网节点的这个问题已经恢复正常
这算是个非常好的消息吧,我的懒人大法也再次立功了。

小小API,看起来作用微乎其微,但是一旦出故障,我们才发现它居然这么重要。
另外,从这个API导致点赞机器人失效、以及steemdata数据库内容缺失、以及可能引发的卖票机器人收钱不卖票,让我不禁思索是否该过度依赖API,但是不依赖API还能依赖啥呢?😀 或者该保持充分怀疑的态度,一旦API出错有各种补救措施,是不是有些杞人忧天的感觉呢?尽管天塌了一次,还会再次塌嘛?想的有点多了,哈哈


感谢阅读 / Thank you for reading.
欢迎upvote、resteem以及 following me @oflyhigh 😎


This page is synchronized from the post: 机器人们肿么了?

SteemData Notify 代码学习三:Notifier Worker / Code Study of SteemData Notify: Part Three

想必通过前边两篇文章的介绍,大家对SteemData Notify的Blockchain Worker以及Confirmation Worker都有了一些了解,如果你错过了这两篇文章,那么请先移步这里:

今天继续学习Notifier Worker,看看它是如何工作的。

工作流程

在继续学习之前,让我们先尝试理清一下SteemData Notify的工作流程。

以一个用户举例,SteemData Notify的工作流程应该是这样的

  • 用户到网站进行设置,网站保存设置到数据库(未确认)并返回一个HASH的ID值给用户
  • 用户转账给@null 账户,memo中填写上个步骤返回的ID
  • Confirmation Worker抓取到用户的转账信息,并将用户设置修改为已确认
  • Blockchain Worker 判断所有用户的和账户有关操作(转账、修改账户信息等)
  • 判断是否是SteemData Notify 注册(并确认)用户相关的操作以及是否是用户关心的操作
  • 如果是,写入数据库通知表notifications
  • Notifier Worker 负责通知

Notifier Worker

通过上述流程分析,我们知道Notifier Worker负责给用户发送通知信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def run_notifier_worker():
log.info('Starting the notifier worker.')
while True:
for n in db.notifications.find({'email_sent': False}):
if send_mail(n['email'], 'New Steem Event', n['message']):
db.notifications.update_one(
{'_id': n['_id']},
{'$set': {'email_sent': True}},
)
for n in db.notifications.find({'telegram_sent': False}):
if send_telegram(n['telegram_channel_id'], n['message']):
db.notifications.update_one(
{'_id': n['_id']},
{'$set': {'telegram_sent': True}},
)
time.sleep(5)

代码很简单,就是在notifications中每五秒一次查询未处理的操作,然后调用send_mail发送邮件,调用send_telegram发送通知。如果发送成功则修改数据库中对应条目的状态为已处理。

send_mail

SteemData Notify 发送邮件功能使用的是 Mailgun的服务。
Mailgun 是专门为开发者提供的邮件发送服务,这样你就无需自建邮件服务器或者使用邮件服务商的SMTP服务。

自建邮件服务器很难保证投递率,并且大部分邮件都会被丢到垃圾箱。
使用邮件服务器的SMTP服务,一般也会有诸多限制,最基本的比如限制每小时的投递量。

Mailgun 每月 1W封的免费数量(10,000 emails free every month),足以满足我们大多数时候的需求了。

更为让人心动的是,Mailgun 提供强大的API支持,比如网站上提供的示例,这样一段代码就可以使用Python轻松的发送邮件:

1
2
3
4
5
6
7
8
9
# Try running this locally.
def send_simple_message():
return requests.post(
"https://api.mailgun.net/v3/samples.mailgun.org/messages",
auth=("api", "key-3ax6xnjp29jd6fds4gc373sgvjxteol0"),
data={"from": "Excited User <excited@samples.mailgun.org>",
"to": ["devs@mailgun.net"],
"subject": "Hello",
"text": "Testing some Mailgun awesomeness!"})

另外,除了发送邮件,MailGun 还有很多强大的功能,感兴趣的小伙伴快来学习吧。
https://documentation.mailgun.com/en/latest/api_reference.html

有了上述API和示例代码,在回头来理解send_mail函数就没啥难度了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def send_mail(to, subject, message):
url = 'https://api.mailgun.net/v3/%s/messages' % mailgun_domain_name
auth = ('api', mailgun_api_key)
data = {
'from': 'noreply@%s' % mailgun_domain_name,
'to': [to],
'subject': subject,
'text': message,
}
try:
r = requests.post(url, auth=auth, data=data)
if r.status_code in [200, 201]:
log.info('Sent mail to: %s.' % to)
return True
else:
raise Exception(r.text)
except Exception as e:
log.error('Failed sending email to %s: %s' % (to, str(e)))

send_telegram

这段代码和发送邮件的代码大同小异,只不过换成了发送telegram消息

1
2
3
4
5
6
7
8
9
def send_telegram(channel_id, message):
url = 'https://api.telegram.org/bot%s/sendMessage' % telegram_token
try:
data = {'chat_id': channel_id, 'text': message}
r = requests.post(url, data=data)
log.info('Sent notification to: %s.' % channel_id)
return True
except Exception as e:
log.error('Failed sending telegram message to %s: %s' % (channel_id, str(e)))

什么时候QQ和微信(WeChat)也提供这样的API该有多好
现在虽然有一些通过QQ微信网页版扒出来的API,但是官方一直没公开,也就是说你的使用,原则上是不被认可的。如果持续用,没准哪天就被封号了,哎!

总结

在这篇文章中我们整理了一下SteemData Notify的工作流程
并且分析了一下Notifier Worker是如何工作的。

我觉得最大的收获是了解了MailGun,前些日子我还在代码中使用SMTP发送邮件呢,落伍了不是?至于telegram, 有种高大上的东西,叫做墙。


感谢阅读 / Thank you for reading.
欢迎upvote、resteem以及 following me @oflyhigh 😎


This page is synchronized from the post: SteemData Notify 代码学习三:Notifier Worker / Code Study of SteemData Notify: Part Three

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×