【Azure Logic Apps】20分でできる！ノーコーディングで Twitter の検索結果を感情分析して Slack に連携すっぞ

## はじめに
[UL Systems Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ulsystems) の23日目です。

みなさんは自分が開発したサービスの評判を知りたくないですか？僕は知りたいです。狂ったようにエゴサーチしています。
そこで、いつも Twitter で「〇〇 アプリ」とエゴサーチしている作業を自動化して、勝手に Slack に流れてくるアプリを作ってみました！

なんと、Azure の Logic Apps を使えば、ノーコーディングで作れます。10分かかりません！
この記事の前半（基本編）では、 Twitter で検索した結果を Slack に流すための方法を紹介します。
さらに記事の後半（応用編）で、Cognitive Services の Text Analytics を活用して、Twitter のテキストをポジティブかネガティブか判定して Slack に反映させる方法を紹介します。基本編に10分追加すれば作れます！

## Logic Apps とは
Logic Apps は、アプリケーションの連携やワークフローを簡単に実装できるAzureのマネージドサービスです。以下の特徴を持っています。

- オンプレやクラウドのアプリケーションを結合したワークフローを作成できる
- 簡単なワークフローであれば、ノーコーディングでアプリケーションを作成できる
- Azure サービスとの連携が容易

Twitter で検索した結果を Slack に連携するだけであれば、10分でコーディングせずに実現できます。
詳しくは[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-overview)をご確認ください。

