Edited at

RからQiitaAPIを使うパッケージをつくりました。

More than 1 year has passed since last update.

RからQiita API v2を使うパッケージをつくり、CRANに公開しました。

qiitr: R Interface to Qiita API

https://yutannihilation.github.io/qiitr/

あまりテストできてないので、動作は色々あやしいかもしれません。何かあればGitHubのIssuesTwitterあたりで報告いただけるとありがたいです。


インストール

CRANで公開されているのでinstall.packages()でインストールできます。

install.packages("qiitr")


準備


個人用アクセストークンを発行

Qiita APIの利用にはアクセストークンが必要となります。まずは、https://qiita.com/settings/applicationsから個人用アクセストークンを生成してください。

権限のスコープは、Qiitaからデータを取得したいだけであればread_qiitaだけで大丈夫です。ユーザをフォローしたりコメントを投稿したいといった場合にはwrite_qiitaの権限も必要です。Qiita:Teamに対して操作をしたい場合(後述)はread_qiita_teamwrite_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引数は、一度に取得する記事数を超えている場合に繰り返しデータを取得する最大回数です。デフォルトは、それぞれ100L1Lなので、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)


その他

これ以外の関数は以下のページで一覧を見ることができます。

https://yutannihilation.github.io/qiitr/reference/index.html

ちなみに、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()

ggplot2gyaku.png

hoxo_bさんとkazutanさんが実力伯仲しています(2016年11月20日現在)。こんな感じでQiita APIからデータを引っ張ってきて分析すれば意外な事実が見えてきたりして楽しそうですね。


なにかあれば

GitHubのissuesかTwitterにお願いします。

GitHub: https://github.com/yutannihilation/qiitr/issues

Twitter: https://twitter.com/yutannihilation





  1. 環境変数を使う方法はhttrのBest practices for writing an API packageというドキュメントでも推奨されています。これは、入力したデータが作業ディレクトリの.Rhistory.RDataに残ってしまう、というR言語の特徴ゆえです。環境変数を通じて受け渡すように心がけることで、.Rhistory.RDataをうっかりGitレポジトリにコミットしてしまった際にも機密情報の漏洩を最小限にとどめることができます(...とまではドキュメントには書いてないのでただの推測なんですけど)。 



  2. hogeしか中身のないみたいな記事を公開すると運営から怒られます(経験者)。備えよう。