デフォルトリッチメニューの適用 API を使ってみる

## デフォルトリッチメニューとは
LINE WORKS の Bot には、[リッチメニュー](https://developers.worksmobile.com/jp/docs/bot-menu#richmenu) と呼ばれる、画像上の任意の領域にアクションを設定可能な、自由度の高いメニューを割り当てることができます。

[<img width = 800 src = "https://developers.worksmobile.com/image/jp/bot/menu/283.png">](https://developers.worksmobile.com/image/jp/bot/menu/283.png)

リッチメニューは、ユーザー単位で割り当てるか、Bot の既定値であるデフォルトリッチメニューとして割り当てます。
デフォルトリッチメニューは、これまで、Bot の属性として [Bot の更新](https://developers.worksmobile.com/jp/docs/bot-update-put) API または [Bot の部分更新](https://developers.worksmobile.com/jp/docs/bot-update-patch) API で設定する必要がありましたが、これらの API の呼び出しには `bot` Scope が必要で、デフォルトリッチメニューを設定する目的からはちょっと強い権限を要求していました。

## デフォルトリッチメニュー API
そこで、`bot` scope よりも一段低い権限である `bot.message` scope で利用できる、デフォルトリッチメニューの管理 API がリリースされました。
- [デフォルトリッチメニューの適用](https://developers.worksmobile.com/jp/docs/bot-default-richmenu-set)
- [デフォルトリッチメニューの取得](https://developers.worksmobile.com/jp/docs/bot-default-richmenu-get)
- [デフォルトリッチメニューの削除](https://developers.worksmobile.com/jp/docs/bot-default-richmenu-delete)

また、デフォルトリッチメニューの利用に必要な以下の API も、`bot.message` scope で利用できます。
- [リッチメニューの登録](https://developers.worksmobile.com/jp/docs/bot-richmenu-create)
- [コンテンツアップロード](https://developers.worksmobile.com/jp/docs/bot-attachment-create)
- [リッチメニュー画像の登録](https://developers.worksmobile.com/jp/docs/bot-richmenu-image-set) 

これにより、bot が作成されていれば、`bot.message` scope を使ってデフォルトリッチメニューを設定・管理することができるようになりました。

### デフォルトリッチメニューの使い方
では、早速、新しいデフォルトリッチメニュー API を使って、Bot にデフォルトリッチメニューを設定してみましょう。
Bot は既に作成済みと想定します。

#### 0. Access Token の取得
`bot.message` を Scope に指定して、Access token を取得します。
Access Token の取得方法がわからない場合には、[LINE WORKS API 2.0 を PowerShell で叩いてみる (JWT をもう一度)](https://qiita.com/msato-3/items/80a8aaaf4939d996e5b5) を参考にしてみてください。

取得した Access Token を使って、`$Header` ハッシュテーブル用意しておきます。 
```powershell
$Header = @{
    Authorization  = "Bearer xxxxxxxxxx"
    'Content-Type' = 'application/json'
}
```

 #### 1. リッチメニューの登録
 [リッチメニューの登録](https://developers.worksmobile.com/jp/docs/bot-richmenu-create) API で、Bot に対してリッチメニューを登録します。
 ```powershell
$botid = 12345
$richmenuBody = @{
    richmenuName = "MyRichMenu"
    areas = @(@{
        action = @{
            type = "uri"
            label = "RichMenuLabel"
            uri = "https://works.do"
        }
        bounds = @{
            x = 0
            y = 0
            width = 2500
            height = 1686
        }
    })
    size = @{
        width = 2500
        height = 1686
    }
}


 $richmenuRes = Invoke-RestMethod `
     -Method POST `
     -Uri "https://www.worksapis.com/v1.0/bots/$botId/richmenus" `
     -Headers $Header `
     -Body (ConvertTo-Json $richmenuBody -Depth 4)

Write-Host $richmenuRes.richmenuId
 ```

  #### 2. リッチメニュー画像のアップロード
  [コンテンツアップロード](https://developers.worksmobile.com/jp/docs/bot-attachment-create) API で、リッチメニューに使用する画像ファイルをアップロードします。
  リッチメニューに使用する画像ファイルには、以下の要件があります。
  - 画像フォーマット : JPEG または PNG
  - 画像のサイズ : 2500 × 1686 または 2500 × 843 
  - ファイルサイズ : 最大 1 MB


botId を指定したコンテンツアップロード URL は、以下で取得します、
```powershell

$fileUploadbody = @{
    fileName = "richmenuimage.png"
}

$Response = Invoke-RestMethod `
    -Method POST `
    -Uri https://www.worksapis.com/v1.0/bots/$botId/attachments`
    -Headers $Header `
    -Body (ConvertTo-Json $fileUploadbody) 

Write-Host $Response.UploadUrl
Write-Host $Response.fileId
```

取得した `UploadUrl` に対して、画像ファイルをアップロードします。
実際のファイルコンテンツのアップロードについては、[LINE WORKS API 2.0 を PowerShell で叩いてみる (その3 : ファイルのアップロード)](https://qiita.com/msato-3/items/98f1ff90c833246d6c97) を参照してください。

また、`fileId` は次の作業で使用しますので控えておきます。

#### 3. リッチメニュー画像の登録
[リッチメニュー画像の登録](https://developers.worksmobile.com/jp/docs/bot-richmenu-image-set) API を呼び出します。
API URL には、 [1. リッチメニューの登録](1.+%E3%83%AA%E3%83%83%E3%83%81%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AE%E7%99%BB%E9%8C%B2) で取得した `richmenuId` を、rqquest Body の `fileId` には、[2. リッチメニュー画像のアップロード](#2.+%E3%83%AA%E3%83%83%E3%83%81%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E7%94%BB%E5%83%8F%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89) で取得した `fileId` を使用しますします。

```powershell
$botId = 12345
$richmenuId = "11111111"
$fileId = "jp1.xxxxxxx"

$applyRichMenuImageBody = @{
    fileId = $fileId 
}

$Response = Invoke-RestMethod `
    -Method POST `
    -Uri "https://www.worksapis.com/v1.0/bots/$botId/richmenus/$richmenuId/image" `
    -Headers $Header `
    -Body (ConvertTo-Json $applyRichMenuImageBody) 
```

#### 4. デフォルトリッチメニューの適用
あとは、botId と richmenuId を指定して [デフォルトリッチメニューの適用](https://developers.worksmobile.com/jp/docs/bot-default-richmenu-set) API を呼び出せば、Bot のデフォルトリッチメニューが適用できます。

```powershell
$botId = 12345
$richmenuId = "11111111"

$Response = Invoke-RestMethod `
    -Method POST `
    -Uri "https://www.worksapis.com/v1.0/bots/$botId/richmenus/$richmenuId/set-default" `
    -Headers $Header 
```


### デフォルトリッチメニュー
というわけで、デフォルトリッチメニューが適用できました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667330/90c17ca0-2e55-6209-2d04-2e0c5943bba8.jpeg" width=400>