Pythonからslack apiを利用してみるwith PyCharm

Python

はじめに

はとむぎ
はとむぎ

Pythonの開発環境とslack apiを利用する環境が整ったので、ついにPythonからいろいろやってみます!

チャンネルに参加しているメンバーの一覧や、リアクションしてる人の和名を取得してみましょう!

※以下参考

パッケージインストール

slackclientインストール

slackclientを利用するとトークンを設定するだけで、APIを頑張って叩かなくても関数コールでslack apiを利用できるようになるみたいです。

GitHub - slackapi/python-slack-sdk: Slack Developer Kit for Python
Slack Developer Kit for Python. Contribute to slackapi/python-slack-sdk development by creating an account on GitHub.

せっかくなのでコマンドからではなく、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取得

conversations.list API method
Lists all channels in a Slack team.

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取得

reactions.get API method
Gets reactions for an item.

リアクションを取得するにはチャンネルの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取得

conversations.members API method
Retrieve members of a conversation.

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取得

users.list API method
Lists all users in a Slack team.

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】
はとむぎ

ひとまずやりたいことはできました!

コメント

タイトルとURLをコピーしました