iMind Developers Blog

iMind開発者ブログ

Python + Slack APIでダイレクトメッセージを送る

概要

SlackのAPIでチャンネル指定ではなく個人を指定してダイレクトメッセージを送る。

バージョン情報

  • slackclient==2.5.0

導入

pip install slackclient

下準備

下記URLから「Create New APP」で新しいアプリを作成。

https://api.slack.com/apps

作成されたScopesの「Add features and functionality」 → 「Permissions」

f:id:mwsoft:20200307230323p:plain

「Bot Token Scopes」から下記の権限を追加する。

  • im:write(ダイレクトメッセージの投稿用)
  • chat:write(チャンネルへの投稿用)

f:id:mwsoft:20200307230414p:plain

「Install App to Workspace」から「Allow」して表示されたOAuth Tokenをメモする。

slackclientでchannelにメッセージを飛ばす

取得したTokenを利用してチャンネルにメッセージを送信してみます。

import slack

OAUTH_TOKEN = 'さっきコピーしたトークン'
CHANNEL_NAME = '#メッセージ飛ばし先のチャンネル名'

client = slack.WebClient(token=OAUTH_TOKEN)

response = client.chat_postMessage(
    channel=CHANNEL_NAME,
    text="chat bot test message")

これを実行すると下記のようなエラーになります。

The server responded with: {'ok': False, 'error': 'not_in_channel'}

チャンネルに登録されてないからメッセージが送れないようです。

Slackの当該チャンネルを開いて「アプリを追加する」から当該アプリを追加すると、メッセージが送れるようになります。

ダイレクトメッセージを送る

DMを送る場合は、im_openでメッセージチャンネルを開いてから、chat_postMessageします。

コード内で指定している「USER_ID」は表示名ではなくSlackから振られている一意のIDです。

Slackを開いて「プロフィール&アカウント」から「メンバーIDをコピー」で取得できます。

f:id:mwsoft:20200307231547p:plain

USER_ID = '送りたいユーザーのID'

res = client.im_open(user=USER_ID)  
dm_channel_id = res['channel']['id']

res = client.chat_postMessage(
  channel=dm_channel_id,
  text="chat bot test message")

res['ok']
  #=> true

おまけ : ユーザーの一覧を取得する

実行する前に下記を権限に追加する

  • users:read

下記のようなコードでユーザーの一覧を取得できる。

res = client.users_list()
for member in res['members']:
    print(member)

改定履歴

Author: Masato Watanabe, Date: 2020-03-07, 記事投稿