社区活动算奖金心得

土豆炒青椒
·
(修改过)
·
IPFS
不知道其他活动版主是怎么计算奖金的,我一般用GraphQL+pandas算。效率还算好,到目前为止还没有算错过😅

活动结束时都有一个时间点,我不知道官方是怎样运作的,我觉得还是自己手动采集数据靠谱点。

当然了我会想办法让采集数据的过程越简单越好。


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篇作品的数据,然后计算谁得奖了。

红框为活动标签id

我先在活动投稿页面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次,很容易犯困走神。。。。。。发错奖金赔钱就尴尬了。。。。。。😅

CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!