Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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

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経由で上記の処理を呼び出せるようにするとか。

外部資料

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?