AWS のサービスと対比すると、Amazon Simple Workflow Service (SWF) が最も近いサービスです（参考：[Azure サービスと AWS サービスの比較](https://docs.microsoft.com/ja-jp/azure/architecture/aws-professional/services)）。
SWF を使用したことはないのですが、調べた限りだと Twitter 検索を Slack に連携するには Lambda で実装したアプリケーションをSWFでワークフローとして接続する使い方をするようです。Logic Apps がノーコーディングで作成できるのは強みと言えそうです。

Logic Apps の詳細は公式ドキュメントに書いてありますが、習うより慣れよの精神で、さっさと作っちゃいましょう。

## 【基本編】アプリを10分で作るぞー
### 作るもの
基本編では題材として、（エゴサーチではないですが）最近気になっている「スマブラ キャラ」を Twitter で検索した結果を Slack に垂れ流すアプリケーションを作りましょう。（今作のスマブラはキャラが多いので情報収集が大事ですよね！）

![2018-12-22_15h01_50.png](https://qiita-image-store.s3.amazonaws.com/0/211034/f02de916-29bb-ee0f-7bac-33499249277b.png)
検索結果を Slack に流すだけのシンプルな構成です。

### 前提条件
以下のアカウントを取得している前提とします。

- Twitter アカウント
- Slack アカウント
- Azure アカウント

### Logic App の作成

では Logic App を作成しましょう。
左のメニューから「リソースの作成」を選び、Logic App を選びます。

![create-logic-app.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/154f2dc4-0382-5300-0f88-4270b6485374.png)

作成画面で適当にポチポチっと作りましょう。リソースグループがなければ「新規作成」あれば「既存のものを使用」で選択します。

![create-logic-app2.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/d3d0d842-a2d7-7932-78fd-ed9fa6967829.png)

作成を押してしばらく待てば Logic App のできあがりです。

### テンプレートを選ぶ
作成したての Logic App を開くと、テンプレートを選択する画面が表示されます。実は Twitter をトリガーとし、Slack をコネクタとするテンプレートがあります。これを使いましょう。トリガーとコネクタについては後述します。「新しいツイートがハッシュタグと一致する場合に Slack に投稿する」を選んでください。

![select-template.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/de7842c7-790a-9442-10c8-9e56506ed4ec.png)

次の画面で「テンプレートから作成する」を押すと、ロジックアプリの接続先設定画面が表示されます。

![create-logic-app04.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/03df8fc6-31a9-c147-d86b-97b081bd713c.png)

Twitter と Slack のログインをして、「続行」します。

### Twitter トリガーと Slack コネクタの設定

次に、Logic Apps デザイナーを使用して具体的な設定を施します。以下の画面が表示されていると思います。
![logic-app-designer001.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/61bcb405-8593-f967-485b-da22d6eb62a3.png)

TwitterトリガーとSlackコネクタのそれぞれを確認しましょう。

![twitter002.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/7a3d37b2-30cd-1882-c472-fd25c7ec8cd7.png)

上は Twitter トリガーです。Logic Apps の起点は必ずトリガーで、定期実行やイベント発生を契機にアプリケーションが実行されます。「項目を確認する頻度」に3分と設定されているかと思います。今回は3分に一回実行されるTwitter検索がトリガーとなります。検索テキストには「スマブラ キャラ」と設定します。（ちなみに、exclude:retweets などのTwitter検索で有効なキーワードが使用できます。）


![slack001.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/cf9198f8-239c-6f8f-d2c3-991827218cb0.png)

下は Slack コネクタです。コネクタは前のタスクの結果を使用して新たなタスクを実行します。用意されているコネクタの種類は豊富で、200以上あるようです（[公式参照](https://docs.microsoft.com/ja-jp/azure/connectors/apis-list)）。この中には Azure Functions や BLOB Storage のような Azure のサービスへ接続したり、オンプレのデータへアクセスできるコネクタが用意されています。豊富な種類のコネクタは、Logic Apps のひとつの強みと言えそうです。今回は Slack のチャンネルにメッセージを投稿します。チャネル名には今回のために作った「スマブラ」チャンネルを選択しておきます。メッセージテキストはいったんデフォルトで設定しておきましょう。

設定を保存すれば、準備完了です。

### 結果
これだけです！10分かからなかったと思います！これだけで作れるとか Logic Apps ヤバい。

![2018-12-22_15h21_43.png](https://qiita-image-store.s3.amazonaws.com/0/211034/5a171a2c-8200-1221-5ec4-a8a7b57c308d.png)

こんな感じで垂れ流れてきます！（ツイート主は念のため伏せておきます）

でも、ぶっちゃけちょっと見づらいです。ツイートへのリンクも欲しいです。少し改善して、Slackコネクタのメッセージテキストを以下のように変更しましょう。
![slack003.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/489b91c0-bb87-def8-7821-addd64c1075e.png)

メッセージテキストで編集しようとすると、編集エリアも小さく若干扱いづらかったりします。そんなときは、左のメニューから「ロジックアプリコードビュー」を選んでください。
![toolbar001.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/ac9c337e-f254-013b-5d14-66f5dd597647.png)

すると、JSONのファイル編集モードになります。 以下はSlackの設定部分の抜粋。

```JSON
        "actions": {
            "Post_Message": {
                "inputs": {
                    "host": {
                        "connection": {
                            "name": "@parameters('$connections')['slack']['connectionId']"
                        }
                    },
                    "method": "post",
                    "path": "/chat.postMessage",
                    "queries": {
                        "channel": "CEV9UGZ0C",
                        "text": "@{triggerBody()?['UserDetails']?['FullName']} @ @{triggerBody()?['UserDetails']?['UserName']}\n@{triggerBody()?['TweetText']}\n https://twitter.com/@{triggerBody()?['UserDetails']?['UserName']}/status/@{triggerBody()?['TweetId']}",
                        "username": "エゴサの達人"
                    }
                },
                "runAfter": {},
                "type": "ApiConnection"
            }
        },
```

`definition.actions.Post_Message` は Slack のメッセージ投稿APIへのPOSTメッセージを示します。`triggerBody()` でトリガーのアウトプットを取得できます。Logic App のパラメータを利用して `text` を上記のように編集しましょう。ワークフローで使用できる関数は [公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference) をご覧ください。

以上のように設定すれば、Slackには以下のように流れて来ます。

![2018-12-22_15h24_47.png](https://qiita-image-store.s3.amazonaws.com/0/211034/de47d8db-060c-62c7-45a1-6c1da0aa6a0d.png)

見やすいです！
こんなに簡単に作れるので、ぜひ自分が開発しているサービスでエゴサーチしてみてください。

## 【応用編】ツイートがネガティブかポジティブか判定したい（+10分）
エゴサーチしていると、「このユーザーにはウケが悪いな」「すごい褒めてくれるけどもしかして身内？」とツイートがサービスに対してネガティブだったりポジティブだったりします。ここまで判断してくれたら面白いなーなんて考えていたら。。。

### 感情分析？それ、 Cognitive Services でできるってよ
できるらしいです。Cognitive Services マジヤバい。

Cognitive Services は、Azure の学習済みAIを利用するAPIを提供するサービスです。画像分析やテキスト分析、音声認識などいくつかのサービスに分かれています（[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/cognitive-services/)）。

今回は、Text Analyitics の感情分析のAPIの結果が利用できそうです。[Text Analytics はブラウザで試用できる](https://azure.microsoft.com/ja-jp/services/cognitive-services/text-analytics/)ので、習うより慣れよの精神で試してみましょう。

![text-analytics-sample001.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/8a52ad49-a1d0-ddee-bb6a-bbd1da973e7a.png)

JSONの中身はこちら。

```JSON
{
  "languageDetection": {
    "documents": [
      {
        "id": "201986f2-96a0-496e-b9b4-37c674dcbade",
        "detectedLanguages": [
          {
            "name": "Japanese",
            "iso6391Name": "ja",
            "score": 1.0
          }
        ]
      }
    ],
    "errors": []
  },
  "keyPhrases": {
    "documents": [
      {
        "id": "201986f2-96a0-496e-b9b4-37c674dcbade",
        "keyPhrases": [
          "ィィィィイイイヤッホウウウウゥゥ"
        ]
      }
    ],
    "errors": []
  },
  "sentiment": {
    "documents": [
      {
        "id": "201986f2-96a0-496e-b9b4-37c674dcbade",
        "score": 0.58951413631439209
      }
    ],
    "errors": []
  },
  "entities": {
    "documents": [],
    "errors": [
      {
        "id": "201986f2-96a0-496e-b9b4-37c674dcbade",
        "message": "Supplied language is not supported. Pass in one of: en,es. See https://docs.microsoft.com/en-us/azure/cognitive-services/text-analytics/overview for the complete list of support languages."
      }
    ]
  }
}
```

最高に楽しそうなテキストを分析した結果、センチメントを表す値`sentiment.documents.score`はおよそ0.59でした。Text Analytics の仕様では 1 がポジティブ、0 がネガティブです。いったいどんな言葉なら1を叩き出すのか気になりますが、今回はこの score を条件分岐に使ってみましょう。

今回は、`score > 0.5` ならポジティブなツイート、`score <= 0.5` ならネガティブなツイートとして、Slack のチャンネルを出し分けてみます。

あらためて、以下の構成を目指します。

![2018-12-22_15h02_12.png](https://qiita-image-store.s3.amazonaws.com/0/211034/07a32a62-7ba4-aa65-8884-aec8771e3554.png)

今回の「スマブラ キャラ」なら、ポジティブなら強そうなキャラが出そうだし、ネガティブならあまり強くなさそうなキャラが出そうな予感。やってみましょう！


### Text Analytics の作成

まずは Text Analytics のリソースを作成し、APIを利用できるようにしましょう。リソースの作成を押して「text analytics」で検索すれば テキスト分析 が出ます。

![create-text-analytics001.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/fa92c7e4-2feb-811c-f789-1746264d74ab.png)

作成画面でポチポチっと入力します。以下の画像だと価格レベルが S ですが、フリープランの F0 があるので、初めての方はそちらを選択してください。F0 は5000回使えるフリープランで、ひとつのアカウントで一度しか選択できないのでご注意ください。ちなみに、S0以上のプランはお値段けっこう高いです。

![create-text-analytics002.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/eeb9f4ee-e8a8-dac8-cc28-0e0a1f86991e.png)

最後に、コネクタで設定するEndpointとKEYを取得しておいてください。

![2018-12-22_15h36_24.png](https://qiita-image-store.s3.amazonaws.com/0/211034/86639ee8-21f4-f907-a6ad-b2e43b390bb7.png)
![2018-12-22_15h37_01.png](https://qiita-image-store.s3.amazonaws.com/0/211034/f0f5ef5d-f956-10d7-5afb-9c9065801350.png)


Text Analytics のリソース作成は以上です。

### Text Analytics コネクタと条件付きステートメント

はじめは、出し分けるには Azure Functions でscoreの値により文字列を出力し分ける必要があると思ったのですが、なんと！Logic Apps には Text Analytics のコネクタや条件分岐の仕組みが用意されていました！感情分析までノーコーディングでアプリを作れるというヤバさ。
ただし、感情の検出はまだプレビュー版で、本番アプリケーションには向かないのでご注意ください。

ロジックアプリデザイナーを開いて結合してみましょう。Twitter トリガーと Slack コネクタの間の + ボタンで、「アクションの追加」をしましょう。

![add-action001.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/fdf827d3-6910-b377-24b2-4c919d90a473.png)

「テキスト分析」で検索すると、次の画面が出ます。

![text-analytics004.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/32029fe9-b68b-3a2c-c4c1-57f13160a9e9.png)

感情の検出（プレビュー） を選択しましょう。すると、次の画面が出てくるので、接続名にリソース名、アカウントキーに先ほど取得した KEY 、サイトのURLに Endpoint を入力してください。

![text-analytics002.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/287104b0-810c-c215-9317-5588d44aa43a.png)

「作成」すると、分析対象のテキストを選ぶ画面が表示されます。ここでは「ツイート テキスト」を選択します。

![text-analytics005.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/c2280e4a-5dc1-c1d5-658a-81943435b094.png)

これで Text Analytics コネクタはOKです。続いて分岐させましょう。

![condition001.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/e7df8e06-f64d-8deb-d9b3-0ff4379b12bc.png)

アクションの追加 をします。「条件」と検索すると、条件 アクションが表示されます。

![condition002.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/b9aed79b-520c-c58e-993f-ebe8ee1c4a31.png)

条件アクションを追加すると、ロジックアプリデザイナーがかっこよく分岐します。そこで次に示すように、「スコアが0.5より大きい」という条件を設定します。

![condition003.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/cdb607a2-5294-b18f-d269-b5fa7741439d.png)

`true` の場合がスコアが0.5より大きい、つまりポジティブなツイートなので目論見通りなら強キャラについてのツイートが流れて来ます。`false` の場合はその逆で、ネガティブなツイート、つまり強くないキャラのツイートが流れるはず。それぞれ別々のチャンネルに流すように設定しましょう。

`true` `false` のどちらの場合も、Slackコネクタでメッセージを投稿します。そこで、次のSlackのタスクを「`true` の場合」枠にドラッグ&ドロップしてみてください。

![condition004.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/9ddf5493-6f9e-cb26-bce1-f3b6170dc862.png)

ピタッとハマります。すごい。コネクタをコピーして再利用はできないようなので、`false` の場合は基本編と同様にSlackコネクタを作成してください。

`true` の場合は強キャラっぽいチャンネルを選択します。一方、`false` の場合はスコアが0.5以下なので、ネガティブなツイートとして弱キャラっぽいチャンネルを選択します。

![2018-12-22_15h07_01.png](https://qiita-image-store.s3.amazonaws.com/0/211034/eac6a3a5-5e31-b706-5dff-6237e6118c42.png)

保存したら準備バッチリです！基本編から追加で10分程度で作れたかと思います！

### 結果
![result003.png](https://qiita-image-store.s3.amazonaws.com/0/211034/d7af99a8-13bf-b967-d7dc-360c39d24f49.png)
![result004.PNG](https://qiita-image-store.s3.amazonaws.com/0/211034/c3de79f0-e86d-907d-b19d-34bce0f0a2ab.png)

！！！？？？

当たっている！！！とはならないものの、「全キャラ解放したぜ！」といったポジティブツイートや、「キャラ解放ムズイ！」のようなネガティブなツイートはそれぞれ分かれて投稿されています！残念ながら強キャラ/弱キャラに分類する目論見通りにはいきませんでしたが、ある程度は感情の検出ができました！エゴサーチにも使えるのではないでしょうか。精度はまだプレビュー機能なので、今後に期待したいと思います。

## おわりに
Logic Apps 半端ないって！コーディングしないで感情分析するもん。そんなんできひんやん普通。
ということで、Twitterの検索をSlackに流すだけでなく感情分析までする、というアプリが簡単に作成できました。

Logic Apps の実用として、現在のプロジェクトでは以下の場面で使用しています。

- 定期実行ジョブの開始/終了時にSlackへ通知する
- プロジェクトで支援しているサービス名で検索したツイートを Slack へ通知し、メンバー内でユーザーの意見を共有する

こんなに簡単に作れるなら~~次は「おっぱい」を検索した結果を Slack に垂れ流せるアプリを作ろうと思います~~今後もプロジェクトの役に立つアプリをガシガシ作っていきたいと思います。
簡単な Twitter や Slack 連携のアプリなら本当に10~20分で作れるので、皆さんもぜひプロジェクトの Slack にエゴサーチを垂れ流してみてはいかがでしょうか。