Ruby
esa.io
esaDay 3

esa APIを利用してユーザー毎の投稿ランク、スターランクを作成し、情報共有を盛り上げる

More than 3 years have passed since last update.

esa APIを利用してユーザー毎の投稿ランク、スターランクを作成し、、情報共有を盛り上げたいと思います。

ランキングなど、ゲーミフィケーション的な仕組みで情報共有を盛り上げるテクニックについては、
情報共有に関する知見やお悩みを共有するイベントである情報会議などでも度々話題になっていました。

よいのなら 作ってみよう ランキング - 575

前提

プログラム

.env

ESA_API_TOKEN=your api token
TEAM=docs

運営チームを対象にして動作確認してみます。
自分のチームで試したい時はTEAMをdocsから変更してください。

esa-ranking.rb

require 'dotenv'
require 'esa'
Dotenv.load

client = Esa::Client.new(access_token: ENV['ESA_API_TOKEN'], current_team: ENV['TEAM'])
page_unit = 100
post_count = client.posts(per_page: page_unit).body['total_count']
results = (1..((post_count / page_unit) + 1)).each_with_object([]) do |i, results|
  memo = client.posts(per_page: post_count, page: i).body["posts"].group_by{|e|e["created_by"]["screen_name"]}.each_with_object([]) do |e, memo|
    memo << { 
      name: e.first,
      number: e.last.count,
      star: e.last.reduce(0) { |a, e|a = a + e["stargazers_count"].to_i }
    }
  end
  results << memo
end

def output_ranking(results, key, label)
  puts
  puts label
  results.flatten
       .reduce(Hash.new(0)){ |a, e|a[e[:name]] += e[key];a }
       .sort { |(k1, v1), (k2, v2)| v2 <=> v1 }
       .chunk { |e| e.last }
       .each.with_index(1) { |e, i|
         names = e.last.map{ |e|e.first }.join(',')
         count = e.first
         puts "No.#{i} #{count} - #{names}"
       }
end

output_ranking(results, :number, "Posts count ranking")
output_ranking(results, :star, "Star count ranking")

出力

docs チームに対して実行

今回はesa docsチームを対象に実行してみました。

Posts count ranking
No.1 98 - fukayatsu
No.2 42 - taea
No.3 2 - esa_bot

Star count ranking
No.1 551 - fukayatsu
No.2 322 - taea
No.3 1 - esa_bot

その他の出力例

どのチームも日報とかは書いてません。

某チームAに対して実行

利用期間約1年。

私以外の名前は適当に変えてあります。
ほとんど私とzangiefさんで書いてますがそもそも少人数のチームなので。
人が増えたのもごく最近で、元は3人のチームだったのでほとんどエントリが無いメンバーが多数になっている。

Posts count ranking
No.1 tbpgr - 274
No.2 zangief - 61
No.3 honda - 13
No.4 vega - 12
No.5 bison - 7
No.6 esa_bot - 4
No.7 dan - 1

Star count ranking
No.1 10 - zangief,tbpgr
No.2 5 - vega
No.3 3 - honda,bison
No.4 0 - esa_bot,dan

某チームBに対して実行

利用期間約半年。

私以外の名前は適当に変えてあります。
社長が私に次いで書いてるのがよい。
こちらも人数が少ないこともあってスターの文化は根付いてない。
また、人が増えたのはつい最近でも元々はPostsの上位4名のチームだった。

Posts count ranking
No.1 203 - tbpgr
No.2 70 - 社長
No.3 43 - グルメ
No.4 23 - 飛躍
No.5 19 - 新鋭A
No.6 17 - 昔
No.7 8 - メシア,リーダーシップ
No.8 4 - esa_bot
No.9 2 - 新鋭B
No.10 1 - 違いの分かる漢

Star count ranking
No.1 5 - 社長
No.2 4 - tbpgr
No.3 3 - グルメ
No.4 2 - リーダーシップ
No.5 1 - メシア,飛躍
No.6 0 - 新鋭A,esa_bot,違いの分かる漢,新鋭B,昔

個人利用のesaに対して実行

利用期間約1年。
業務外でも色々やってるのでその作業に必要なメモなど。

Posts count ranking
No.1 266 - tbpgr
No.2 4 - esa_bot

Star count ranking
No.1 1 - tbpgr
No.2 0 - esa_bot

出力例総括

私が一人でめっちゃ書いてる。
情報会議などでも話題にでたのですが、情報共有は先導者+フォロワーが
ガンガン書き込みむことで軌道にのせる、というのが王道みたいなので
一人で王道を突き進んでいるようです。

メモ

この処理をベースに出力フォーマットを整えて月次ランキングを自動投稿とかいいですね。
または、リアルタイムで知りたければHubotやRuboty経由で上記の処理を呼び出せるようにするとか。

外部資料