自作アプリにTwitter投稿機能を。HoloLensで始めるAzure Functions&LogicApps

前回、HoloLens+Face APIのデモアプリを作成しました。
[HoloLensで始めるCognitive Services（Face API編）](https://qiita.com/morio36/items/7d580ee156fde67b2c8f)

今回はこのアプリを修正し、人物を特定したら自動でツイートする機能を作ってみます。

##流れ
１．Functionsの作成
２．Logic Appsの作成
３．スクリプトの修正
４．実行

##１．Functionsの作成
下記のChapter 2を参考にFunctionsを作成してください。
[MR and Azure 305: Functions and storage](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-305)

C#のコードは下記とします。
**PostAsJsonAsyncのURL部分は後程更新します。**

```run.csx
#r "Newtonsoft.Json"

using System;
using System.Net;
using System.Threading.Tasks;
using Newtonsoft.Json;

public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Verbose($"Webhook was triggered!");

    string jsonContent = await req.Content.ReadAsStringAsync();
    var personInfo = JsonConvert.DeserializeObject<PersonInfo>(jsonContent as string);

    using (var client = new HttpClient())
    {
        var res = await client.PostAsJsonAsync("LogicApps-URL",
            new {
                name = personInfo.name
            }
        );
        
        // Response Code
        return req.CreateResponse(res.StatusCode);
    }       
}

public class PersonInfo {
    public string name { get; set; }
}

```

##２．Logic Appsの作成

<ol>
<li>Logic Appsサービスの追加
Azureポータルにて、下記の通りLogicAppsを検索し、作成してください。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/4b82bcd0-2bad-7166-3c1d-12cff69de9e1.png)

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/650e701c-2dcd-f7ae-61f8-a01fdacbbea9.png)

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/e46e20b1-d2e9-6fe6-02f0-b523fe2bd329.png)

</li>

<li>リソースに移動
リソースに移動してください。下記のような画面が出てきます。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/069c7716-3bf3-978c-7d87-df4b280d24c6.png)


</li>
<li>テンプレート選択
「空のロジック アプリ」を選択します。

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/6503818f-6063-5340-48ff-be238c33ffa6.png)
</li>

<li>トリガーの選択
検索欄に「http」と入力し、絞り込むと表示される「要求 - HTTP要求の受信時」を選択します。

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/f0b5fbf2-29e3-dda3-9abb-195426a93ec5.png)

要求本文の JSON スキーマに下記をコピペします。
これは「name」という文字列型パラメータをひとつだけ受け入れるJSON形式のリクエストを定義しています。

```
{
    "properties": {
        "name": {
            "type": "string"
        }
    },
    "type": "object"
}
```

JSONスキーマを入力したら一度保存してください。
保存するとURLが設定されます。

![7a.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/a6a3f084-6c92-35d6-83bd-fbe601bf4a83.png)

次に「新しいステップ」を押下してください。

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/3017a613-c141-801a-812b-a9c75a587766.png)


</li>

<li>アクションの追加

「アクションの追加」を押下します。
![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/410889b1-af4b-0ce2-361e-9f9cd93ff85e.png)

検索欄に「twitter」と入力し、絞り込むと表示される「Twitter - ツイートの投稿」を選択します。

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/ae139214-de49-6d92-4fbd-aa0beae1f811.png)

Twitterへのサインインを求められますので、Twitterの仕様に従い、サインインを行ってください。
**※アプリケーション認証が必要となります。**

下記の画面になったらサインイン成功です。

![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/c7d9de68-0698-e4ae-2d51-00db2a12f3fe.png)

</li>

<li>ツイートテキストの実装
「ツイートテキスト」の部分にフォーカスを当てるとウインドウが表示されます。
「動的なコンテンツ」には前アクションのOutputが表示されますので、
HTTP要求の受信時にパラメータとして定義した「name」を選択します。

![13.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/85711825-adfd-6e1d-5e23-e8188ea88179.png)

