古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

Microsoft Flow で遊んでみたはなし

今更ながら、Microsoft Flow で遊んでみました。

flow.microsoft.com

要するに IFTTT を業務向けにしました的な。IFTTT 使ったことがないので形容が間違えているかもしれませんが、そんな感じだと認識してます。


業務向けを意識すると、Microsoft は日本語化に力を入れるんだなっていうのがわかるくらい、日本語化がしっかりしています。
もちろん個人でも使うことはできます。無料で使うことができて、15 分に 1 回発動できるかの自動チェックが走り、月 750 回まで実行することができます。
有料だともうちょっとチェック間隔は短く、実行回数も増えます。意外とお安いので気に入ったらお金払ってもいいかなあなんて思ってます。

基本的な登録の仕方や、Flow の作り方は id:kazuakix が書いてましたので紹介します。およそ1年前で、まだベータ的な感じの頃のですが、基本的なところは今も変わっていません。

blog.kazuakix.jp

ちなみに、無料のみ利用可能となりますが、Microsoft アカウントでも登録ができるようになっています。必要に応じて企業アカウント (Azure AD) を取ると、有料プランへの移行もできるようになります。
Azure AD 自体は無料で、僕の場合は Windows デベロッパーセンターで Azure AD を新規作成できる場所があったので、そこで作りました。Azure ポータルでも作れるかと思いますが、ごめんなさい、その辺まで調べ切れていないです。
デベロッパーセンターで Azure AD を作る方法は以前記事で書いていました。

ayano.hateblo.jp


今回やったことはひとつ。
JR東日本アイステイションズが提供している「鉄道運行情報」のメールを、Slack に転送する機能を作ってみました。

www.jikokuhyo.co.jp

Flow のいいところは、Outlook.com に対応しているところ。Outlook.com のメールを扱うサービスがあまりないので、この点はとてもありがたいです。
IFTTT だと Gmail には対応していますが、Outlook.com には対応していませんでした。

id:kazuakix の記事ではテンプレートを利用していましたが、今回は一から作ります。
f:id:ChiiAyano:20170407232731p:plain
f:id:ChiiAyano:20170407232939p:plain

Outlook.com を選んで、はじめて使うときはどのアカウントを使うか、ログインを求められるので、指示通りログインを進めて下さい。
登録できると、どんな条件で発動するかを設定できます。「開始」に差出人のアドレスを入れれば、特定のアドレスにだけ反応することができます。
f:id:ChiiAyano:20170407232945p:plain

次に Slack を追加します。
f:id:ChiiAyano:20170407233003p:plain

このときも、どのチームで使うかを聞いてきますので、設定しログインして下さい。
登録できると、どこにどうやって送信するかを設定できます。「メッセージテキスト」にメール本文、「ボット名」に件名を入れることで、簡易的なメール確認にも使えたりします。
f:id:ChiiAyano:20170407233139p:plain

これでひとまずはできあがり…ですが、メール本文は余計な文があったりして、必要な情報だけほしいと思ったとき、Flow の機能だけではうまくできませんでした。
そこで、半ば仕方なくですが Web API を作って一度そちらを経由し、メール本文を加工して使えるようにしました。

Visual StudioASP.NET Web アプリケーションを選んで…
f:id:ChiiAyano:20170407233911p:plain
今回は Azure API App を選びました
f:id:ChiiAyano:20170407233936p:plain
Azure API App は Swagger と呼ばれるフレームワークを積んだテンプレートになっています。Swagger はとりあえず作るにはかなり簡単なフレームワークで、サーバー初心者でも扱いやすかったです*1

今回はこのドキュメントを参考にしました
Azure App Service で API Apps、ASP.NET、Swagger を使用する

できあがったプロジェクトの Controllers に、受け口となる実装をしていきます。既に「ValuesController」がありますので、それを見ながら作っていくと楽かと思います。
こんな感じでコントローラーを書いてみました。

using System;
using System.Net;
using System.Web.Http;
using Swashbuckle.Swagger.Annotations;
using WebApplication2.Models;

namespace WebApplication2.Controllers
{
    public class HogeController : ApiController
    {
        [SwaggerResponse(HttpStatusCode.OK)]
        public HogeResponseModel Post(HogeRequestModel request)
        {
            var body = request.Body;
            var response = new HogeResponseModel();

            // なんか処理
            response.CreatedAt = DateTimeOffset.Now;
            response.Message = body;

            return response;
        }
    }
}

