自分たちが関わっているサービスに関する世の中からのフィードバックを確認することは、そのアプリのマーケットでの立ち位置の把握や開発チームのモチベーションを維持する上で重要です。
iOSであればAppStore、AndroidであればGoogle Play上でユーザから5段階評価とコメントが載せられています。
ここの情報をチャット上に日時で通知する仕組みを作ってみたのでまとめます。
Nodeのモジュールでスクレイピング結果を取得する
いろいろ検索してみたら、ちょうどよさそうなnpmモジュールがあったので、Node.jsで書くことにしました。
www.npmjs.com
www.npmjs.com
こんな感じでアプリケーションのIDと言語を指定するだけでスクレイピング結果をJSONオブジェクトとして取得できます。今回はサンプルとしてChromeアプリを使います。
const store = require('app-store-scraper');
const iosAppId = '535886823';
const iosReview = store.app({id: iosAppId, country: 'jp'});
iosReview.then(function(value){
console.log(value);
});
{
id: 535886823,
appId: 'com.google.chrome.ios',
title: 'Google Chrome - ウェブブラウザ',
url: 'https://apps.apple.com/jp/app/google-chrome-%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6/id535886823?uo=4',
description: 'パソコンだけでなく iPhone や iPad でも、Google Chrome ブラウザを使って高速なブラウジングが可能です。端末が変わっても同じところから再開できるほか、音声検索を行ったり、他の言語で書かれたウェブページを簡単に読んだりすることもできます。\n' +
'\n' +
'• 端末間での同期 - ノートパソコン、スマートフォン、タブレットなど使用する端末が変わっても、同じタブやブックマークを利用できます。\n' +
'• より高速になったブラウジング - 入力と同時に表示される検索結果から選択でき、以前に表示したページをすばやく表示できます。\n' +
'• 音声検索 - Google の音声検索を使って、文字を入力せずにすばやく検索できます。\n' +
'• 翻訳 - あらゆる言語のウェブページを簡単に読むことができます。\n' +
'• タブ数の制限なし - タブをいくつでも開くことができ、カードをめくるようにタブを切り替えることができます。\n' +
'• プライバシー - シークレット モードを使用して履歴を残さずにブラウジングできます(詳しくは http://goo.gl/WUx02 をご覧ください)。',
icon: 'https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/9b/ad/9e/9bad9eb3-a6b5-92ea-dcf7-25ee873850ac/source/512x512bb.jpg',
genres: [ 'ユーティリティ', '仕事効率化' ],
genreIds: [ '6002', '6007' ],
primaryGenre: 'Utilities',
primaryGenreId: 6002,
contentRating: '17+',
languages: [
'AR', 'BG', 'CA', 'HR', 'CS', 'DA',
'NL', 'EN', 'FI', 'FR', 'DE', 'EL',
'HE', 'HI', 'HU', 'ID', 'IT', 'JA',
'KO', 'LT', 'MS', 'NB', 'FA', 'PL',
'PT', 'RO', 'RU', 'SR', 'ZH', 'SK',
'ES', 'SV', 'TH', 'ZH', 'TR', 'UK',
'VI'
],
size: '72178688',
requiredOsVersion: '12.0',
released: '2012-06-28T19:57:38Z',
updated: '2020-02-10T20:28:58Z',
releaseNotes: 'Chrome をご利用いただきありがとうございます。このバージョンの新機能は以下のとおりです。\n' +
'• アドレスバーに検索語句を入力し始めると、上位の候補が表示されます。これらの候補はデバイスにローカルに配信されるもので、シークレット モードでも表示されます。',
version: '80.0.3987.95',
price: 0,
currency: 'JPY',
free: true,
developerId: 281956209,
developer: 'Google LLC',
developerUrl: 'https://apps.apple.com/jp/developer/google-llc/id281956209?uo=4',
developerWebsite: 'http://www.google.com/chrome/',
score: 3,
reviews: 15994,
currentVersionScore: 3.5,
currentVersionReviews: 85,
screenshots: [
'https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/da/13/81/da1381da-b111-c5b7-9d76-ccc0389d2f20/pr_source.png/392x696bb.png',
'https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/fe/33/fa/fe33fa14-e9b3-31d9-a65a-16a0a978f99d/pr_source.png/392x696bb.png',
'https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/a4/5a/78/a45a786d-c20c-0ff8-b4f8-9558c4fbb796/pr_source.png/392x696bb.png',
'https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/57/3f/0c/573f0c51-600f-a0da-5c1f-eb4de3741389/pr_source.png/392x696bb.png',
'https://is5-ssl.mzstatic.com/image/thumb/Purple113/v4/ad/c4/22/adc42210-deca-6afd-820f-ccd99843c392/pr_source.png/392x696bb.png',
'https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/7d/71/53/7d715397-93ab-1ae3-9533-e195655ca6b2/pr_source.png/392x696bb.png',
'https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/ca/60/09/ca6009cd-c65d-58d9-6bf9-316b9dee1993/pr_source.png/392x696bb.png',
'https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/40/43/99/40439981-5ca6-94b5-3a8b-82bddb367f94/pr_source.png/392x696bb.png',
'https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/e0/da/0a/e0da0a7f-1a4a-168d-b0ea-f96881ec4198/pr_source.png/392x696bb.png',
'https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/06/b1/3a/06b13ab6-d14a-53c8-d185-0087261df8f0/pr_source.png/392x696bb.png'
],
ipadScreenshots: [
'https://is2-ssl.mzstatic.com/image/thumb/Purple113/v4/eb/8f/e7/eb8fe79c-9bc2-f325-a3db-6fc6369072c4/pr_source.png/576x768bb.png',
'https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/cc/0f/c2/cc0fc214-f1c6-9899-e7c8-3ed24d2fd5e7/pr_source.png/576x768bb.png',
'https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/a4/cb/e1/a4cbe1fd-f8e8-49f2-bc37-7a013691a84f/pr_source.png/576x768bb.png',
'https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/f5/9d/e8/f59de840-82de-323b-94c7-1cff67e41b1f/pr_source.png/576x768bb.png',
'https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/db/19/ae/db19aef2-eee3-9f34-1073-a1b3da24a157/pr_source.png/576x768bb.png',
'https://is5-ssl.mzstatic.com/image/thumb/Purple123/v4/f8/70/77/f870771f-d87b-b102-e35a-3c60d6ad80e0/pr_source.png/576x768bb.png',
'https://is4-ssl.mzstatic.com/image/thumb/Purple123/v4/a9/08/7e/a9087e99-243b-808d-76f5-45cadf8f52b7/pr_source.png/576x768bb.png',
'https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/e5/c0/e9/e5c0e904-0be4-6647-ff6d-f7d23975f67f/pr_source.png/576x768bb.png',
'https://is1-ssl.mzstatic.com/image/thumb/Purple113/v4/ea/90/be/ea90befc-19e5-98f3-bbad-0b566092b1f8/pr_source.png/576x768bb.png',
'https://is2-ssl.mzstatic.com/image/thumb/Purple123/v4/41/e4/82/41e48215-4b8d-fbad-568d-78209896bfa8/pr_source.png/576x768bb.png'
],
appletvScreenshots: [],
supportedDevices: [
'iPhone5s-iPhone5s',
'iPadAir-iPadAir',
'iPadAirCellular-iPadAirCellular',
'iPadMiniRetina-iPadMiniRetina',
'iPadMiniRetinaCellular-iPadMiniRetinaCellular',
'iPhone6-iPhone6',
'iPhone6Plus-iPhone6Plus',
'iPadAir2-iPadAir2',
'iPadAir2Cellular-iPadAir2Cellular',
'iPadMini3-iPadMini3',
'iPadMini3Cellular-iPadMini3Cellular',
'iPodTouchSixthGen-iPodTouchSixthGen',
'iPhone6s-iPhone6s',
'iPhone6sPlus-iPhone6sPlus',
'iPadMini4-iPadMini4',
'iPadMini4Cellular-iPadMini4Cellular',
'iPadPro-iPadPro',
'iPadProCellular-iPadProCellular',
'iPadPro97-iPadPro97',
'iPadPro97Cellular-iPadPro97Cellular',
'iPhoneSE-iPhoneSE',
'iPhone7-iPhone7',
'iPhone7Plus-iPhone7Plus',
'iPad611-iPad611',
'iPad612-iPad612',
'iPad71-iPad71',
'iPad72-iPad72',
'iPad73-iPad73',
'iPad74-iPad74',
'iPhone8-iPhone8',
'iPhone8Plus-iPhone8Plus',
'iPhoneX-iPhoneX',
'iPad75-iPad75',
'iPad76-iPad76',
'iPhoneXS-iPhoneXS',
'iPhoneXSMax-iPhoneXSMax',
'iPhoneXR-iPhoneXR',
'iPad812-iPad812',
'iPad834-iPad834',
'iPad856-iPad856',
'iPad878-iPad878',
'iPadMini5-iPadMini5',
'iPadMini5Cellular-iPadMini5Cellular',
'iPadAir3-iPadAir3',
'iPadAir3Cellular-iPadAir3Cellular',
'iPodTouchSeventhGen-iPodTouchSeventhGen',
'iPhone11-iPhone11',
'iPhone11Pro-iPhone11Pro',
'iPadSeventhGen-iPadSeventhGen',
'iPadSeventhGenCellular-iPadSeventhGenCellular',
'iPhone11ProMax-iPhone11ProMax'
]
}
Google Playの場合
const gplay = require('google-play-scraper');
const androidAppId = 'com.android.chrome';
const androidReview = gplay.app({appId: androidAppId, lang: 'ja', country: 'jp'})
androidReview.then(function(value){
console.log(value);
});
{
title: 'Google Chrome: 高速で安全',
description: 'Google Chrome は高速で使いやすく、安全なウェブブラウザです。Android 向けに設計されており、カスタマイズされたニュース記事、お気に入りのサイトへのリンク、ダウンロード、Google 検索、Google 翻訳などを利用できます。ぜひ Chrome ウェブブラウザをダウンロードして、お使いのすべての端末で同じ環境を利用できる快適さを味わってみてください。\r\n' +
' \r\n' +
'高速なブラウジングと入力の簡略化。入力を始めるとカスタマイズされた検索結果がすぐに表示されるので、選択するだけで以前表示したことのあるウェブページに簡単にアクセスできます。また、自動入力機能により、フォームにすばやく入力できます。\r\n' +
' \r\n' +
'シークレット モードでのブラウジング。シークレット モードを使用すると、履歴を残さずにインターネットを閲覧できます。シークレット モードはどの端末でも利用可能です。\r\n' +
' \r\n' +
'端末間で Chrome を同期。 Chrome にログインすると、ブックマーク、パスワード、設定がお使いの端末すべてで自動的に同期されます。そのため、スマートフォン、タブレット、ノートパソコンから、あらゆる情報にシームレスにアクセスできます。\r\n' +
' \r\n' +
'お気に入りのコンテンツをワンタップで表示可能。Chrome では Google 検索を迅速に実行できるだけでなく、お気に入りのコンテンツにもワンタップでアクセス可能です。新しいタブページから直接、お気に入りのニュースサイトやソーシャル メディアをタップできます。また、Chrome を使用すると、すべてのウェブページで「タップして検索」機能を利用できます。語句をタップすると、同じページを表示したまま Google 検索を実行できます。\r\n' +
' \r\n' +
'Google セーフ ブラウジングでスマートフォンを保護。Chrome には Google セーフ ブラウジング機能が組み込まれています。危険なサイトにアクセスしたり、危険なファイルをダウンロードしたりしようとすると警告が表示され、スマートフォンが保護されます。\r\n' +
' \r\n' +
'ウェブページや動画を高速でダウンロードし、オフラインで表示。Chrome には専用のダウンロード ボタンが用意されており、ワンタップで動画や画像、さらにはウェブページ全体を簡単にダウンロードできます。また、Chrome の [ダウンロード] メニューを使用すれば、オフライン時にもダウンロード済みのすべてのコンテンツにアクセス可能です。 \r\n' +
' \r\n' +
'Google 音声検索。Chrome は音声検索に対応したウェブブラウザです。移動中や作業中など、手で入力することなく音声で検索をすることができます。これにより、いつでもどこでも閲覧や操作をすばやく行えるようになります。\r\n' +
' \r\n' +
'組み込みの Google 翻訳でウェブページ全体をすばやく翻訳。Chrome には Google 翻訳が組み込まれているため、ワンタップでウェブページ全体をご利用の言語に翻訳することができます。\r\n' +
' \r\n' +
'モバイルデータ使用量の節約。Chrome のデータセーバーをオンにすると、データ使用量を抑えながらウェブを閲覧、操作できます。Chrome により、テキスト、画像、動画、ウェブサイトが画質を低下させることなく圧縮されるため、最大 60% のデータが削減されます。データセーバーはスマートな機能でもあります。\r\n' +
' \r\n' +
'スマートにカスタマイズされたおすすめ。Chrome では、ユーザーの興味や関心に合わせてカスタマイズが行われます。新しいタブページでは、これまでの閲覧履歴に基づいて選択された記事が表示されます。',
descriptionHTML: 'Google Chrome は高速で使いやすく、安全なウェブブラウザです。Android 向けに設計されており、カスタマイズされたニュース記事、お気に入りのサイトへのリンク、ダウンロード、Google 検索、Google 翻訳などを利用できます。ぜひ Chrome ウェブブラウザをダウンロードして、お使いのすべての端末で同じ環境を利用できる快適さを味わってみてください。<br> <br><b>高速なブラウジングと入力の簡略化。</b>入力を始めるとカスタマイズされた検索結果がすぐに表示されるので、選択するだけで以前表示したことのあるウェブページに簡単にアクセスできます。また、自動入力機能により、フォームにすばやく入力できます。<br> <br><b>シークレット モードでのブラウジング。</b>シークレット モードを使用すると、履歴を残さずにインターネットを閲覧できます。シークレット モードはどの端末でも利用可能です。<br> <br><b>端末間で Chrome を同期。</b> Chrome にログインすると、ブックマーク、パスワード、設定がお使いの端末すべてで自動的に同期されます。そのため、スマートフォン、タブレット、ノートパソコンから、あらゆる情報にシームレスにアクセスできます。<br> <br><b>お気に入りのコンテンツをワンタップで表示可能。</b>Chrome では Google 検索を迅速に実行できるだけでなく、お気に入りのコンテンツにもワンタップでアクセス可能です。新しいタブページから直接、お気に入りのニュースサイトやソーシャル メディアをタップできます。また、Chrome を使用すると、すべてのウェブページで「タップして検索」機能を利用できます。語句をタップすると、同じページを表示したまま Google 検索を実行できます。<br> <br><b>Google セーフ ブラウジングでスマートフォンを保護。</b>Chrome には Google セーフ ブラウジング機能が組み込まれています。危険なサイトにアクセスしたり、危険なファイルをダウンロードしたりしようとすると警告が表示され、スマートフォンが保護されます。<br> <br><b>ウェブページや動画を高速でダウンロードし、オフラインで表示。</b>Chrome には専用のダウンロード ボタンが用意されており、ワンタップで動画や画像、さらにはウェブページ全体を簡単にダウンロードできます。また、Chrome の [ダウンロード] メニューを使用すれば、オフライン時にもダウンロード済みのすべてのコンテンツにアクセス可能です。 <br> <br><b>Google 音声検索。</b>Chrome は音声検索に対応したウェブブラウザです。移動中や作業中など、手で入力することなく音声で検索をすることができます。これにより、いつでもどこでも閲覧や操作をすばやく行えるようになります。<br> <br><b>組み込みの Google 翻訳でウェブページ全体をすばやく翻訳。</b>Chrome には Google 翻訳が組み込まれているため、ワンタップでウェブページ全体をご利用の言語に翻訳することができます。<br> <br><b>モバイルデータ使用量の節約。</b>Chrome のデータセーバーをオンにすると、データ使用量を抑えながらウェブを閲覧、操作できます。Chrome により、テキスト、画像、動画、ウェブサイトが画質を低下させることなく圧縮されるため、最大 60% のデータが削減されます。データセーバーはスマートな機能でもあります。<br> <br><b>スマートにカスタマイズされたおすすめ。</b>Chrome では、ユーザーの興味や関心に合わせてカスタマイズが行われます。新しいタブページでは、これまでの閲覧履歴に基づいて選択された記事が表示されます。',
summary: '高速、シンプル、安全な Google Chrome ブラウザは Android 搭載のスマートフォンまたはタブレットに対応しています。',
installs: '5,000,000,000+',
minInstalls: 5000000000,
score: 4.37247,
scoreText: '4.4',
ratings: 19194380,
reviews: 5620917,
histogram: {
'1': 1462051,
'2': 547080,
'3': 1115836,
'4': 2323929,
'5': 13745480
},
price: 0,
free: true,
currency: 'USD',
priceText: 'Free',
offersIAP: false,
IAPRange: undefined,
size: 'デバイスにより異なります',
androidVersion: 'VARY',
androidVersionText: 'デバイスにより異なります',
developer: 'Google LLC',
developerId: '5700313618786177705',
developerEmail: 'apps-help@google.com',
developerWebsite: 'http://www.google.com/chrome/android',
developerAddress: '1600 Amphitheatre Parkway, Mountain View 94043',
privacyPolicy: 'http://www.google.com/chrome/intl/en/privacy.html',
developerInternalID: '5700313618786177705',
genre: '通信',
genreId: 'COMMUNICATION',
familyGenre: undefined,
familyGenreId: undefined,
icon: 'https://lh3.googleusercontent.com/KwUBNPbMTk9jDXYS2AeX3illtVRTkrKVh5xR1Mg4WHd0CG2tV4mrh1z3kXi5z_warlk',
headerImage: 'https://lh3.googleusercontent.com/5nRZOy3n3H4mICDrZknW5f4xtv9O_zhhWcTuBPs9CXUXQgmhR07DK4N87v1qAf58TqRj',
screenshots: [
'https://lh3.googleusercontent.com/mZaM8zI4XBmlyd-26EBPrzKN7Apqutjm9_sjBgxFNZgcQ_dnCs9eNQIKPWsotIziVX8',
'https://lh3.googleusercontent.com/XOllOGcjqDx_SZO4S-b_OT-EUXALXTdQU-wC88mHVEpFFu4__-FIVVnDVl4C0pZtSwA',
'https://lh3.googleusercontent.com/zmv6wcH8r8V65zgBPOFA9MF4J45lv87zJjO_93ZjPVqGl9DV9YIbVq5IR3BsF1dSVqgA',
'https://lh3.googleusercontent.com/9H2H9v0c_Q8NJKDifV2U7yYL096LIkY9YxtE_oM3pwX4ADqMa9ihCW9SbDmrdDYsKH_Y',
'https://lh3.googleusercontent.com/nDlYAg3g4B_bYk1zq4ooZ4bXOAAn9VhZcRY6XE9yiy7zFaxgGWPnRR5xGZ0JpVV4bq0',
'https://lh3.googleusercontent.com/hFoaupAwXWdbgMoLSdD4Nxl4VKpC0qjCSrbgv3D8NtL2fuTT7Arji8y0v08S1mN9zUw',
'https://lh3.googleusercontent.com/md1TIQGdXAJQdCz4uyLuzdH0IiAII7oB2U-mtmS6eCntIDEgkLhIYzqTaSWDmq9cMg',
'https://lh3.googleusercontent.com/CEAssI7unxwTrRz_2p9pD7omlmtNSWROT5ODFEe8ZNm5DhTcR5YMcZhEcM3BQP9hpw',
'https://lh3.googleusercontent.com/MP4rgCMckdOjCmv_bu6IoMyg-j-lH6NFHW58bJ81j3mgdunamWjiEJkv61kunrMj-ERP',
'https://lh3.googleusercontent.com/27q5Qt_ExGXTxdqa_UKritoDltfYSadTyW0vVfroEFxPOye1WleMIt4Vo9lDIeXWVf8',
'https://lh3.googleusercontent.com/B3nrjcwtT1T23nv-hjvipvH6APH65QCBH9lm4uhnCwEb82W3scJ1aRVL19W5lTubehg',
'https://lh3.googleusercontent.com/eNLie1A18N1nBms-Y4nAiUr1zjsRdeMeDL682awFWVpiqnWN5mIaLH_D2IUeUPctEI4',
'https://lh3.googleusercontent.com/KHcs8_73VG-gfum8HwGeGi66tSGiLbcQnEPzwQPDZjZyjsUoPd5gK7JO1SodEUKFjw',
'https://lh3.googleusercontent.com/hPSXZ8OApMMzRV3gypOMrC0yY59qdIBtD8mRaphOENCM_04y71U70Y5nn_-Gnw35nEk',
'https://lh3.googleusercontent.com/jY1n4GLXLx0bmrwEwJPfuGrZo_D1PgFRGSo_mFFVGvOjcG1F32xhPqHUCsOBx9v6KKf7',
'https://lh3.googleusercontent.com/YoOWCeDKdnsCFEaaPIeG24YSzyKiY3-vXkVajEJ52ORaX3N4RzP7gv4McBHqnJYhWw',
'https://lh3.googleusercontent.com/FLaTKxw612Lw66v0CX8_9oXGUjDu7etT89piyPuBROMZ6tYw1gTMH485a75xI9APyeU',
'https://lh3.googleusercontent.com/JUoMIoFw4sy6w0u_GTngpUR8ITbEq3Fss_b6wHQdUde7G7E5WTnHEmkdUPZ7sk19FO1W',
'https://lh3.googleusercontent.com/Fzl-KajE6Qtcpjgf66BwFB7VObdhcBoLtb4xYKrLxQ_H4701KaOvgPwnSgg5nvP7rQ',
'https://lh3.googleusercontent.com/4S1CUuHL1ZOC3Ma_KpD-DpH5Ln_E-5MN7LEIMHSEd8xysHcbhZ4GdMaFfmlZmguf5Q'
],
video: undefined,
videoImage: undefined,
contentRating: '3 歳以上',
contentRatingDescription: undefined,
adSupported: false,
released: '2012/02/07',
updated: 1582234282000,
version: 'デバイスにより異なります',
recentChanges: 'Chrome をご利用いただきありがとうございます。このリリースでは、次の機能を追加するとともに、安定性とパフォーマンスの改善を行いました。<br><br>• 通知の干渉を軽減: 新しい許可オプションを使用して、通知リクエストの表示数を減らすことができます。<br>• SameSite Cookie: Cookie はデフォルトで同一サイトのものとしてのみ処理されます。<br>• メディアの保護: 保護されているページの安全でない音声と動画は、自動的に安全な接続にアップグレードされます。',
comments: [],
appId: 'com.android.chrome',
url: 'https://play.google.com/store/apps/details?id=com.android.chrome&hl=ja&gl=jp'
}
Androidの方はscore
でGoogle Playで表示されている値がとれそうですが、iOSの方はappではscore
の値は0.5刻みで丸め込まれているようなので、ratingsから自分で平均点を計算します。
const store = require('app-store-scraper');
const iosAppId = '535886823';
const iosRatings = store.ratings({id: iosAppId, country: 'jp'});
iosRatings.then(function(value){
console.log(value);
var rate = (1*value['histogram']['1'] + 2*value['histogram']['2']
+ 3*value['histogram']['3'] + 4*value['histogram']['4'] + 5*value['histogram']['5']) / value['ratings'];
console.log(rate);
});
結果
{
ratings: 8103,
histogram: { '1': 1998, '2': 918, '3': 1269, '4': 1426, '5': 2492 }
}
3.184622979143527
チャットへPOSTする
あとはこの結果をSlackやMattermostへ連携するだけです。それぞれWebhookのURLを発行し、POSTのリクエストを組めばOKです。
slack.com
docs.mattermost.com
今回はMattermost用に作っていて、Slackでも使えるように拡張しようと調べたときに気づいたのですが、Slackの投稿領域のMarkdownって結構制約があるんですね。表が使えない。
www.markdownguide.org
コード一式はGitHubにまとめました。よかったら参考にしてみてください。
github.com
実行するときはnodeコマンドでスクリプトを実行すればOKです。
$ npm install
$ node app.js
無事表示されました。
これをAWS LambdaやGitLab CI/JenkinsのScheduledジョブに設定しておくことで、毎日のストア評価の変化を追うことができるようになります。