Outgoing WebHooksとFunction Appの連携をした話


(Qiitaからの転載です)

やったこと

SlackのOutgoing WebhooksをAzureのFunction Appを使って実現しようと試みて失敗(?)した.

参考にしたサイト様

http://blog.xin9le.net/entry/2016/04/01/042452
http://qiita.com/chike0905/items/58222a99be460f325ab8

Azureでの操作

  • Function Appを作成する.
  • 新しい関数からテンプレートの選択を開き,GenericWebHook-CSharpを選択する.

quii01.PNG

  • 関数名を適当に決めて,作成ボタンを押す.
  • 自動でテンプレートが生成される.

quii02.PNG

  • 適当に書き換える.(今回はbotを起動させたユーザー名を答えるようにした)
run.csx
    string jsonContent = await req.Content.ReadAsStringAsync();
    dynamic data = JsonConvert.DeserializeObject(jsonContent);

    return req.CreateResponse(HttpStatusCode.OK, new {
        text = $"Hello {data.user_name}!"
    });
  • ログに Compilation succeeded. と出たらエラーなくコンパイルに成功したことになる.
  • コードを書いているエディタの上に関数のURLがあるのでそれをコピーしておく.
  • 左の関数リストにある「統合」をクリックし,HTTP trigger(req)のモードをStandardに変更する.(なぜかWebHookだと動かない)

quii03.PNG

Slackでの操作

Outgoing WebHooksの詳しい使い方はURLを参考にしてほしい.
http://qiita.com/chike0905/items/58222a99be460f325ab8

先ほどコピーした関数のURLを画像のURL(s)へペーストする.
quii04.PNG

いざ運用

Slackでbotを起動させる言葉をポストしてみる.

.
.
.

動かない.

なんで?

Function Appのログを見てみると,

Exception while executing function: Functions.(関数の名前). Newtonsoft.Json: Error parsing boolean value. Path ”, line 1, position 1.

と出力されている.
つまり,Jsonをパースするときにエラーが起こってプログラムが止まったらしい.

そこでデバッグでJsonの内容をログに出力してみた.
するとSlackからのデータ形式が,

quii05.PNG

このデータを&区切りにした形だった.(そらエラーも起こりますわ)

まとめ

SlackからWebHookが飛んでくるというものだったので,てっきりC#のNewtonsoft.jsonでデシリアライズできると思い込んで苦労した.
とりあえずの対応として

  • Slackからの情報を使わないbotにする(つまり,デシリアライズしない)
  • Slackからの情報を&でSplitして強引に運用する

としているが,正直かっこよくないので改善したい.


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です