⭐️{purrr}でSlack WEB APIを触る
API怖いので {purrr}
を使って頑張ろう、という所存です。先日、うさぎさんこと @sinhrks さんがJapan.R 2015で講演されたので、その資料を超参考にしました。
SlackのAPIを扱う機能をもった {slackr}
があり、こちらを愛用していますが、生API (?)で頑張るぞい、という(ry
最終的にこれ
をRでできるようにしたいです。過去にログファイルをダウンロードしてきて実行する方法について書きましたが、それのAPI利用版(お試し)です。
参照するAPIはreactions.getメソッドです。投稿に対する絵文字を用いた応答(誰が、どのような反応をしたかといった情報)が返ってきます。必要なパラメータとしてtoken, channel, timestampなどがあります。個別の投稿に対するreactionを得るためにtimestampを指定する必要がありますが、このtimestampを得るには別のchannels.historyメソッドを叩くのが良いっぽいのでそうしました。
この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×tamp=%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 |
深い階層のリスト要素へのアクセスはこのようにするのが良いのかわかりませんが(多分あまり良くなさそう)、とりあえず勉強になりました。