ホットペッパーAPIを使用して飲食店名からURL情報を取得してみた

# はじめに

ぐるなびWebサービスは2021年6月30日に無料APIサービスを終了してしまいました。

![スクリーンショット 2022-01-03 23.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/cf585f24-0991-66c2-80c3-c94806bd8194.png)

リクルートWEBサービスのホットペッパーAPIを使用して飲食店名からURL情報を取得します。

https://webservice.recruit.co.jp/about.html

APIキーの発行はこちら。

![スクリーンショット 2022-01-03 21.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/951485c0-5524-e969-eebc-cc32b642547e.png)

https://webservice.recruit.co.jp/register/

APIリファレンスはこちら。店名サーチAPIを使用しました。

https://webservice.recruit.co.jp/doc/hotpepper/reference.html

# Node.jsのサンプル

nodeとnpmコマンドは実行できることを前提とします。

```bash
$ npm -v 
6.14.9
$ node -v
v14.15.3
```

### 準備

fsとnode-fetchモジュールを追加します。

```bash
$ npm init -y
$ npm i fs node-fetch
```

node-fetchモジュールを使用するためにpackage.jsonに
"type": "module",
の設定を追加します。

```json:package.json
{
  "name": "20220103",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "module",
  "dependencies": {
    "fs": "0.0.1-security",
    "node-fetch": "^3.1.0"
  }
}
```

### サンプルコード

```javascript:app.js
import fs from 'fs';
import fetch from 'node-fetch';
const API_KEY = '[APIキーを記載する]';
//const KEYWORD = 'おじんじょ';
const KEYWORD = 'らんまん食堂 恵比寿';

// https://webservice.recruit.co.jp/doc/hotpepper/reference.html
const URL = 'http://webservice.recruit.co.jp/hotpepper/shop/v1/?key=' + API_KEY + '&keyword=' + encodeURIComponent(KEYWORD) + '&format=json';
// console.log(URL);

async function main() {
  try {
    const res = await fetch(URL);
    if (!res.ok) {
      throw new Error(`${res.status} ${res.statusText}`);
    }
    const data = await res.text();
    console.log(data)
    const obj = JSON.parse(data)
    console.log('店名:' +obj.results.shop[0].name)
    console.log('住所:' +obj.results.shop[0].address)
    console.log('URL ' +obj.results.shop[0].urls.pc)
  } catch (err) {
    console.error(err);
  }
}

main();
```

### コードの実行例

```bash
$ node app.js 
{"results":{"api_version":"1.20","results_available":1,"results_returned":"1","results_start":1,"shop":[{"address":"東京都渋谷区恵比寿西１-4-1　内野ビル1Ｆ","desc":"1","genre":{"name":"居酒屋"},"id":"J000860199","name":"らんまん食堂 恵比寿店","name_kana":"らんまんしょくどうえびすてん","urls":{"pc":"https://www.hotpepper.jp/strJ000860199/?vos=nhppalsa000016"}}]}}
店舗名 らんまん食堂 恵比寿店
住所 東京都渋谷区恵比寿西１-4-1　内野ビル1Ｆ
URL https://www.hotpepper.jp/strJ000860199/?vos=nhppalsa000016
```

# GAS (GoogleAppsScript)のサンプル

### スプレッドシート

URL取得ボタンを押すとGASが実行され、ホットペッパーAPIへアクセスしてA列の飲食店名をキーにURL情報を取得してB列へ記入します。
B列に値が記載されている場合は処理をスキップします。(URL情報を取得する場合は空欄にします。)
 
シート名:「sheet1」
A列: 店名
B列: URL

![スクリーンショット 2022-01-03 23.31.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/fd84c450-9783-1f51-8a3c-6f86f3f6d22f.png)

### サンプルコード

```javascript:myFunction()
function myFunction() {
  // スプレッドシートを開く
  const SHEET_ID = "[シートIDを記載する]";
  var spreadSheet = SpreadsheetApp.openById(SHEET_ID);

  // シートを選択する
  const SHEET_NAME = "sheet1";
  var sheet = spreadSheet.getSheetByName(SHEET_NAME);

  // 最終行数を取得する
  var lastRow = sheet.getLastRow();
  // Logger.log("debug01: " + lastRow);

  var API_KEY = '[APIキーを記載する]';  // APIキー
  var URL = 'http://webservice.recruit.co.jp/hotpepper/shop/v1/' + '?key=' + API_KEY;
  // Logger.log("debug02: " + URL);

  // 指定するセルの情報を取得
  for (i=1; i <= lastRow; i++) {
    var values = sheet.getRange(i, 1, 1, 2).getValues();
    // Logger.log("debug03: " + values);
    var flag = values[0][1];
    // Logger.log("debug04: " + flag);
    if (!flag) {
      var SHOP_NAME = values[0][0];
      // Logger.log("debug05: " + SHOP_NAME);
      var URL_TMP = URL + '&keyword=' + encodeURI(SHOP_NAME) + '&format=json';
      // Logger.log("debug06: " + URL_TMP);
      var response = UrlFetchApp.fetch(URL_TMP);
      // Logger.log("debug07: " + response);
      var data = JSON.parse(response.getContentText());
      if (data) {
        if (data["results"]["results_available"]) {
          var SHOP_URL = data["results"]["shop"][0]["urls"]["pc"];
          // Logger.log("debug08: " + SHOP_URL);
          // URLのセット
          sheet.getRange(i, 2).setValue(SHOP_URL);
        } else {
          sheet.getRange(i, 2).setValue("NA");
          // Logger.log("debug09: " + "NA");
        }
      } else {
        sheet.getRange(i, 2).setValue("Err");
        // Logger.log("debug10: " + "Err");
      }
    }
  }
}
```