esa APIを利用してユーザー毎の投稿ランク、スターランクを作成し、、情報共有を盛り上げたいと思います。
ランキングなど、ゲーミフィケーション的な仕組みで情報共有を盛り上げるテクニックについては、
情報共有に関する知見やお悩みを共有するイベントである情報会議などでも度々話題になっていました。
よいのなら 作ってみよう ランキング - 575
前提
- esaのAPIの仕様は以下で確認すること
- esaのAPI Clint Library(Ruby)
- 環境変数の利用
- dotenv gemを利用
プログラム
.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経由で上記の処理を呼び出せるようにするとか。