LoginSignup
3
4

More than 5 years have passed since last update.

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

Posted at

やったこと

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して強引に運用する

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

3
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4