Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Python Slack

SlackのAPIでユーザー一覧を取得する方法をご紹介

投稿日:2023年4月4日 更新日:

 

<目次>

(1) SlackのAPIでユーザー一覧を取得する方法をご紹介
 (1-0) やりたいこと
 (1-1) STEP1:Slackボットの作成
 (1-2) STEP2:サンプルプログラム

(1) SlackのAPIでユーザー一覧を取得する方法をご紹介

(1-0) やりたいこと

●アウトプットイメージ

Slack APIでユーザー一覧を照会した結果(JSON)を、表形式に整形したのち、csvに出力する。
(図111)

●処理の流れ

Slack Appを作成し、そのApp経由でユーザー一覧のAPIを照会します。
(図112)

目次にもどる

(1-1) STEP1:Slackボットの作成

APIの処理はSlackボットを経由して行うため、事前にSlackボットを準備しておきます。
(作成手順)
その際、ボットには必要な権限を割り当てておきます。
・①必要な権限
→「users:read」権限が必要
(図122)

・②OAuth & Permissionsを選択

(図123)

・③割り当て
(図124)

また、Bot User OAuth Tokenはプログラムの中で指定が必要なため、控えておきます。
(図121)

目次にもどる

(1-2) STEP2:サンプルプログラム

(サンプルプログラム)

slack_get_user_list.py

import json
import pandas as pd
import requests
import os
from pathlib import Path
from dotenv import load_dotenv

# 親フォルダパスを取得
file_path = Path(__file__).parent
# 「.env」ファイルのパスを設定
env_path = file_path/'.env'
# 「.env」ファイルのロード
load_dotenv(dotenv_path=env_path)

def main():

    # APIのURL
    url = os.environ['URL']

    # ヘッダー部
    headers = {
        "Content-Type":"application/json",
        "User-Agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)",
        "Authorization":"Bearer "+os.environ['SLACK_BOT_TOKEN']
    }
    
    # POSTリクエスト
    # →ユーザー一覧を取得します。
    response = requests.post(url, headers=headers)
    
    # レスポンスの内容をtext形式で取得
    result = response.text

    # レスポンスのJSONを表形式データ(DataFrame)に変形する
    # JSONライブラリを用いて、JSONファイルのデータをJSONオブジェクトとしてロード
    json_object = json.loads(result)
    # pandasの「json_normalize」関数を用いてデータを正規化
    # 第1引数:json形式のオブジェクト
    # 第2引数:分解対象のデータのkey
    # 第3引数:その他、分解した明細に付与するデータ
    df = pd.json_normalize(json_object, record_path =['members'])
    # df = pd.json_normalize(json_object, record_path =['students'],meta=['school_name', 'class'])
 
    # 表形式データ(DataFrame)をcsv出力する
    # →日本語も含まれるため、エンコーディングはshift-jisを指定
    df.to_csv('./slack_get_user_list.csv', sep=',', encoding='shift-jis', header=True)

if __name__ == "__main__":
     main()

(図131)

.env

URL='https://xxxxx.slack.com/api/users.list'
SLACK_BOT_TOKEN='xoxb-xxxxx'

(図132)

実行するとプログラムと同じ階層に、csvが生成されます。
(図133)
Csvはユーザー単位でデータが出力されています。
(json形式のデータを表形式に整形している)

 

(図134)

ちなみに、元々のJSON形式のレスポンスはこんな感じです。
ネストになっている「”profile”: { ・・・ }」の部分も、csvの右側に列がちゃんと存在している事が確認できています。

 

(参考)

