HAVRMの空空活動誌

「空空」は「うつらうつら」と読むらしいです.まぁ常に寝不足なもんで...

Slack Botの製作 ~1:よくわからないけど送信してみる~

皆さん こんにちは
HAVRMです.

これまでいろいろなプログラムを書いてきましたが,中には数時間かかるものもあります.
これらを放置したまま他の作業や出かけたりすることがあるのですが,途中でエラーを起こしていたりすると結構ショックを受けるものです.処理の結果を何らかの方法でスマホに送信できたらといろいろbotを調べていましたが,そもそもそういったのが使えるツールを使っていないこと(SNSで使っているのはLINEぐらいです...),設定に固定IPアドレスが必要だったりと面倒でした(AWSとかいろいろなサービスがあるのでそれを使うのが大半です).
しかし最近Slackを使いだし,そのbotが簡単に利用できそうだったので,やってみることにしました.
とりあえずやりたいことは次の通りです.

  • プログラム完了時に完了した旨と結果を送信する
  • こちらからメッセージを送信し,それに対して返答をする.

ネットを見てみると専用のSDKBoltRuby等をつかって実装していることが多い?のですが,新たに文法を覚えるのとかめんどい大変なので,いつも使っているShellScriptを使うことにします(無理になったら諦めます).とりあえず今回は送信してみます.

簡単に

Slack Botにはいろいろな種類のbotがあります.種類については以下のサイトが参考になります.
qiita.com
固定IPアドレスが不要で送受信可能なAPIはReal Time Messageing APIなのでこれを使ってみようと思います.

登録

botを使いたいワークスペースに移動します(私はSlackをデスクトップアプリで使用しています).ワークスペースでAppを追加します.

f:id:HAVRM:20200218194630j:plain
App画面
検索で「bots」を調べ,これを追加します.
f:id:HAVRM:20200218195912p:plain
Bots画面
登録後ユーザ名を聞かれるのでユーザ名を適当に入れ,「ボットインテグレーションを追加する」を押して登録します.
f:id:HAVRM:20200218200125p:plain
Botsユーザ名登録
この次の画面でいろいろ登録できますが,とりあえずは変更しなくても大丈夫そうです.ただし,送信時に必要になる「トークン」をどこかにコピーしておきましょう.この「トークン」で識別をするのでこれを漏らすと他人から勝手に送られる可能性があります.
f:id:HAVRM:20200218200608p:plain
ボットインテグレーション
これで登録は終わりです.

コマンドで送信する

次にメッセージをコマンドで送信してみましょう.送信はcurlを使った方法が掲載されているのでそれを見ながら簡単に「hello」と送信してみましょう.
api.slack.com
この方法はWebAPIですが,普通に送れます.ただデータを少し変える必要があります.

チャンネルIDを取得する

まず送信先のチャンネルのIDを取得します.ここではchannels.listメソッドを使います.curlで-Xオプションで「GET」を,-Hオプションでコンテントタイプを「application/x-www-form-urlencoded」,認可を「Bearer <トークンID>」とします.送信先APIのURLを指定します.実際のコードは次のようになります.

curl -X GET -H 'Content-Type:application/x-www-form-urlencoded' -H 'Authorization: Bearer xoxb-...' https://slack.com/api/channels.list

この結果がJSONで帰ってきます.その結果はメソッドのページにありますが,この送信先チャンネル名のIDを記録しておきます.

(2021/5/6追記)
先日このchannels.listメソッドを使ったところ次のようなレスポンスが返ってきました.

{
  "ok":false,
  "error":"method_deprecated",
  "response_metadata":{
    "messages":[
      "[ERROR] This method is retired and can no longer be used. Please use conversations.list or users.conversations instead. Learn more: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api."
    ]
  }
}

どうもchannels.listメソッドは使えなくなったようです.
このレスポンスにあるように代わりにconversations.listメソッドを使います.またいろいろなオプションを追加できますが,JSON形式に対応してないそうなのでURLをエンコードするかPOSTボディに埋め込むかしないといけないようです.これを使ってから気づいたのですが,どうもデフォルトだとpublicチャンネルしかリストを取得できないのでprivateチャンネルを読み込むためにはtypes Argumentで記述する必要があります.ここら辺の記述方法がよくわからなかったのですが,conversations.list method | Slackでtypes欄に両方受信する意味の「public_channel,private_channel」を記入し,「Test Method」を選択するとこのオプションを含んだURLが表示されるのでこれを使います.

https://slack.com/api/conversations.list?types=public_channel%2Cprivate_channel&pretty=1

最後の「pretty=1」はなくても動きました.
実際に取得する際はcurlで-Xオプションで「GET」を,-Hオプションでコンテントタイプを「application/x-www-form-urlencoded」,認可を「Bearer <トークンID>」とします.送信先は先ほどのURLを指定します.実際のコードは次のようになります.

curl -X GET -H 'Content-Type:application/x-www-form-urlencoded' -H 'Authorization: Bearer xoxb-...' https://slack.com/api/conversations.list?types=public_channel%2Cprivate_channel

この結果のJSONは前のと同じような内容になります.

{
  "ok": true,
  "channels": [
    {
      "id": "<チャンネルID>",
      "name": "<チャンネル名>",
      "is_channel": true,
      ...
    }
  ]
}

このような感じで帰ってくるのでチャンネル名に対応するチャンネルIDはidの項目のものとなります.

メッセージを送信する

次に送信します.ここではchat.postMessageメソッドを使います.今回は-Xオプションを「POST」,-Hでコンテントタイプを「application/json」,認可を「Bearer <トークンID>」,--dataオプションでJSON形式のデータ,今回は次の形のものを送信します.

{
  "channel":"<チャンネルID>",
  "test":"hello"
}

実際のコードは次のようになります.

curl -X POST -H 'Content-Type:application/json' -H 'Authorization: Bearer xoxb-...' --data '{"channel":"<チャンネルID>","text":"hello"}' https://slack.com/api/chat.postMessage

今回はgeneralのIDに送信したので次のように表示されます.

f:id:HAVRM:20200218203749p:plain
送信結果

まとめ

とりあえず送信だけはできたので今回はここまでとします.この後メッセージ受信に対し返信するコードを作ろうと思います.