【QiitaAPI】「こんなタグも見ています」から広がる世界

## １．はじめに
Qiita初投稿！
プログラミング忘れかけの業務系エンジニアです。
活用法に重きを置きながら未経験の技術を学び、発信していきます。
私のような初学者の方の、励みや参考になると嬉しいです。

## ２．目的
私は「ネットショッピング大好きオタク」です。推しグッズを眺めていると「これが好きな人は、これにも興味があります」と、別グッズをオススメされます。その精度はなかなか高く、侮れません。

このことから、Qiita投稿内での「このタグを見ている人は、このタグにも興味があります」がわかると、新たな推し＝興味が持てそうなテーマが見つかるのでは？と思い当たりました。

また、派生して「このタグを見ている人が、なんで関連性の無さそうなこのタグも見ているの？」等を分析すれば、新たなアイデアや、ビジネスの種になりそうとも思い当たり、やってみることにしました。

## ３．対象技術・環境
Qiita API
Node-RED（FlowForge）

## ４．実証
### ４－１．仮定・前提
Node-RED経由でQiitaAPIを利用し、あるタグで投稿記事を抽出し、それらに付けられた他タグを一覧化できないかを試みます。

:::note info
**【流れ】
■ 「あるタグ」で投稿記事を抽出
■ それらの記事の投稿ユーザを抽出
■ そのユーザがフォローしているタグ一覧を作成
■ 結果・考察**
:::

### ４－２．実装
#### ■「あるタグ」で投稿記事を抽出
大好きなVTuber事務所「にじさんじ」タグを対象とします。
タグ「にじさんじ」含む記事件数、タグフォロー人数を取得してみます。
【API】GET /api/v2/tags/:tag_id

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/5e5cfd38-abcd-f4e5-0c18-f20416b103a4.png)

```JSON
[{"id":"1fdd85e0259ee4ef","type":"debug","z":"7025591709f734d0","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":670,"y":200,"wires":[]},{"id":"27a8a5945112dfeb","type":"function","z":"7025591709f734d0","name":"function 6","func":"msg.payload = msg.payload.id + 'のタグを含む記事は' + msg.payload.items_count + '件、'\n    + 'タグをフォローしているのは' + msg.payload.followers_count + '人です。' + msg.payload.users;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":200,"wires":[["1fdd85e0259ee4ef"]]},{"id":"3d34035b80e37f99","type":"http request","z":"7025591709f734d0","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/tags/にじさんじ","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":330,"y":200,"wires":[["27a8a5945112dfeb"]]},{"id":"576c1b8fc4d6912e","type":"inject","z":"7025591709f734d0","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":200,"wires":[["3d34035b80e37f99"]]}]
```

結果は、記事件数：6、タグフォロー人数：0 でした。
（今回の検証は手作業を挟むので、結果件数が多すぎるとつらいという理由から、このタグにしました。）

#### ■ それらの記事の投稿ユーザを抽出
次に、それらの記事情報を取得します。
【API】GET /api/v2/tags/:tag_id/items

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/4de67606-4e26-ba2f-d2b3-0f33e2235175.png)

```JSON
[{"id":"f9358a1ca22b0680","type":"debug","z":"7025591709f734d0","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":650,"y":200,"wires":[]},{"id":"9d345674f801498f","type":"http request","z":"7025591709f734d0","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/tags/にじさんじ/items","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":330,"y":200,"wires":[["f9358a1ca22b0680"]]},{"id":"f805ab8c73d50485","type":"inject","z":"7025591709f734d0","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":200,"wires":[["9d345674f801498f"]]}]
```

ドバドバとテキスト形式で記事情報が返されました。
この中で「"id":"」で検索すると、QiitaのユーザIDが取得できました。
（この検索部分を手作業で実施しました。ここを自動化できないと、大量件数処理は難しいですね。）

#### ■ そのユーザがフォローしているタグ一覧を作成

6記事投稿されていましたが5ユーザによる投稿でしたので、5ユーザについて、フォローしているタグ情報を取得しました。
【API】GET /api/v2/users/:id/following_tags

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/4de67606-4e26-ba2f-d2b3-0f33e2235175.png)

```JSON
[{"id":"c8c44605701d425b","type":"debug","z":"7025591709f734d0","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":670,"y":900,"wires":[]},{"id":"0b8161b32fe0c52b","type":"http request","z":"7025591709f734d0","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/users/ユーザID/following_tags","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":350,"y":900,"wires":[["c8c44605701d425b"]]},{"id":"adaa80bc39f7a35c","type":"inject","z":"7025591709f734d0","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":900,"wires":[["0b8161b32fe0c52b"]]}]
```

JSON中、実際のユーザIDを「ユーザID」に置き換えています。
このフローを5ユーザ分作成し、それぞれ実行しました。
（ユーザ一覧を読み込んでLOOP処理、みたいに自動化できないと、大量件数処理は難しいですね。）
フォローしている各タグについて、記事件数とタグフォロー人数が取得できました。

#### ■ 結果・考察
得られたのがこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/8c13004f-9074-3e9c-9aa4-c50e2701d199.png)

iPhone⇔iOS⇔Xcode／DeepLearanig⇔群知能　等は、各タグ間に関連性が見られますね。
「競技プログラミング」が目を引きます。別途調査してみたのですが、実務においてプログラミングメインで従事されている方にフォローされているようでした。「どんな人が見ている」も追っていけば、新たなアイデアや、ビジネスの種になりそうです。

今回、私の新たな推しテーマは…ちょっと見つからなかったですが、まとめる中で知らないワードもたくさんあって、勉強もできて一石二鳥でした。

## ５．おわりに
やりたいことに技術が追い付かず手作業も挟みながらでしたが、やり切りました。
すごいぞQiitaAPI！すごいぞNode-RED！もっといろんなことできそうですね。
大量データ処理に知見のある方がいらっしゃったら、アドバイスいただけると嬉しいです。
最後までお読みいただき、ありがとうございました！

### 参考
harinez2の猛進
(https://harinez2.hateblo.jp/entry/qiita_api_by_python)
*******************************************************************