esa APIを利用してチームのユーザーからランダムで一人を選出する


esa esa APIを利用してチームのユーザーからランダムで一人を選出します。
今のところMembers APIみたいなものは提供されていなそうなので全投稿をほじくって
そこからユーザーの情報を取得します。かなり力技。

前提

プログラム

こんな感じの出力結果を何かと連携させたら、esaのユーザーから抽選で1名を選出して
何かに指名する、とかできると思います。
例えば、ポエム担当をこれでランダムにきめてその人の名前でポエム記事のテンプレートを投稿したりとか。

.env

例のごとく公式チームで試行させていただきます。

ESA_API_TOKEN=your api token
TEAM=docs

esa-random_choose.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|
  results << client.posts(per_page: post_count, page: i).body["posts"].map{|e|
    {
      name: e["created_by"]["name"],
      screen_name: e["created_by"]["screen_name"],
      icon: e["created_by"]["icon"]
    }
  }
end

user = results.flatten.uniq.sample
puts <<-EOS
#{user[:icon]}
Name: #{user[:name]}
Screen Name: #{user[:screen_name]}
EOS

出力

  • 1回目
$ ruby esa_random_choose.rb
https://img.esa.io/uploads/production/users/1/icon/thumb_m_402685a258cf2a33c1d6c13a89adec92.png
Name: Atsuo Fukaya
Screen Name: fukayatsu
  • 2回目
$ ruby esa_random_choose.rb
https://img.esa.io/uploads/production/users/83/icon/thumb_m_1bca40cedfd2cfd0f636f2ac9c0bbad6.jpg
Name: esa_bot
Screen Name: esa_bot
  • 3回目
$ ruby esa_random_choose.rb
https://img.esa.io/uploads/production/users/2/icon/thumb_m_2690997f07b7de3014a36d90827603d6.jpg
Name: TAEKO AKATSUKA
Screen Name: taea

応用

例えば最後の出力部分をMarkdownに変えてみます。

# ここより前は同じ

puts <<-EOS
![#{user[:name]}](#{user[:icon]})

## Name
#{user[:name]}

## Screen Name
#{user[:screen_name]}
EOS
  • 出力されたMarkdown
![Atsuo Fukaya](https://img.esa.io/uploads/production/users/1/icon/thumb_m_402685a258cf2a33c1d6c13a89adec92.png)

## Name
Atsuo Fukaya

## Screen Name
fukayatsu
  • 出力されたMarkdownをこの記事に貼り付けてみる

Name

Atsuo Fukaya

Screen Name

fukayatsu


・・・とここで終わるはずだった。

今のところMembers APIみたいなものは提供されていなそうなので全投稿をほじくって
そこからユーザーの情報を取得します。かなり力技。

この件があったので、esaへフィードバックを送りました。
すると 6分 で返信があって 約2時間半後には Members API が提供されているという神展開。

Members APIを追加しました - docs.esa.io

プログラム

新API版のプログラム。
今回はメンバーだけを取得しているのでとってもシンプル。

$ gem update esa 

.env

自分のチームしか確認できない。(公式チームの情報も見ることはできない)

ESA_API_TOKEN=your api token
TEAM=your team

esa-random_choose_new_api.rb

すごく楽になったし、処理もすぐに終わるようになった。

require 'dotenv'
require 'esa'
Dotenv.load

client = Esa::Client.new(access_token: ENV['ESA_API_TOKEN'], current_team: ENV['TEAM'])
user = client.members.body["members"].sample
puts <<-EOS
#{user["icon"]}
Name: #{user["name"]}
Screen Name: #{user["screen_name"]}
EOS

出力

$ ruby random_choose_new_api.rb
# 適当なパスに変えてます
https://img.esa.io/uploads/production/users/some.jpg
Name: てぃーびー
Screen Name: tbpgr

外部資料

(\( ⁰⊖⁰)/) 明日のesa Advent Calendar

6日のAdvent Calendar担当は、なんと!中の人「ふかやつさん」です!