はじめに
入社15日目、Qiitaを使い始めて3日目、もっとしっかりQiitaを使いこなしたいと思い、どのような人が上げるどのような記事が一番需要があるのか、ということをまず調べてみたいと思った。その中でユーザーランキングの右に表示されているContributionsという数字に注目することにした。
ヘルプの説明にある通り、Contribution (コントリビューション) とは貢献度を意味しQiitaコミュニティでの貢献活動を表した指標だ。その計算方法として書いた記事に対していいねやストックされた回数、また記事投稿、コメント、編集リクエスト、質問、回答などが数値化されて総合的な評価がされている。
このコントリビューションを用いて、数値が高いユーザーの共通点などについて調べていきたいと思った。しかしそこで、コントリビューションを表示するQiitaのAPIがないことに気づいた!そこで面白そうなのでコントリビューションを表示するAPIを自分で作ってみることにした!(出来なかった。。。)
とは言ってもそもそも何から始めればいいかもわからない。家帰ってネットフリックスみたい
ユーザー環境・言語等
Node-RED v2.2.3
Qiita API
JavaScript
いざ計画!
コントリビューションの値は直接取得できないものの、項目に含まれているいいねの数など個別では値を取得できる処理が存在する。各項目に対応した処理を使い最終的なAPIの完成を目指していく。
いいね数編
1.特定のユーザーの記事についているいいねの数を数える処理を作る
2.上記で作ったAPIを用い特定のユーザーの記事すべてに同じ処理をできるようにする
3.最後にすべての記事のいいねの数を合計する
上記の工程をコントリビューションの各項目で行っていく
それらすべての工程を終えたら、各項目に対して加算されるポイントを計算しその値の合計がコントリビューションの値となる。
実際に作っていく
1.特定のユーザーの記事のいいねを数える処理を作る
はじめに、ある記事につけられたいいねの数を数える処理を作っていく。QiitaAPIのホームページから記事につけられた「いいね」を作成日時の降順で返す処理を用いてその記事についているいいねの数を出していく。
今回は総コントリビューションの数値トップの@jnchitoさんのこの記事で試してみたい。
↓
[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか
上記の記事のいいねの数を求めていく処理を作成したのが次になる。
JSONで書き出したものが
[{"id":"a44e12b7daedb3bc","type":"inject","z":"a684cee9a082bc8a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":640,"wires":[["aaaa76f28cb9e798"]]},{"id":"623972cc559fcbd8","type":"debug","z":"a684cee9a082bc8a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1030,"y":640,"wires":[]},{"id":"aaaa76f28cb9e798","type":"http request","z":"a684cee9a082bc8a","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/items/dedb3b889ab226933ccf","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"x":450,"y":640,"wires":[["623972cc559fcbd8"]]}]
しかし、このままではこの記事に関する様々な情報がデータとして返ってきており、いいね数をこの中から取り出していく必要がある。
ここでラッキーな発見が!いいねの数だけを求めようとしていたが、同時にストック数まで表示されることが分かった。
そこで次にこの表示されているデータの中からいいね・ストック両方の数を摘出していきたい。
上記のフローからいいね・ストックの数を摘出するフローがこちら
また、JSONで書き出したものがこちら
[{"id":"a44e12b7daedb3bc","type":"inject","z":"a684cee9a082bc8a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":640,"wires":[["aaaa76f28cb9e798"]]},{"id":"623972cc559fcbd8","type":"debug","z":"a684cee9a082bc8a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1170,"y":640,"wires":[]},{"id":"aaaa76f28cb9e798","type":"http request","z":"a684cee9a082bc8a","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/items/dedb3b889ab226933ccf","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"credentials":{},"x":470,"y":640,"wires":[["6ec8a74de90f3836","1a92a95b462d4ad2"]]},{"id":"6ec8a74de90f3836","type":"function","z":"a684cee9a082bc8a","name":"いいねの数","func":"msg.payload = msg.payload.likes_count;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":830,"y":640,"wires":[["623972cc559fcbd8"]]},{"id":"1a92a95b462d4ad2","type":"function","z":"a684cee9a082bc8a","name":"ストックの数","func":"msg.payload = msg.payload.stocks_count;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":840,"y":700,"wires":[["8b30817d6dd3fe91"]]},{"id":"8b30817d6dd3fe91","type":"debug","z":"a684cee9a082bc8a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1170,"y":700,"wires":[]}]
上記の作業で、ある特定の記事からいいね・ストックの数を出すことに成功した!
2.次に特定のユーザーのすべての記事に、先ほど作成した処理を実行できるようにする
そのためにはあるユーザーのすべての記事を呼び出し、先ほど作成した処理にループ処理を用いすべてのいいね・ストックの数を出していきたい。
しかし、ここで問題が。
どのようにしてすべての記事のいいね・ストックの数を出せばいいのかがわからない。
このフローを用いることでデータを取得できると思っていたがうまくいかなかった。
手も足も出なくなったので一回先に進めてループ処理を作ることにした。
参考;enebularでif分岐やwhileループのようなデータの流れを組むときのTIPS
これでループ処理が完成し記事のいいね・ストック数を論理的にはすべて出していけるようになった。
次に、出たすべての数値を合計するためにCalculatorというノードを追加する。
参考:node-red-contrib-calcノードを使って、よくある計算処理を気軽に組んでみる
この処理を先ほど作ったループフローの処理の最後に付けるといいね・ストックの総数が出るようになる。
しかしユーザーの総記事の読み込みとそれをこのフローに落とし込む知識も技術も不足しており、現時点ではこれが限界だ。
結論
今回の結果では、力不足や要領の悪さということもありここまでしかできなかったが、この作業を繰り返していけば最終的にQiitaのコントリビューションを数えるAPIを作れる未来がわずかに見えた(ほぼ見えてない)。
大学時代コードを学んだことがなく入社して日にちの浅い私にはローコードといえど仕組みや考え方を身に付けるのに時間がかかった。特に出だしのいいねの数を数える処理を作る際、直接この処理を行えるAPIは存在しなかったがある記事のデータを取得できるAPIは存在し、そこから欲しいデータを引っ張ってくるという発想が必要だった。はじめは欲しいデータのことしか考えられず、周りからアドバイスをもらうまで発想の転換ができなかった。
今回学んだこと
自分が作ってみたいものと自分が実際作れるもののギャップが想像以上に大きいことが分かった。また、ネットで自分が欲しい情報をどのように検索すれば正確に出てくるのかということにも苦戦した。ネットに情報があふれてるからこそほんとに欲しい情報を調べられる正確な検索能力も今後鍛えていきたい。
ほとんどの時間うまくいかずしんどさやイライラが上回っていたが、ローコードといえど自分が作りたいものができたときには何とも言えない達成感を感じた。
まだまだ何もわからない新人のぺーぺーだが、一歩一歩前進していきたい。