名前だけだとツイートが寂しいので、適当な文字列を追加します。

![14.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/5a87f8d1-0501-78c9-a627-70cf2d440a5f.png)

また、Twitterの連続投稿エラーを回避するため、タイムスタンプも追加します。
「式」から「utcNow()」を選択してください。

![15.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/88c5d260-8f29-d5f0-5aa8-2e7ba9d668db.png)

OKを押下します。

![16.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/9f166612-df30-b40e-1347-7243600bacb3.png)

適宜改行追加し、こんな感じでよいでしょう。
再度「保存」を押下してください。

![17.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/23991aae-8dc6-e7ba-4218-2e507f59c250.png)

■完成形
![18.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/60627049-299e-4a0c-d07b-824bcc6b426c.png)

HTTP POSTのURLをコピーし、１で作成したFunctionsの「LogicApps-URL」の部分に貼り付けてください。

</li>

##３．スクリプトの修正
これでAzure側の設定は完了しました。最後にScriptを修正します。
GetFaceInfo.csを開いてください。


1.メソッド、クラスの追加
まず下記のメソッドとクラスを追加してください。

```GetFaceInfo.cs
    /*
     * Azure Functionsを呼び出す
     */
    private IEnumerator CallAzureFunctions(string name)
    {
        WWWForm webForm = new WWWForm();

        // サーバへPOSTするデータを設定 
        ForFunctions forfonctions = new ForFunctions();
        forfonctions.name = name;
        string json = JsonUtility.ToJson(forfonctions);
        byte[] bytes = Encoding.UTF8.GetBytes(json.ToString());

        using (UnityWebRequest req = UnityWebRequest.Post(functionsEndpoint, webForm))
        {
            req.uploadHandler.contentType = "application/json";
            req.uploadHandler = new UploadHandlerRaw(bytes);
            yield return req.Send();
        }
    }
```

```GetFaceInfo.cs
    /*
     * Functions呼び出し用のクラス
     */
    [Serializable]
    public class ForFunctions
    {
        public string name;
    }
```

2.変数の追加
次に下記の変数を追加します。
実際のAzure FunctionsのURLに合わせて文字列を変えてください。

```GetFaceInfo.cs
    private string functionsEndpoint = "Azure Functionsのエンドポイント";
```

URLは下記の通り確認可能です。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/f3d6d91f-b151-c345-43ad-0380bcafaecf.png)

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/5c9b5cbb-ad5a-b572-cea0-958952d705d0.png)

3.既存メソッドの修正
メソッドGetFaceImageを下記のように変更します。

```GetFaceInfo.cs
    /*
     * 画像ファイルをダウンロードし、テクスチャに貼り付ける
     */
    private IEnumerator GetFaceImage(RawImage imagePanel, string targetUrl, string name)
    {
        WWW www = new WWW(targetUrl);
        // 画像ダウンロード完了を待機
        yield return www;

        // 画像をパネルにセット
        imagePanel.texture = www.textureNonReadable;

        //Functions呼び出し
        StartCoroutine(CallAzureFunctions(name));
    }
```

メソッドの引数変更に合わせて呼び出し側も下記のように変更します。

```GetFaceInfo.cs
        //顔写真の取得
        StartCoroutine(GetFaceImage(panel, imageUrl, name));
```

##４．実行
これで実装は完了です。
Holoへデプロイし、実行してみてください！

人物特定ができた際に下記のようにツイートしていれば成功です！
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/114630/297bbaa2-a243-3d61-89e8-8c49b7429a1d.png)


以上でHoloLensアプリからAzure FunctionsとLogicAppsが使用できました！
とても簡単ですね！
Twitter側のアカウント登録やトークンの取得などが不要なのがお手軽感あっていい具合です！
みなさんもこの記事を元にどんどん面白いものを作ってみてください！

##最後に
Twitterでデバッグしすぎてアカウント停止などならないようお気をつけくださいね。