Skip to content

Instantly share code, notes, and snippets.

@sasairc
Last active November 1, 2016 18:43
Show Gist options
  • Save sasairc/835f1ddd9a0fa6eadad1f10679c8404a to your computer and use it in GitHub Desktop.
Save sasairc/835f1ddd9a0fa6eadad1f10679c8404a to your computer and use it in GitHub Desktop.
Slack Outgoing Webhooksを扱うサーバのようなもの

Slack Outgoing Webhooksを扱うサーバのようなもの

この記事はおさむん家 Advent Calendar 2014の記事ですが、読んでも読まなくても構いません。

タイトル通りですが、Slack Outgoing Webhooksを扱う「処理言語非依存」なサーバのようなものを作りました。 前にslack上ではちよんさんに「作ったら知見お願い」と頼まれたので、その旨を書きます。

sasairc/marunage - Slack Outgoing Webhooksのサーバのようなもの。

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&timestamp=[timestamp]&user_id=[user_id]&user_name=sasairc&text=yasunachantext&trigger_word=yasuna

marunage

marunageは任意のポートを監視します。そこへslackからPOSTがあった場合、HTTPヘッダ等を取り除いた上記のような文字列を第一引数に、指定されたパーサを起動。そしてパーサの標準出力から処理結果を受け取ります。 また、受け取った内容に対してレスポンスを送らない場合はnosendと出力すれば、marunage側でセッションを切ります。

ここで重要なのはパーサを言語非依存にするという事。 第一引数を受け取り、レスポンスとしてslackへ送るJSONデータを標準出力に吐けるのであれば、シェルスクリプトからアセンブリまで実装可能です。

Example

サンプルとして入力された文字列をそのまま返す「エコー」を書きます。

#!/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がレスポンス返してくれる感じです。

おわり。

180度違う話

Nikon D500買いました。

やすなちゃんかわいい!ちなみに上は「消臭剤」です。

@844196
Copy link

844196 commented Oct 30, 2016

fbd289ca-f47e-11e5-9acc-dec348d10433

BOT以外では何に使えば良いか

!1234 をマージします とslackに書くと、踏み台を経由してCIが動いてマージするみたいなのに使うぽいです
チームメンバーへの周知とマージ作業が1回で出来てべんり

ただ、セキュリティ的な問題があったので、チームでは社内ネットワークで動いているhubotにメンションで直接話しかけてJenkinsのリモートAPIを叩いてGitLabのCIを動かして…、と無駄に壮大な作りになっています(その代わり、キュー管理されているのでpostしっぱなしで複数のMRをマージしてくれてべんり)

@sasairc
Copy link
Author

sasairc commented Oct 30, 2016

@844196

!1234 をマージします とslackに書くと、踏み台を経由してCIが動いてマージするみたいなのに使うぽいです
チームメンバーへの周知とマージ作業が1回で出来てべんり

おお、そういう使い方もあるんですね。slackからトリガー引けるのは便利そう。
marunageも実装で言えばセキュリティ甘いですが、パーサ側でtoken識別できれば良いかと茶を濁しております・・・

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment