さこ街浪漫

GO ON A HIGHWAY

Slack の Incoming WebHook を投げてみたメモ

はじめに

何らかのシステムから Slack のチャネルにメッセージを飛ばすメモ。

Integrations -> Incoming WebHooks から WebHook を作っておく。ここで Slack から提示された URL に POST を投げると Slack のチャネルにメッセージが届く、という仕掛け。

curl コマンドによるサンプル

どちらでもよいが、↓こういう投げ方と

curl -X POST --data-urlencode 'payload={"text": "えいっ!"}' https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXX

↓こういう投げ方がある。

curl -X POST --data '{"text": "えいっ!"}' https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXX
  • “channel” や “username” といったキーも使用できる。"channel" が指定されれば、そのチャネルに、"username" が指定されればそのユーザー名でメッセージがポストされる。指定しなければ WebHook に設定したチャネルやユーザー名が適用される。

f:id:masal3:20151207222614p:plain

Python によるサンプル

payload のあたりがよくわからず、いろいろと試行錯誤してしまったが結局↓こういうこと。

#!/usr/bin/env python
# coding: utf-8

import requests
import json

def _main():

    #
    # コンテンツを準備
    #

    values = {'text': 'えいっ!'}
    content = json.dumps(values, ensure_ascii=False)

    #
    # 組み立てたコンテンツ(=JSON)を Slack に送信
    #

    url = 'https://hooks.slack.com/services/XXX...'
    answer = requests.post(url, data=content)

    print(answer.text)

_main()
Perl によるサンプル
#!/usr/bin/env perl
# coding: utf-8

use strict;
use utf8;
use LWP::UserAgent;
use JSON;

sub _main {

    binmode(STDIN,  ':utf8');
    binmode(STDOUT, ':utf8');
    binmode(STDERR, ':utf8');


    #
    # コンテンツの準備
    #

    my $values = {text => 'えいっ!'};
    my $content = JSON::to_json($values, {utf8 => 1});

    #
    # 組み立てたコンテンツ(=JSON)を Slack に送信
    #

    my $url = 'https://hooks.slack.com/services/XXX...';
    my $user_agent = LWP::UserAgent->new();
    my $response = $user_agent->post(
        $url,
        Content_Type => 'application/json; charset=UTF-8',
        Content => $content);
    if(!$response->is_success) {
        print($response->status_line, "\n");
        return;
    }

    print($response->decoded_content, "\n");
}

_main(@ARGV);
Ruby によるサンプル
#!/usr/bin/env ruby
# coding: utf-8

require 'uri'
require 'net/http'
require 'json'

def _main()

    #
    # コンテンツを準備
    #

    values = {'text' => 'えいっ!'}
    content_text = JSON.generate(values)

    uri = URI.parse('https://hooks.slack.com/services/XXX...')
    request_data = Net::HTTP::Post.new(uri.request_uri)
    request_data['Content-Type'] = 'application/json'
    request_data.body = content_text

    #
    # コンテンツ(=JSON)を Slack に送信
    #

    http_client = Net::HTTP.new(uri.host, uri.port)
    http_client.use_ssl = true
    response_data = http_client.request(request_data)

    print(response_data.message, "\n")
 
end 

_main()
まとめ

payload??