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
[{"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
[{"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
[{"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処理、みたいに自動化できないと、大量件数処理は難しいですね。)
フォローしている各タグについて、記事件数とタグフォロー人数が取得できました。
■ 結果・考察
得られたのがこちら。
iPhone⇔iOS⇔Xcode/DeepLearanig⇔群知能 等は、各タグ間に関連性が見られますね。
「競技プログラミング」が目を引きます。別途調査してみたのですが、実務においてプログラミングメインで従事されている方にフォローされているようでした。「どんな人が見ている」も追っていけば、新たなアイデアや、ビジネスの種になりそうです。
今回、私の新たな推しテーマは…ちょっと見つからなかったですが、まとめる中で知らないワードもたくさんあって、勉強もできて一石二鳥でした。
5.おわりに
やりたいことに技術が追い付かず手作業も挟みながらでしたが、やり切りました。
すごいぞQiitaAPI!すごいぞNode-RED!もっといろんなことできそうですね。
大量データ処理に知見のある方がいらっしゃったら、アドバイスいただけると嬉しいです。
最後までお読みいただき、ありがとうございました!
参考
harinez2の猛進
(https://harinez2.hateblo.jp/entry/qiita_api_by_python)