はじめに
Pythonの開発環境とslack apiを利用する環境が整ったので、ついにPythonからいろいろやってみます!
チャンネルに参加しているメンバーの一覧や、リアクションしてる人の和名を取得してみましょう!
※以下参考
パッケージインストール
slackclientインストール
slackclientを利用するとトークンを設定するだけで、APIを頑張って叩かなくても関数コールでslack apiを利用できるようになるみたいです。
せっかくなのでコマンドからではなく、PyCharmからインストールしてみます。
「File」>「Settings」で開いたダイアログで
「Project:アプリ名」>「Python Interpreter」を選択します。
インストール済みのパッケージの一覧が表示されるので、「+」のところをクリック。
検索ボックスに「slackclient」を入力すると候補に出てくるので「Install Package」をクリック。
「Package ‘slackclient’ installed successfully」と表示されるので、「×」で閉じましょう。
依存関係で色々入ったみたいですね。
slackclientを使ってみる
パッケージ構成
https://rinatz.github.io/python-book/ch04-06-project-structures/
を参考に以下の構成にします。(と言ってもテストは書かないですが;
※Pythonはクラス名や型以外は小文字らしいのでプロジェクト名も小文字にしました。
(project)
├── (project) ............ プログラムのソースコードディレクトリ
│ ├── __init__.py
│ └── *.py
└── tests ................ 単体テストのソースコードディレクトリ
├── __init__.py
└── *.py
環境変数設定
slackclientを利用するにあたって環境変数にOAuthトークンを設定しておく。
「Run」>「Edit Configurations…」をクリック。
「Python」>「Environment valiables」の赤で囲ったところをクリック。
「+」で環境変数「SLACK_API_TOKEN」を追加して「OK」
※Valueも入力してください
conversations.list取得
slackclientの使い方は以下のREADMEを参考にしてみる。
https://github.com/slackapi/python-slackclient/blob/master/README.md#basic-usage-of-the-web-client
PyCharmを使うと補完してくれて便利ですね!
conversations.listを取得してchannelsの中身をダンプしてみました。
import os
import slack
client = slack.WebClient(token=os.environ['SLACK_API_TOKEN'])
response = client.conversations_list(**{'types': 'private_channel'})
print(response.data['channels'])
以下マスク済みの出力結果です。
[{'id': '****', 'name': 'アプリ作成', 'is_channel': False, 'is_group': True, 'is_im': False, 'created': 1586742682, 'is_archived': False, 'is_general': False, 'unlinked': 0, 'name_normalized': 'アプリ作成', 'is_shared': False, 'parent_conversation': None, 'creator': '****', 'is_ext_shared': False, 'is_org_shared': False, 'shared_team_ids': ['****'], 'pending_shared': [], 'pending_connected_team_ids': [], 'is_pending_ext_shared': False, 'is_member': True, 'is_private': True, 'is_mpim': False, 'last_read': '1586742714.000400', 'is_open': True, 'topic': {'value': '', 'creator': '', 'last_set': 0}, 'purpose': {'value': '', 'creator': '', 'last_set': 0}, 'priority': 0}]
reactions.get取得
リアクションを取得するにはチャンネルのIDと投稿のタイムスタンプが必要でした。
チャンネルのIDは自動で取得、タイムスタンプは決め打ちでリアクション取得してみましょう。
conversations.listから取得したchannelsの中の「アプリ作成」チャンネルのIDをreactions.getに利用します。timestampは固定とします。
import os
import slack
client = slack.WebClient(token=os.environ['SLACK_API_TOKEN'])
response = client.conversations_list(**{'types': 'private_channel'})
channels = response.data['channels']
for channel in channels:
if channel['name'] == 'アプリ作成':
channel_id = channel['id']
response = client.reactions_get(**{'channel': channel_id, 'timestamp': '1586742714.000400'})
print(response.data['message']['reactions'])
リアクションは以下(お試し用にワークスペースを作ったのでボッチ)
マスク済みの出力結果は以下。
[{'name': 'bug', 'users': ['****'], 'count': 1}]
conversations.members取得
reactions.get同様にチャンネルのIDは自動で取得して、チャンネルのメンバー一覧を取得してみましょう。
import os
import slack
client = slack.WebClient(token=os.environ['SLACK_API_TOKEN'])
response = client.conversations_list(**{'types': 'private_channel'})
channels = response.data['channels']
for channel in channels:
if channel['name'] == 'アプリ作成':
channel_id = channel['id']
response = client.conversations_members(channel=channel_id)
print(response['members'])
マスク済みの出力結果は以下。(slackアプリと自分の2人・・)
['****', '****']
users.list取得
reactions.getとconversion.membersではユーザがIDのみで誰か分からないのでusers.listで和名も取得してみましょう。
とりあえず関数化はせずにベタ書きで動かしてみます。
import os
import slack
client = slack.WebClient(token=os.environ['SLACK_API_TOKEN'])
# ワークスペースのメンバー一覧を取得
print('【ワークスペースのメンバー一覧】')
response = client.users_list()
members = response.data['members']
# IDと和名変換用に連想配列にしておく
members_map = {}
for member in members:
print("id=" + member['id'] + ", name=" + member['real_name']) # real_nameが和名
members_map[member['id']] = member['real_name']
# privateチャンネル情報取得
response = client.conversations_list(**{'types': 'private_channel'})
channels = response.data['channels']
for channel in channels:
# 「アプリ作成」チャンネルのID取得
if channel['name'] == 'アプリ作成':
channel_id = channel['id']
# 「アプリ作成」チャンネルに参加しているメンバーの一覧を取得
print('【「アプリ作成」チャンネルのメンバー一覧】')
response = client.conversations_members(channel=channel_id)
channel_members = response['members']
for channel_member in channel_members:
print(members_map[channel_member])
# 指定した時刻の投稿のリアクションを取得
response = client.reactions_get(**{'channel': channel_id, 'timestamp': '1586742714.000400'})
reactions = response.data['message']['reactions']
for reaction in reactions:
reaction_users = reaction['users']
for reaction_user in reaction_users:
print('【リアクション:' + reaction['name'] +'】')
print(members_map[reaction_user])
リアクションを追加して実行、マスク済みの出力結果は以下。
【ワークスペースのメンバー一覧】
id=****, name=Slackbot
id=****, name=はとむぎ
id=****, name=firststepapp
【「アプリ作成」チャンネルのメンバー一覧】
はとむぎ
firststepapp
【リアクション:bug】
はとむぎ
【リアクション:grinning】
はとむぎ
ひとまずやりたいことはできました!
コメント