社区活动算奖金心得
活动结束时都有一个时间点,我不知道官方是怎样运作的,我觉得还是自己手动采集数据靠谱点。
当然了我会想办法让采集数据的过程越简单越好。
1 采集发奖需要的数据
发奖规则都是自己发明的。
比如这个活动,我需要知道以下4个数据才能算奖金:
所以我去Matters API(https://server.matters.news/playground)用GraphQL获取我要的数据。sample代码如下:
query { article ( input: { mediaHash: "bafyreieqexsfcxp6zvubbn4xwkdr2dh6sksi52ijwwyz46wr42ysmig33y" }) { id title summary wordCount readTime author { displayName followers(input: { oss: false }) { totalCount } } appreciationsReceivedTotal transactionsReceivedBy(input: { purpose: donation }) { totalCount } } }
用以上代码,输入一篇文章media hash值,然后返回我要的四种数据:
“appreciationsReceivedTotal”就是我们俗称的拍手数🤣。
如果你去对照文章页面,会发现通过Matters API获取的数据,和文章页面显示的数据是一致的,所以没有取错。
2 用标签ID获取所有投稿数据
当然了,一个正常的活动结束时,肯定不会只有一篇投稿嘛。
如果活动结束时有100篇投稿,我当然不想输100遍hash值,然后重复100遍。。。。。。所以要想办法怎么把投稿标签下的所有文章一次取出来。
根据Matter API文档,貌似要想一次获得同一个标签下的所有文章,只能通过node。。。。。。过程略麻烦。。。。。。
如下图所示,有效参加活动的文章都会在活动标签主题页面下显示。比如像这样:
比如这个活动现在有12篇作品。那么活动结束时,我需要获取这12篇作品的数据,然后计算谁得奖了。
我先在活动投稿页面url处获得活动标签id,然后再用Matters API把我需要用来算奖金的数据取出来。这一次的代码略复杂。。。。。。🥲(如果有大神知道怎么简化代码,欢迎补充。。。。。。)
query { node ( input: { id: "VGFnOjcwMDg1" } ) { id ... on Tag { content articles (input: { oss: false first: 12 }) { totalCount pageInfo { hasNextPage } edges { node { title wordCount readTime appreciationsReceivedTotal transactionsReceivedBy(input: { purpose: donation }) { totalCount } author { displayName followers(input: { oss: false }) { totalCount } } } } } } } }
在活动结束的那个时间点,跑一遍上面的代码,我就得到所有文章的发奖必备数据了。。。。。。。难得去麻烦官方。。。。。。。
活动结束时如果官方不上班。。。。。。。也不知道官方是怎么按时间记录的。。。。。。所以还是自己手动采集一遍有底。。。。。。
3 把活动结束那一刻的鲜活数据赶紧保存下来
因为后期算奖金,我会用到python pandas,所以我就用python弄。。。。。。
import requests import json url = 'https://server.matters.news/graphql' req = requests.post(url, json={'query': query}) print(req.status_code) df_data = json_data['data']['node']['articles']['edges']
反正最后都要用pandas,获得数据后就直接搞成dataframe就好。。。。。。
data = [] for item in df_data: article = {} article['title'] = item['node']['title'] article['wordCount'] = item['node']['wordCount'] article['readTime'] = item['node']['readTime'] article['clap'] = item['node']['appreciationsReceivedTotal'] article['support'] = item['node']['transactionsReceivedBy']['totalCount'] article['author'] = item['node']['author']['displayName'] article['follower'] = item['node']['author']['followers']['totalCount'] data.append(article) df = pd.DataFrame(data=data)
弄成dataframe后,检查一遍,是我需要的数据。。。。。。
检查无误后赶紧保存!!!!!!因为时间点一过,又会有人点赞。。。。。。不及时保存,再跑一遍API数据就不准确了。。。。。。
把dataframe保存至本地csv文件代码如下:
df.to_csv("data.csv")
以上完成了写信找官方要excel数据的过程。。。。。。😅除了字数因为修改后重新发布会显示null,其他数据都准确。。。。。。😅
如果提前准备好以上代码,活动结束时跑一遍再保存数据至本地,采集数据的用时应该不到10分钟。。。。。。
以上代码可以根据所需参数重复使用。。。。。。不知道官方有没有兴趣在活动标签页面加一个按钮。。。。。。时间一到,直接点按钮下载Excel,省去好多事。。。。。。😅
至于算奖金嘛。。。。。。excel和python都可以算。。。。。。喜欢哪样用哪样。。。。。。原理都是把奖金公式输进去,然后算。。。。。。只要没输错。。。。。。用哪个算都是一样的。。。。。。
所以算奖金过程,也比较简单。。。。。。
真正比较烦的是发奖金。。。。。。😅
发奖API应该是payTo,但是还没有实验过。。。。。。所以还是采用社區活動發錢小心得的方法手动发🤣。。。。。。如果要发100次,很容易犯困走神。。。。。。发错奖金赔钱就尴尬了。。。。。。😅