4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-10-22

1.はじめに

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

2.目的

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

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

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

3.対象技術・環境

Qiita API
Node-RED(FlowForge)

4.実証

4-1.仮定・前提

Node-RED経由でQiitaAPIを利用し、あるタグで投稿記事を抽出し、それらに付けられた他タグを一覧化できないかを試みます。

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

4-2.実装

■「あるタグ」で投稿記事を抽出

大好きなVTuber事務所「にじさんじ」タグを対象とします。
タグ「にじさんじ」含む記事件数、タグフォロー人数を取得してみます。
【API】GET /api/v2/tags/:tag_id

image.png

[{"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

[{"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

[{"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

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

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

5.おわりに

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

参考

harinez2の猛進
(https://harinez2.hateblo.jp/entry/qiita_api_by_python)


4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?