リクエストを受けるためのモデルとなるクラスはこんな感じ。これを Models の中に入れます。

namespace WebApplication2.Models
{
    public class HogeRequestModel
    {
        public string Body { get; set; }
    }
}

レスポンスを渡すためのモデルとなるクラスも同様に Models に入れます。

using System;

namespace WebApplication2.Models
{
    public class HogeResponseModel
    {
        public DateTimeOffset CreatedAt { get; set; }
        public string Message { get; set; }
    }
}

実際、これだけだとただ左から来たものを右へ受け流すだけの API になっていますが、実際はもうちょっといろいろ書いてます。

これで作れましたが、実際に動くかどうかも Swagger では試すことができます。
App_Start にある「SwaggerConfig」を開き、190 行目ほどにある

/*
    })
.EnableSwaggerUi(c =>
    {
*/

のコメントを外してあげると、ダッシュボードにアクセスできるようになります。
ひとまずデバッグ実行して、Web ブラウザーが立ちあがったら、そのアドレスに「/swagger」を足して下さい。

http://localhost:59819/swagger

とやると、ダッシュボードが立ちあがります。ここで、どんなエンドポイントで、どういうメッセージを送れば、どう返ってくるかがわかります。
f:id:ChiiAyano:20170408000051p:plain
試しに適当な JSON を流し込んでやると、ちゃんとレスポンスが作られることがわかると思います。
f:id:ChiiAyano:20170408000239p:plain

これでできあがりです。あとは Azure に投げるなり、自前のサーバーなどに置いてインターネットアクセスができる環境において下さい。
今回認証などのアクセス制限まわりに触れていませんが、おそらく必要になるケースは出てくると思います。その辺はまた時間があれば書きたいところ。


さて Flow に戻ります。
先ほど作ったフローに、今公開した API を使ってもらうようにします。
メールと Slack の矢印あたりをポイントすると「+」が表示されるので、それをクリックすると間に処理を追加することができます。
f:id:ChiiAyano:20170408000726p:plain

アクションは今回「HTTP」を選びました。Swagger が使えそうなアクションがありますが、HTTPS 通信でないとダメだったりしたので、地道に HTTP で作ります。

設定はこんな感じ。「本文」は JSON チックにし、メール本文の間にダブルクオーテーションを挟むのがポイントです。
f:id:ChiiAyano:20170408001108p:plain

次に JSON を解析します。Flow では JSON 解析するアクションがあるので、それを利用します。
「HTTP」の下の「+」をクリックして処理を追加します。

f:id:ChiiAyano:20170408001519p:plain
コンテンツは HTTP で受けた「本文」を入れて下さい。
スキーマはちょっと特殊ですが、こんな感じで書けると思います。

{
  "type": "object",
  "properties": {
    "CreatedAt": {
      "type": "string"
    },
    "Message": {
      "type": "string"
    }
  }
}

これで Web API を通してメッセージの加工ができるようになりました。

最後に Slack に投稿する設定を変更します。
パースした JSON の情報が使えるようになったので、それを「メッセージテキスト」に流し込みます。
f:id:ChiiAyano:20170408005424p:plain

これで以上です。

いろいろ設定して、実際に使うとこんな感じで動かしています。
f:id:ChiiAyano:20170408005547p:plain


Flow はモバイルでも動かすことができます。
これまでなぜか iOSAndroid のみアプリが提供されていましたが、つい先日 Windows 10 Mobile でもリリースされました。
www.microsoft.com
Flow のアクションを促すことができるボタンを用意して、モバイル端末から実行することができたり、既存のフローを編集したりすることができます。
f:id:ChiiAyano:20170408010242p:plain

で、試しにやってみたのですが…

リプライ飛ばしたはずなのに @ がついてない…だと…。

どうやらスパム防止としてあえて @ をフィルターしているようでした。
powerusers.microsoft.com
正しいっちゃ正しい。仕方ないですね。


そんなわけで長々と書いてしまいましたが、こんな感じで遊んでます。
他にも面白そうな遊び方があったら紹介したいです。


参考記事
blog.daruyanagi.jp

*1:個人の感想です