RからQiita API v2を使うパッケージをつくり、CRANに公開しました。
qiitr: R Interface to Qiita API
https://yutannihilation.github.io/qiitr/
あまりテストできてないので、動作は色々あやしいかもしれません。何かあればGitHubのIssuesかTwitterあたりで報告いただけるとありがたいです。
インストール
CRANで公開されているのでinstall.packages()
でインストールできます。
install.packages("qiitr")
準備
個人用アクセストークンを発行
Qiita APIの利用にはアクセストークンが必要となります。まずは、https://qiita.com/settings/applicationsから個人用アクセストークンを生成してください。
権限のスコープは、Qiitaからデータを取得したいだけであればread_qiita
だけで大丈夫です。ユーザをフォローしたりコメントを投稿したいといった場合にはwrite_qiita
の権限も必要です。Qiita:Teamに対して操作をしたい場合(後述)はread_qiita_team
、write_qiita_team
が必要になります。
個人用アクセストークンを環境変数に指定
qiitrパッケージに個人用アクセストークンを渡すのには、QIITA_ACCESSTOKEN
という環境変数を使います1。
気軽に試すには、qiita_set_accesstoken()
という関数で一時的にQIITA_ACCESSTOKEN
環境変数を設定することができます。
library(qiitr)
qiita_set_accesstoken()
しかし、セッションをリセットするたびにこのコマンドを打つのは面倒です。ホームディレクトリ(normalizePath("~/")
で確かめることができます)に.Renviron
というファイルを作成して以下のラインを書いておけば、Rのセッション開始時に環境変数が設定されます。ちなみに、このファイルは最後が空行で終わっていないとエラーになるので注意してください。
QIITA_ACCESSTOKEN = "アクセストークン"
アクセストークンが正しく設定されているか確認するには、現在の認証ユーザの情報を取得するコマンドqiita_get_authenticated_user()
を打ってみてください。以下のような結果が返ってくれば成功です。
res <- qiita_get_authenticated_user()
str(res)
#> List of 18
#> $ description : NULL
#> $ facebook_id : NULL
#> $ followees_count : int 0
#> $ followers_count : int 2
#> $ github_login_name : NULL
#> $ id : chr "yutannihilation"
#> $ items_count : int 3
#> $ linkedin_id : NULL
#> $ location : NULL
#> $ name : chr ""
#> $ organization : NULL
#> $ permanent_id : int 80093
#> $ profile_image_url : chr "https://secure.gravatar.com/avatar/c95cdabc569dc4c7750d776687f66037"
#> $ twitter_screen_name : chr "yutannihilation"
#> $ website_url : NULL
#> $ image_monthly_upload_limit : int 104857600
#> $ image_monthly_upload_remaining: int 104857600
#> $ team_only : logi FALSE
qiitrの関数
各APIへのバインディング関数は主に
qiita_(HTTPのメソッド)_(APIの名前っぽいやつ)
という感じの命名規則にしています。たとえば、先ほど使ったqiita_get_authenticated_user()
はGET /api/v2/authenticated_userに対応するものです。
以下、よく使いそうな関数をいくつかピックアップして紹介します。
qiita_get_items()
関数
qiita_get_items()
は、記事(item)の情報を取得するAPIです。item_id
で記事ID、tag_id
でタグID(例:"R"
、"SJIS"
)、user_id
でユーザID(例: "yutannihilation"
)が指定できます。複数の種類のIDを同時に指定することはできません。
per_pages
引数は、一度に取得する記事数です。page_limit
引数は、一度に取得する記事数を超えている場合に繰り返しデータを取得する最大回数です。デフォルトは、それぞれ100L
、1L
なので、100個までの記事を一度だけ取得します。例えば500件取得したい場合にはpage_limit = 5L
を指定します。
# get items by item ID
qiita_get_items(item_id = "7a78d897810446dd6a3b")
# get items by tag ID
qiita_get_items(tag_id = c("dplyr", "tidyr"), per_pages = 10L, page_limit = 1L)
# get items by user ID
qiita_get_items(user_id = "yutannihilation")
qiita_get_users()
関数
qiita_get_users()
はユーザ情報を取得します。
# get a user by id
qiita_get_users("yutannihilation")
ちなみに、指定したユーザがストックした記事を取得するのは別にqiita_get_stocks()
という関数を使います。
qiita_{follow,unfollow}_{user,tag}()
関数
これらの関数は、ユーザやタグをフォローまたはアンフォローします。実行にはwrite_qiita
(またはwrite_qiita_team
)の権限が必要です。
# follow a user
qiita_follow_user("user1")
# unfollow a user
qiita_unfollow_user("user1")
# follow a tag
qiita_follow_tag("RStudio")
# unfollow a tag
qiita_unfollow_tag("RStudio")
qiita_{post,update,delete}_item()
関数
qiita_post_item()
関数は、記事を投稿します。この関数は投稿した記事の情報を返すので、それを変数に保存しておけば投稿した記事のURLやIDをあとで参照することができます。なお、qiita_post_item()
で投稿される記事は、デフォルトでは非公開になります2。公開設定はこの関数の引数でもコントロールできますが、ブラウザから一度確認して、その上で公開することをオススメします。
qiita_update_item()
関数は、記事を更新します。qiita_delete_item()
関数は、記事を削除します。
# post an item
item <- qiita_post_item(title = "test", body = "This is an example.")
browseURL(item$url)
# update the item
qiita_update_item(item$id, title = "test", body = "**This is a strong example!**")
# delete the item
qiita_delete_item(item$id)
その他
これ以外の関数は以下のページで一覧を見ることができます。
ちなみに、Likeについては、パッケージ公開時点ではまだ存在しなかったので対応できていません。次期バージョンに含めるつもりです。
Qiita:Teamについて
Qiita:Teamに対して使う場合は、QIITA_URL
環境変数にそのURLを指定します。qiitrは、デフォルトではhttps://qiita.com/
に対してリクエストを投げますが、この環境変数が設定されていればそちらにリクエストを投げるようになります。.Renviron
に以下の行を追加しましょう。
QIITA_URL='(Qiita:TeamのURL)'
とはいえ、Qiita:Team専用のAPIについては対応していません(すみません...)。Qiita:Teamを使っている方からのpull requestをお待ちしています。
実例: ggplot2逆引きの記事数を可視化する
では試しに、話題のタグ、ggplot2逆引きを見てみましょう。
library(qiitr)
library(purrr)
library(ggplot2)
items <- qiita_get_items(tag_id = "ggplot2逆引き")
#> total count is 30 (= 1 pages)
# 各 item の .$user$id を取得
users <- map_chr(items, c("user", "id"))
d <- dplyr::data_frame(users = users)
ggplot(d, aes(users)) + geom_bar()
hoxo_bさんとkazutanさんが実力伯仲しています(2016年11月20日現在)。こんな感じでQiita APIからデータを引っ張ってきて分析すれば意外な事実が見えてきたりして楽しそうですね。
なにかあれば
GitHubのissuesかTwitterにお願いします。
GitHub: https://github.com/yutannihilation/qiitr/issues
Twitter: https://twitter.com/yutannihilation
-
環境変数を使う方法はhttrのBest practices for writing an API packageというドキュメントでも推奨されています。これは、入力したデータが作業ディレクトリの
.Rhistory
や.RData
に残ってしまう、というR言語の特徴ゆえです。環境変数を通じて受け渡すように心がけることで、.Rhistory
や.RData
をうっかりGitレポジトリにコミットしてしまった際にも機密情報の漏洩を最小限にとどめることができます(...とまではドキュメントには書いてないのでただの推測なんですけど)。 ↩ -
hoge
しか中身のないみたいな記事を公開すると運営から怒られます(経験者)。備えよう。 ↩