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 に設定したチャネルやユーザー名が適用される。
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??