cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

⭐️{purrr}でSlack WEB APIを触る

API怖いので {purrr}を使って頑張ろう、という所存です。先日、うさぎさんこと @sinhrks さんがJapan.R 2015で講演されたので、その資料超参考にしました。

SlackのAPIを扱う機能をもった {slackr} があり、こちらを愛用していますが、生API (?)で頑張るぞい、という(ry

最終的にこれ

qiita.com

をRでできるようにしたいです。過去にログファイルをダウンロードしてきて実行する方法について書きましたが、それのAPI利用版(お試し)です。

uribo.hatenablog.com

参照するAPIはreactions.getメソッドです。投稿に対する絵文字を用いた応答(誰が、どのような反応をしたかといった情報)が返ってきます。必要なパラメータとしてtoken, channel, timestampなどがあります。個別の投稿に対するreactionを得るためにtimestampを指定する必要がありますが、このtimestampを得るには別のchannels.historyメソッドを叩くのが良いっぽいのでそうしました。

f:id:u_ribo:20151207090655p:plain

このreactionについての情報をリクエストします。

library(httr)
library(purrr)

token, channelの部分は適宜値を与えてください。

url <- sprintf("https://slack.com/api/channels.history?token=%s&channel=%s&pretty=1", 
               token, channel)
GET(url = url) -> res
status_code(res)
## [1] 200

ステータスコードが200 なので正常に値が得られています。ここから必要な情報timestampをとってきます。

content(res) %$% messages %>% map(~ .$ts) %>% {
  res_ts <<- .
  .
}
## [[1]]
## [1] "1440832104.000003"
## 
## [[2]]
## [1] "1440832041.000002"
## 
## [[3]]
## [1] "1435191059.727541"
as.POSIXlt("16:07:21", format = "%H:%M:%S") %>% as.numeric()
## [1] 1449472041

表記されている時刻と微妙にずれているのが気になります...。がそれはさておき、必要なtimestampの値を得られたので、これを追加してreactions.getメソッドを参照します。

url <- sprintf("https://slack.com/api/reactions.get?token=%s&channel=%s&timestamp=%s&pretty=1", 
               token, channel, res_ts[[2]])
GET(url = url) -> res

普通にちまちまと値を得るには次のようにします。

res %>% content() %$% message %$% reactions[[1]] %$% name
## [1] "doughnut"

うさぎさんの資料とブログ記事を元に{purrr}を使いましょう。

res %<>% content() %$% message %$% reactions %>% 
  map(~ .[c("name", "count")]) %>% 
  dplyr::bind_rows()
res %>% dplyr::mutate(name = paste(remoji::emoji(name), name, " ")) %>% 
  kable(format = "markdown")
name count
🍩 doughnut 1
🍛 curry 1
🍜 ramen 1

深い階層のリスト要素へのアクセスはこのようにするのが良いのかわかりませんが(多分あまり良くなさそう)、とりあえず勉強になりました。