(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を選択する.
- 関数名を適当に決めて,作成ボタンを押す.
- 自動でテンプレートが生成される.
- 適当に書き換える.(今回は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だと動かない)
Slackでの操作
Outgoing WebHooksの詳しい使い方はURLを参考にしてほしい.
http://qiita.com/chike0905/items/58222a99be460f325ab8
先ほどコピーした関数のURLを画像のURL(s)へペーストする.
いざ運用
Slackでbotを起動させる言葉をポストしてみる.
.
.
.
動かない.
なんで?
Function Appのログを見てみると,
Exception while executing function: Functions.(関数の名前). Newtonsoft.Json: Error parsing boolean value. Path ”, line 1, position 1.
と出力されている.
つまり,Jsonをパースするときにエラーが起こってプログラムが止まったらしい.
そこでデバッグでJsonの内容をログに出力してみた.
するとSlackからのデータ形式が,
このデータを&区切りにした形だった.(そらエラーも起こりますわ)
まとめ
SlackからWebHookが飛んでくるというものだったので,てっきりC#のNewtonsoft.jsonでデシリアライズできると思い込んで苦労した.
とりあえずの対応として
- Slackからの情報を使わないbotにする(つまり,デシリアライズしない)
- Slackからの情報を&でSplitして強引に運用する
としているが,正直かっこよくないので改善したい.