MuleSoft公式チュートリアルを学ぶ - Slack翻訳アプリを作る

MuleSoft公式チュートリアルをやってみたシリーズ、もう一つ上げます。

公式チュートリアルは英語なので、日本語で細かく手順を知りたい人向けに本記事を書きました。

今回は、チャットボット開発をやっていた者としては気になる **Creating a chatbot with Microsoft Translator & Slack** というチュートリアルを学んでみました。

チャットボットと聞いて、お？ と思ったけれど、蓋を開けてみれば

Slackでコメントするときに /translate で始めると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/3aa8e158-86a9-763b-1cfb-b88fec98df2b.png)

入力したコメントを、裏で **Microsoft Translator を使って翻訳し** 投稿する機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/0cb8d68d-6b96-5a5b-7c1b-0f0a67541c21.png)

を作るということなので、チャットボットというよりは翻訳アプリですね。


本記事の元ネタは、下記のMuleSoft公式チュートリアルエントリーです。
Creating a chatbot with Microsoft Translator & Slack

https://developer.mulesoft.com/tutorials-and-howtos/integrations/creating-your-first-chatbot-slack-microsoft-translator/

# 概要

ではさっそく参りましょう！

今回のチュートリアルでは、**Slackのアプリケーション** と **ウェブアプリケーション** （MuleSoft）を作ります。

**Slack アプリケーション** の方は、Slack 内で **/translate** と入力すると起動されるカスタムコマンドです。
処理としては、/translate の後ろに入力された **<翻訳したい文章>** をリクエストに含めて、ウェブアプリケーションのAPIに送信します。

**ウェブアプリケーション** の方は、MuleSoftで作ります。
Slack アプリケーションから受信したリクエストを、下図のように処理します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/8f665327-b316-9ba4-8b0c-b4b30dc072e5.png)


翻訳したテキストメッセージをウェブアプリケーションが返すので、Slackアプリケーションは、そのメッセージをコメントとして投稿します。

# 準備
このチュートリアルでは、下記のアプリケーションを使います。チュートリアルを進める前に無料トライアルアカウントの取得や、デスクトップアプリケーションのダウンロード／インストールをする必要があります。
- **Anypoint Platform** - Anypoint Platformのアカウントが必要です。今回は[無料トライアルアカウント](URL "https://anypoint.mulesoft.com/login/signup?apintent=generic")を利用しています。Anypoint Platformの操作はブラウザ上で行います。
- **Anypoint Studio** - APIの実装を開発するためのデスクトップ・アプリケーションです。[ダウンロード](URL "https://www.mulesoft.com/lp/dl/studio")・インストールしてください。
- **Slack** - アカウントがない場合はトライアルアカウントを作成してください。
- **Microsoft Translator** - アカウントの取得についてはチュートリアル内で説明します。

**Anypoint Platform** や **Anypoint Studio** の基本操作は、公式チュートリアル、および過去記事をご参照ください。

https://qiita.com/shino_i/items/141e934d3a01478756d6

https://qiita.com/shino_i/items/894cc8d07af15f9f7e19


# Anypoint Studio と Anypoint Platform の準備
まず、**Anypoint Studio** を起動し、translate など任意の名前で、新しいプロジェクトを作成します。

開いたキャンバスに、Mule Palette から HTTP Listener コンポーネントをドラッグ＆ドロップします。
Listenerのパスは **/slack** に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/7e4acdef-d50d-5f0b-c9c0-582f3744c314.png)

Advanced メニューで、**Allowed methods** を **POST** にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/25ee66d7-f674-bf59-17e2-9c8cb94a6518.png)

次に、Mule Palette から **Logger** コンポーネントをフローに追加します。
Messageセクションで fxボタンを押下し、**payload.text** と入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/d08f23b3-c5a4-48e6-cc74-de8af47a1192.png)

ここまでのファイルを **すべて保存** してから、Package Explorer内でプロジェクトのメインフォルダーを右クリックし、メニューから Anypoint Platform > **Deploy to CloudHub** を選択して アプリをCloudHubにアップロード／デプロイします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/865fb61b-a544-a0b1-3314-ea2cb8738fde.png)

Anypoint Platform ポータルにログインし、Runtime Manager でデプロイしたアプリを開き

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/b7f43761-f650-cdb5-7cab-e8855b959d26.png)

エンドポイントURL **xxx-xxx-xxx.cloudhub.io** を控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/015c1478-ecc8-0fb6-eb2a-15be9bae45a2.png)

# Slackアプリの作成

自分のSlackワークスペースに新しいアプリを追加します。

[Slack APIアプリ](URL "https://api.slack.com/apps") ページにログインします。
Create New Appをクリックし、From scratchを選択してアプリを新規作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/924ebb06-00fa-93f2-515c-f975cf449983.png)

App Name欄で適切なアプリ名を入力して、Create App。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/7cf02147-cd0c-561e-4e19-5d59f5d19c1c.png)

ユーザーがSlack上でコマンドを入力できるようにしたいので、**Slash Commands** を選択し、Create New Command ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/cc12a3c4-74d0-3437-6ee3-0cf5dda8f239.png)

Command を **/translate** とし、その下の Request URLに 先ほど Runtime Manager画面で取得した URL を入力し、Short Descriptionに適当な説明を入力して **Save**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/6fdf8f72-29f9-db37-e00c-f7fd83425c56.png)

アプリの Basic Information 画面に戻ったら、Install your app セクションの **Install to Workspace** ボタンをクリックして、今作成した Slackアプリがワークスペースで使えるようインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/d50bf617-9377-8739-0ada-e181a868b0f0.png)

Slackのワークスペースに入り、テキスト入力スペースで **/** を入力したとき、**/translate** コマンドが選択肢として表示されることを確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/9a49a429-811c-297d-e7b5-77839279bef2.png)