{
    "ok": true,
    "members": [
        {
            "id": "USLACKBOT",
            "team_id": "T02TA6EUXSN",
            "name": "slackbot",
            "deleted": false,
            "color": "757575",
            "real_name": "Slackbot",
            "tz": "America/Los_Angeles",
            "tz_label": "Pacific Standard Time",
            "tz_offset": -28800,
            "profile": {
                "title": "",
                "phone": "",
                "skype": "",
                "real_name": "Slackbot",
                "real_name_normalized": "Slackbot",
                "display_name": "Slackbot",
                "display_name_normalized": "Slackbot",
                "fields": {},
                "status_text": "",
                "status_emoji": "",
                "status_emoji_display_info": [],
                "status_expiration": 0,
                "avatar_hash": "sv41d8cd98f0",
                "always_active": true,
                "first_name": "slackbot",
                "last_name": "",
                "image_24": "https://a.slack-edge.com/80588/img/slackbot_24.png",
                "image_32": "https://a.slack-edge.com/80588/img/slackbot_32.png",
                "image_48": "https://a.slack-edge.com/80588/img/slackbot_48.png",
                "image_72": "https://a.slack-edge.com/80588/img/slackbot_72.png",
                "image_192": "https://a.slack-edge.com/80588/marketing/img/avatars/slackbot/avatar-slackbot.png",
                "image_512": "https://a.slack-edge.com/80588/img/slackbot_512.png",
                "status_text_canonical": "",
                "team": "T02TA6EUXSN"
            },
            "is_admin": false,
            "is_owner": false,
            "is_primary_owner": false,
            "is_restricted": false,
            "is_ultra_restricted": false,
            "is_bot": false,
            "is_app_user": false,
            "updated": 0,
            "is_email_confirmed": false,
            "who_can_share_contact_card": "EVERYONE"
        },
        {
            "id": "U02SVHS9AA3",
            "team_id": "T02TA6EUXSN",
            "name": "xxxxx.xxxxx.xxxxx",
            "deleted": false,
            "color": "e7392d",
            "real_name": "xxxx",
            "tz": "Asia/Tokyo",
            "tz_label": "Japan Standard Time",
            "tz_offset": 32400,
            "profile": {
                "title": "",
                "phone": "",
                "skype": "",
                "real_name": "xxxx",
                "real_name_normalized": "xxxx",
                "display_name": "Rainbow Planet03",
                "display_name_normalized": "Rainbow Planet03",
                "fields": null,
                "status_text": "",
                "status_emoji": "",
                "status_emoji_display_info": [],
                "status_expiration": 0,
                "avatar_hash": "5cb320e52419",
                "image_original": "https://avatars.slack-edge.com/2022-02-22/3157324385041_5cb320e52419489e7cc6_original.jpg",
                "is_custom_image": true,
                "first_name": "xxxx",
                "last_name": "",
                "image_24": "https://avatars.slack-edge.com/2022-02-22/3157324385041_5cb320e52419489e7cc6_24.jpg",
                "image_32": "https://avatars.slack-edge.com/2022-02-22/3157324385041_5cb320e52419489e7cc6_32.jpg",
                "image_48": "https://avatars.slack-edge.com/2022-02-22/3157324385041_5cb320e52419489e7cc6_48.jpg",
                "image_72": "https://avatars.slack-edge.com/2022-02-22/3157324385041_5cb320e52419489e7cc6_72.jpg",
                "image_192": "https://avatars.slack-edge.com/2022-02-22/3157324385041_5cb320e52419489e7cc6_192.jpg",
                "image_512": "https://avatars.slack-edge.com/2022-02-22/3157324385041_5cb320e52419489e7cc6_512.jpg",
                "image_1024": "https://avatars.slack-edge.com/2022-02-22/3157324385041_5cb320e52419489e7cc6_1024.jpg",
                "status_text_canonical": "",
                "team": "T02TA6EUXSN"
            },
            "is_admin": false,
            "is_owner": false,
            "is_primary_owner": false,
            "is_restricted": false,
            "is_ultra_restricted": false,
            "is_bot": false,
            "is_app_user": false,
            "updated": 1664089582,
            "is_email_confirmed": true,
            "who_can_share_contact_card": "EVERYONE"
        },
		~中略~
    ],
    "cache_ts": 1670836750,
    "response_metadata": {
        "next_cursor": ""
    }
}
(参考)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Python, Slack
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

PythonのPandas使用時に発生した「UnicodeEncodeError: ‘ascii’ codec can’t encode characters~」エラーの対処方法について

(0)目次&概説 (1) エラー対応1:UnicodeEncodeError  (1-1) 発生状況・エラーメッセージ   (1-1-1) エラーメッセージ   (1-1-2) エラーとなったソース …

Pythonで複数の画像を結合する方法をご紹介

<目次> (1) Pythonで複数の画像を結合する方法  (1-1) STEP1:Pillowのインストール  (1-2) STEP2:画像の読み込み  (1-3) STEP3:画像を結合  (1- …

no image

PythonでJSON形式データの値を取得する手順について

  <目次> (1) PythonでJSON形式データの値を取得する手順について  (1-1) サンプル①:ローカルのJSONファイルの読み込み(単純構造)  (1-2) サンプル②:ローカ …

no image

PythonでValueError: If using all scalar values, you must pass an indexエラーが出た時の対処方法

  <目次> (1) PythonでValueError: If using all scalar values, you must pass an indexエラーが出た時の対処方法  ( …

CondaHTTPError: HTTP 000 CONNECTION FAILED for url XXXXエラーの対処方法

  <目次> (1) CondaHTTPError: HTTP 000 CONNECTION FAILED for url XXXXエラーの対処方法  (1-1) 事象概要とエラーメッセージ …

  • English (United States)
  • 日本語
Top