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

Rから[Qiita API v2](https://qiita.com/api/v2/docs)を使うパッケージをつくり、[CRANに公開](https://cran.r-project.org/package=qiitr)しました。

qiitr: R Interface to Qiita API
https://yutannihilation.github.io/qiitr/

あまりテストできてないので、動作は色々あやしいかもしれません。何かあれば[GitHubのIssues](https://github.com/yutannihilation/qiitr/issues)か[Twitter](https://twitter.com/yutannihilation)あたりで報告いただけるとありがたいです。

# インストール

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

```r
install.packages("qiitr")
```

# 準備

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

Qiita APIの利用にはアクセストークンが必要となります。まずは、[https://qiita.com/settings/applications](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`環境変数を設定することができます。

```r
library(qiitr)

qiita_set_accesstoken()
```

しかし、セッションをリセットするたびにこのコマンドを打つのは面倒です。ホームディレクトリ（`normalizePath("~/")`で確かめることができます）に`.Renviron`というファイルを作成して以下のラインを書いておけば、Rのセッション開始時に環境変数が設定されます。ちなみに、このファイルは最後が空行で終わっていないとエラーになるので注意してください。

```r
QIITA_ACCESSTOKEN = "アクセストークン"

```

アクセストークンが正しく設定されているか確認するには、現在の認証ユーザの情報を取得するコマンド`qiita_get_authenticated_user()`を打ってみてください。以下のような結果が返ってくれば成功です。

```r
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
```

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

## qiitrの関数

各APIへのバインディング関数は主に

```
qiita_（HTTPのメソッド）_（APIの名前っぽいやつ）
```

という感じの命名規則にしています。たとえば、先ほど使った`qiita_get_authenticated_user()`は[GET /api/v2/authenticated_user](http://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E4%B8%AD%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6)に対応するものです。

以下、よく使いそうな関数をいくつかピックアップして紹介します。

### `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`を指定します。

```r
# 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()`はユーザ情報を取得します。

```r
# get a user by id
qiita_get_users("yutannihilation")
```

ちなみに、指定したユーザがストックした記事を取得するのは別に`qiita_get_stocks()`という関数を使います。

### `qiita_{follow,unfollow}_{user,tag}()`関数

これらの関数は、ユーザやタグをフォローまたはアンフォローします。実行には`write_qiita`（または`write_qiita_team`）の権限が必要です。

```r
# 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()`関数は、記事を削除します。

[^2]: `hoge`しか中身のないみたいな記事を公開すると運営から怒られます（経験者）。備えよう。

```r
# 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`に以下の行を追加しましょう。

```r
QIITA_URL='(Qiita:TeamのURL)'
```

とはいえ、Qiita:Team専用のAPIについては対応していません（すみません...）。Qiita:Teamを使っている方からのpull requestをお待ちしています。

## 実例： ggplot2逆引きの記事数を可視化する

では試しに、話題のタグ、[ggplot2逆引き](http://qiita.com/tags/ggplot2%E9%80%86%E5%BC%95%E3%81%8D)を見てみましょう。

```r
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](https://qiita-image-store.s3.amazonaws.com/0/80093/9dcd34b8-37e7-f2bc-61db-bfca04859889.png)

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

# なにかあれば

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

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