# Microsoft Azure Translator Text API と連携する

翻訳Slackボットを完成させるための次のステップは、先ほどAnypoint Studioで作り始めたアプリケーションにMicrosoft Translator Text APIとの連携を追加することです。

まず、[Translator Text Signup](URL "https://azure.microsoft.com/en-us/services/cognitive-services/translator-text-api/") ページで無料トライアルに申し込みます。

Azureのポータルにログインし、サイドバーのAll resources を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/2dd1f3b7-43da-a30c-cd96-cd2087eae671.png)

Create ボタンでサービスの選択画面を表示し、Translator Text を検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/f50cc33b-5de7-96eb-9582-d2b2906c5e5a.png)

Translator サービスを選択して、Next。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/a17a22bd-c77d-7acf-64bf-9437e13b7268.png)

**Create** ボタンを押下して Translatorサービスを作成します。

Subscription 配下の Resource group 欄では、ドロップダウンリストが空の場合、欄の下にある **Create new** リンクをクリックし、任意のリソースグループ名を指定して新しいリソースグループを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/167cf22c-149d-51b6-9d0a-1e005b957c5d.png)

任意の Region（Japan East等）、Name、Pricing tierを入力します。

Pricing tierに関しては、無料トライアル期間の$200分のクレジットを利用したいので **Free F0 (Up to 2M characters translated per month)** を選ぶようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/234e2949-28ad-c22f-c59f-e8a6d87e4cbf.png)

**Review + create**　ボタンを押下してサービス作成を完了します。


では、**Anypoint Studio** に戻ってアプリケーションの続きを作りましょう。
Mule Palette から **Set Variable** コンポーネントをドラッグし、先ほど最後に追加した Logger の隣にドロップして接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/03aaaff3-f069-c570-0105-8fba7ca2ed25.png)

変数名（Name）を **textToTranslate** に設定し、**fx** ボタンを押下して、payloadに含まれるテキストメッセージをtextToTranslate変数に格納する DataWeave コードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/a4d94846-d278-d2b4-5a71-d7d8057f1f04.png)

```text:DataWeaveスクリプト
%dw 2.0
output application/json
--- 
payload.text
```

次に、HTTP Request Connector をフローに追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/383c3296-7a8a-3fcf-56ad-8122e37d6cfb.png)

リクエストの設定では、URLの末尾にMicrosoft Translatorのバージョンと、**to=** で変換する言語を指定します。
例えば Slack に日本語で入力したコメントを英語に翻訳したい場合は 
`https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en`


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/4eb78c9d-f340-cdfd-4921-7b07f4102633.png)

Body には、JSONで Microsoft Translator API の仕様に沿ったリクエストを出力するコードを入力します。

```text:DataWeaveスクリプト
%dw 2.0
output application/json
---
[{
"Text": vars.textToTranslate
}]
```
Headersタブでは、3つの項目を設定します。
| Name | Value |
|:-:|:-:|
| "Content-Type"  | "application/json;charset=UTF-8"  |
| "Ocp-Apim-Subscription-Key" | ＜KEY1＞  |
| "Ocp-Apim-Subscription-Region"  | ＜Region＞  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/e44bd2ac-ef2f-6da6-516a-b19b3dce7d9f.png)

**＜KEY1＞**と**＜Region＞**は、先ほどMicrosoft Azure で設定した Translator の **Resource Management > Keys and Endpoint** 画面で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/c8a8c770-a6b5-6593-3cb9-251d09ed1e63.png)

最後に **Transform Message** コンポーネントをフローに追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/bc4bc52b-4ee2-9bca-4f20-e6843359c876.png)

翻訳されたテキストメッセージが Translator API のレスポンスpayloadに含まれていて、これを抽出したいので、下記のスクリプトを追加します。

```text:DataWeaveスクリプト
%dw 2.0
output text/plain
---
payload.translations[0].text[0]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/724d9528-e469-5463-6862-2b3c30dca37f.png)

これでフローは完成です。
全体の流れは下図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/8f665327-b316-9ba4-8b0c-b4b30dc072e5.png)

すべてのファイルを保存したら、**アプリケーションをCloudHubにデプロイ** してください。
次のステップで動作確認をします。

# 動作確認

アプリケーションをCloudHubにデプロイ後、Slackを開き、テキスト入力エリアに
**/translate <任意の日本語コメント>** と入力しコメントを送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/3aa8e158-86a9-763b-1cfb-b88fec98df2b.png)

コメントが英語に翻訳されて表示されれば **成功** です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/dfa35150-cdf6-060a-642a-5f845c543023.png)

何かがうまくいっていないときはこのように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/e9921930-9251-e185-97b9-c75ce3043f21.png)

トラブルシューティングするには **Anypoint Platform** の **Runtime Manager** に入って先ほど CloudHub にデプロイしたアプリケーションを開き

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/0439b9fd-1c14-99b7-0802-f1c0a7d12534.png)

左側のメニューから **Logs** をクリックしてログを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/bd4c999f-32f6-f9dc-7366-a34e8815e2c4.png)

ログのエラーメッセージを手掛かりにアプリケーションを修正して再デプロイしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308847/3dc85a79-9d36-83f4-40a3-9863b1de1b68.png)

# おわりに
MuleSoft公式チュートリアルをやってみたシリーズは、本記事が最後です。

今回は、Microsoft Translatorの仕様がMuleSoft公式チュートリアルの例と少し違っていたようで、Bearer Tokenを使わない手順にして初めてうまくいきました。

いずれ本家が現行バージョン用にチュートリアルをアップデートすると思いますが、それまでは本シリーズの補足情報がご参考になればと思っています。


最後まで読んでいただき、ありがとうございました。