この記事はおさむん家 Advent Calendar 2014の記事ですが、読んでも読まなくても構いません。
タイトル通りですが、Slack Outgoing Webhooksを扱う「処理言語非依存」なサーバのようなものを作りました。 前にslack上ではちよんさんに「作ったら知見お願い」と頼まれたので、その旨を書きます。
sasairc/marunage - Slack Outgoing Webhooksのサーバのようなもの。
Slack Outgoing Webhooks APIは、slack上で特定のワードが投下された際に、指定されたサーバへPOSTしてくれる便利(?)なやつ。 なぜ(?)がついたかと言うと、BOT以外では何に使えば良いか、この弱い頭ではわからないから。
送られてくる内容は普通にHTTPヘッダ + \r\n
+ body文字列(jsonではなくURI等のクエリ文字列と同じ形式)です。
ヘッダは省略します。
token=[token]&team_id=[team_id]&team_domain=844196-renge&service_id=[service_id]&channel_id=[channel_id]&channel_name=general×tamp=[timestamp]&user_id=[user_id]&user_name=sasairc&text=yasunachantext&trigger_word=yasuna
marunage
は任意のポートを監視します。そこへslackからPOSTがあった場合、HTTPヘッダ等を取り除いた上記のような文字列を第一引数に、指定されたパーサを起動。そしてパーサの標準出力から処理結果を受け取ります。
また、受け取った内容に対してレスポンスを送らない場合はnosend
と出力すれば、marunage
側でセッションを切ります。
ここで重要なのはパーサを言語非依存にするという事。 第一引数を受け取り、レスポンスとしてslackへ送るJSONデータを標準出力に吐けるのであれば、シェルスクリプトからアセンブリまで実装可能です。
サンプルとして入力された文字列をそのまま返す「エコー」を書きます。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use JSON;
my @query = split(/&/, $ARGV[0]);
my ($str, $key, $val, %req);
foreach (@query) {
($key, $val) = split(/=/, $_);
$req{$key} = $val;
}
my $data = {
token => $req{token},
text => $req{text},
};
print encode_json($data);
return 0;
色々書いてありますが、POSTされた文字列のうち、反応した時の文字列$req{token}
をそのままレスポンスに含める文字列として指定しています。
あとはパイプ経由でmarunage
がレスポンス返してくれる感じです。
おわり。
Nikon D500買いました。
やすなちゃんかわいい!ちなみに上は「消臭剤」です。
!1234 をマージします
とslackに書くと、踏み台を経由してCIが動いてマージするみたいなのに使うぽいですチームメンバーへの周知とマージ作業が1回で出来てべんり
ただ、セキュリティ的な問題があったので、チームでは社内ネットワークで動いているhubotにメンションで直接話しかけてJenkinsのリモートAPIを叩いてGitLabのCIを動かして…、と無駄に壮大な作りになっています(その代わり、キュー管理されているのでpostしっぱなしで複数のMRをマージしてくれてべんり)