はじめに
情報が溢れる世の中、なるべく効率的に目的のものを見つけたいという思いは皆さんあるかと思う。そこで、特定のテーマに関連するQiitaの記事から、タイトルといいね数だけを抽出して、効率よく閲覧できる仕組みを構築したいと考えた。
やってみたいこと
・今回は、Qiitaから『顔認証』についての記事を探す
・タイトルといいね数を抽出し、一目で人気の記事が分かるようにしたい
Node-REDを活用
Node-REDで、Qiitaの顔認証の記事をピックアップしてみることにした。
・HTTPリクエストノード
QiitaのAPIを使用して特定のクエリに基づいてアイテム(記事)を検索する。https://qiita.com/api/v2/items というURLは、パラメーターに検索クエリを設定することで、特定のキーワードを含む記事を取得することが可能である。
・Functionノード
検索クエリに含まれる日本語や特殊文字をURLエンコードする必要がある。そこで、Functionノードを使って、msg.query = encodeURI("顔認証"); を実行することで、msg.query にエンコードされた検索キーワードが代入される仕組みを作る。
Node-REDのフロー
ソースコード
Qiita記事の中から、『顔認証』をキーワードに、functionノードとHTTP requestノードを活用して、関連記事のデータを取得してみた。
[{"id":"399e10a81a36c4df","type":"inject","z":"e40ef36cdbd7d416","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":480,"wires":[["e6f017bb337c2fce"]]},{"id":"e6f017bb337c2fce","type":"function","z":"e40ef36cdbd7d416","name":"function 4","func":"msg.query = encodeURI(\"顔認証\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":140,"y":560,"wires":[["ba8d10fe4c87eae2"]]},{"id":"ba8d10fe4c87eae2","type":"http request","z":"e40ef36cdbd7d416","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/items?query='{{{query}}}","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":310,"y":560,"wires":[["0a214efff857c35f"]]}]
タイトルといいね数だけ抽出する
次に、タイトルといいね数だけを抽出することにした。web上で公開されていたコードを参考に作成してみたところ抽出できた。
[{"id":"0a214efff857c35f","type":"function","z":"e40ef36cdbd7d416","name":"function 5","func":"// レスポンスから記事の情報を取得\nvar articles = msg.payload;\n\n// 記事ごとにタイトルといいね数を抽出して新しい配列に格納\nvar extractedData = articles.map(function (article) {\n return {\n title: article.title,\n likes: article.likes_count\n };\n});\n\n// 抽出された情報を新しいメッセージにセットして出力\nmsg.payload = extractedData;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":560,"wires":[["478a25efaebae2ea"]]}]
JavaScriptコードの説明
var articles = msg.payload;
articlesには、Qiitaから取得した記事情報の配列が代入され、msg.payloadにセットして返す
var extractedData = articles.map(function (article) {
return {
title: article.title,
likes: article.likes_count
};
});
articles.map(function (article) {...}) は、配列 articles の各要素に対して関数を適用し、その結果を新しい配列 extractedData として返す。
return { title: article.title, likes: article.likes_count }; では、各記事の title プロパティと likes_count プロパティを抽出し、新しいオブジェクト { title, likes } として返す。
この結果、extractedData には、記事ごとのタイトルといいね数だけを含むオブジェクトの配列が格納される。
結果
特定のキーワードが含まれる記事を抽出し、タイトルといいね数を表示させることができた!注目されている記事を効率よく閲覧するため、いいね数順に並び替えたり、リンクを作成する等、発展の余地はまだまだある。(今回はここまで)