Qiita API サンプル

Qiita API を fetch API で叩くサンプルです。

# 環境

* ブラウザ：Google Chrome
* Qiita API： https://qiita.com/api/v2/docs

# JSON Schema の取得

```
fetch('https://qiita.com/api/v2/schema?locale=ja')
.then(response => response.json())
.then(data => console.log(data));
```

# データ取得系（GET）

## 認証不要

### ユーザーの投稿記事を取得 [api/v2/items](https://qiita.com/api/v2/docs#get-apiv2items)

```
fetch('https://qiita.com/api/v2/items')
  .then(response => response.json())
  .then(data => console.log(data));
```

```
#!/bin/bash

echo `curl 'https://qiita.com/api/v2/items'`
```

#### クエリ（ユーザー指定）

```
fetch('https://qiita.com/api/v2/items?query=qiita user:sy250f')
  .then(response => response.json())
  .then(data => console.log(data));
```

```get_item01.sh
#!/bin/bash

query='qiita user:sy250f'
function urlencode {
    echo "$1" | nkf -WwMQ | sed 's/=$//g' | tr = % | tr -d '\n'
}
urlencode "$query" | \
{
    encoded_query=$(cat) ;
    curl -s "https://qiita.com/api/v2/items?query=${encoded_query}"
}
```

```
$ ./get_item01.sh | jq '.[] | .title'
```

### 記事を指定して取得 [/api/v2/items/:item_id](https://qiita.com/api/v2/docs#get-apiv2itemsitem_id)

```
fetch('https://qiita.com/api/v2/items/c35aa4b1e8324c2bf21e')
  .then(response => response.json())
  .then(data => console.log(data));
```



## 認証必要

### 認証ユーザーの投稿記事を取得 [api/v2/authenticated_user/items](https://qiita.com/api/v2/docs#get-apiv2authenticated_useritems)

```
fetch('https://qiita.com/api/v2/authenticated_user/items',
{
  method: 'GET',
  credentials: 'include',
  headers: {
    'Content-Type': 'application/json',
     Authorization: 'Bearer <アクセストークン>'
  }
})
  .then(response => response.json())
  .then(data => console.log(data));
```

```get_item02.sh
#!/bin/bash

source ./.env
access_token="$ACCESSTOKEN"
auth="Authorization: Bearer ${access_token}"
curl -sH "${auth}" "https://qiita.com/api/v2/authenticated_user/items"
```

```
$ ./get_item02.sh | jq '.[] | .title'
$ ./get_item02.sh | jq '.[] | .title, .created_at, .id, .likes_count'
```


### 記事を指定して取得 [/api/v2/items/:item_id](https://qiita.com/api/v2/docs#get-apiv2itemsitem_id)

```
fetch('https://qiita.com/api/v2/items/c35aa4b1e8324c2bf21e',
{
  method: 'GET',
  credentials: 'include',
  headers: {
    'Content-Type': 'application/json',
     Authorization: 'Bearer <アクセストークン>'
  }
})
  .then(response => response.json())
  .then(data => console.log(data));
```

```get_item04.sh
#!/bin/bash

source ./.env
access_token="$ACCESSTOKEN"
auth="Authorization: Bearer ${access_token}"
curl -sH "${auth}" "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=5" | \
jq -r '.[] | [.id,.title] | @csv' | \
awk -v AUTH="${auth}" -F, \
'
{
    gsub("\"", "", $1)
    url = "https://qiita.com/api/v2/items/" $1
    cmd_curl = "-sH" " \"" AUTH "\" " "\"" url "\""
    system("curl "cmd_curl"")
    cmd_sleep = "sleep 5"
    system(cmd_sleep)
}
'
exit 0
```

```
$ ./get_item04.sh | jq -r '[.page_views_count, .title, .id, .created_at] | @csv'
69,"Qiita API サンプル","c35aa4b1e8324c2bf21e","2021-03-28T10:52:22+09:00"
118,"Salesforceの添付ファイルをkintoneに移行する具体的な方法について","147af9159ebac368e2a5","2021-03-26T13:20:57+09:00"
72,"kintone.proxy を IPアドレス制限の元で利用する際の注意点について","50cbfc84fbf5988b2d38","2021-03-20T20:56:33+09:00"
103,"cli-kintone を使った添付ファイルの移行方法のメモ","bb8b4323eb01b1ed820c","2021-03-10T22:16:27+09:00"
122,"awk スクリプト メモ","60b6b114372f9b26c1f9","2021-03-10T09:18:33+09:00"
```

```
$ ./get_item04.sh | jq -r '[.likes_count, .page_views_count, .title, .id, .created_at] | @csv'
0,69,"Qiita API サンプル","c35aa4b1e8324c2bf21e","2021-03-28T10:52:22+09:00"
0,118,"Salesforceの添付ファイルをkintoneに移行する具体的な方法について","147af9159ebac368e2a5","2021-03-26T13:20:57+09:00"
0,72,"kintone.proxy を IPアドレス制限の元で利用する際の注意点について","50cbfc84fbf5988b2d38","2021-03-20T20:56:33+09:00"
0,103,"cli-kintone を使った添付ファイルの移行方法のメモ","bb8b4323eb01b1ed820c","2021-03-10T22:16:27+09:00"
0,122,"awk スクリプト メモ","60b6b114372f9b26c1f9","2021-03-10T09:18:33+09:00"
```

### ユーザ情報を取得する [/api/v2/authenticated_user]() 
アクセストークンに紐付いたユーザ情報を取得する。

```get_authenticated_user.sh
#!/bin/bash

source ./.env
access_token="$ACCESSTOKEN"
auth="Authorization: Bearer ${access_token}"
curl -sH "${auth}" "https://qiita.com/api/v2/authenticated_user"
exit 0
```

```
$ ./get_authenticated_user.sh | jq  '.items_count'
129
```

# jq エラー

## 「jq: error (at <stdin>:0): Cannot index string with string "xxxx"」
jqで指定したJSONのキーが存在しない場合に出力される。

```
$ curl -sH "${auth}" "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=105" | jq
{
  "message": "Bad request",
  "type": "bad_request"
}

$ curl -sH "${auth}" "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=105" | \
jq -r '.[] | [.id,.title]'
jq: error (at <stdin>:0): Cannot index string with string "id"
```


# 参考

* [Qiita API](https://qiita.com/api/v2/docs)
* [認証認可](https://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E8%AA%8D%E5%8F%AF)
* [シェルスクリプトでシンプルにurlエンコードする話](https://qiita.com/ik-fib/items/cc983ca34600c2d633d5)