【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

【Slack API】自動いいね・ダイレクトメッセージ・投稿収集

f:id:AIProgrammer:20210216190612p:plain

動かしながら学ぶ PyTorchプログラミング入門

動かしながら学ぶ PyTorchプログラミング入門

  • 作者:斎藤勇哉
  • 発売日: 2020/11/30
  • メディア: Kindle版

目的

  • Slackのあるチャネル内の投稿に、自動いいね
  • Slackで自動ダイレクトメッセージ
  • Slackから投稿コメントを一括収集

準備

アクセストークンの取得

Slack APIを使用するためには、アクセストークンが必要である。次の手順で、アクセストークンを取得する。

Slack APIで、WorkspaceのAPI appを作成。

f:id:AIProgrammer:20210203184018p:plain

② 左側「Features/OAuth & Permissions」の「User Token Scopes 」から、必要なOAuth Scopeを追加。以下は、例として「channels:history」と「channels:read」を追加している。

f:id:AIProgrammer:20210203152137p:plain

③ 「OAuth Access Token」を、コードの「TOKEN」変数に格納。

f:id:AIProgrammer:20210203152159p:plain

SlackチャンネルIDの確認

チャンネル(channel)を右クリックし、「リンクをコピー」する。

f:id:AIProgrammer:20210216185310p:plain

リンクの末尾にある英数字が、チャンネルIDになる。

https://myslack.slack.com/archives/<チャンネルID>

Slackのあるチャネル内の投稿に、自動いいね

使用するAPI

こちらから、必要なOAuth Scope確認し、追加する。

コード

「SLACK_CHANNEL_ID 」と「TOKEN」を設定した後に、以下を実行。

  • SLACK_CHANNEL_ID : チャンネルID
  • TOKEN : OAuth Access Token
# -*- coding: utf-8 -*-
import requests
import pandas as pd
import datetime
import re


def get_timestamp_id(SLACK_CHANNEL_ID, TOKEN, SLACK_URL):
    params = {
        "channel": SLACK_CHANNEL_ID,
        "token": TOKEN,
    }
    response = requests.get(SLACK_URL, params=params)
    all_timestamp_ids = [x['ts'] for x in response.json()['messages']]
    return all_timestamp_ids

def add_reaction(SLACK_CHANNEL_ID, TOKEN, SLACK_URL, TIMESTAMP, REACTION_NAME='thumbsup'):
    params = {
        "channel": SLACK_CHANNEL_ID,
        "token": TOKEN,
        "name": REACTION_NAME,
        "timestamp": TIMESTAMP
    }
    response = requests.get(SLACK_URL, params=params)



def main():
    # Define
    TOKEN = <ACCESS TOKEN>
    SLACK_CHANNEL_ID = <SLACK_CHANNEL_ID >
    SLACK_URL_HISTORY = 'https://slack.com/api/conversations.history'
    SLACK_URL_REACT = 'https://slack.com/api/reactions.add'


    # Get timestamp id
    all_timestamp_ids = get_timestamp_id(
        SLACK_CHANNEL_ID, TOKEN, SLACK_URL_HISTORY)

    # Get post and reply
    for timestamp_id in all_timestamp_ids:
        add_reaction(SLACK_CHANNEL_ID, TOKEN, SLACK_URL_REACT, timestamp_id, REACTION_NAME='thumbsup')

if __name__ == '__main__':
    main()

使用するAPI

こちらから、必要なOAuth Scope確認し、追加する。

コード

「DM_TEXT」と「TOKEN」を設定した後に、以下を実行。

  • DM_TEXT : ダイレクトメッセージで送りたい内容
  • TOKEN : OAuth Access Token
# -*- coding: utf-8 -*-
import requests
import pandas as pd
import datetime
import re


def get_timestamp_id(SLACK_CHANNEL_ID, TOKEN, SLACK_URL):
    params = {
        "channel": SLACK_CHANNEL_ID,
        "token": TOKEN,
    }
    response = requests.get(SLACK_URL, params=params)
    all_timestamp_ids = [x['ts'] for x in response.json()['messages']]
    return all_timestamp_ids


def add_reaction(SLACK_CHANNEL_ID, TOKEN, SLACK_URL, TIMESTAMP, REACTION_NAME='thumbsup'):
    params = {
        "channel": SLACK_CHANNEL_ID,
        "token": TOKEN,
        "name": REACTION_NAME,
        "timestamp": TIMESTAMP
    }
    response = requests.get(SLACK_URL, params=params)


def get_userid(TOKEN, SLACK_URL):
    params = {
        "token": TOKEN,
    }
    response = requests.get(SLACK_URL, params=params)
    user_ids = [x['id'] for x in response.json()['members']]
    return user_ids


def get_dmid(USERID, TOKEN, SLACK_URL):
    params = {
        "token": TOKEN,
        "users": USERID
    }
    response = requests.get(SLACK_URL, params=params)
    user_dmid = response.json()['channel']['id']
    return user_dmid


def send_dm(DMID, TEXT, TOKEN, SLACK_URL):
    params = {
        "token": TOKEN,
        "channel": DMID,
        "text": TEXT
    }
    response = requests.get(SLACK_URL, params=params)


def main():
    # Define
    TOKEN = <ACCESS TOKEN>
    DM_TEXT = '本日もお疲れ様でした。今後ともよろしくお願いいたします。'
    SLACK_URL_USERLIST = 'https://slack.com/api/users.list'
    SLACK_URL_DMID = 'https://slack.com/api/conversations.open'
    SLACK_URL_DM = 'https://slack.com/api/chat.postMessage'


    user_ids = get_userid(TOKEN, SLACK_URL_USERLIST)
    for user_id in user_ids:
        user_dmid = get_dmid(user_id, TOKEN, SLACK_URL_DMID)
        send_dm(user_dmid, DM_TEXT, TOKEN, SLACK_URL_DM)


if __name__ == '__main__':
    main()

Slackから投稿コメントを一括収集

ワークスペースに存在するすべてのチャンネルごとに投稿を収集し、CSVに保存する。

使用するAPI

こちらから、必要なOAuth Scope確認し、追加する。

コード

Slackトークン(TOKEN)を、Workspaceに応じて変更すること。

  • TOKEN : OAuth Access Token
# -*- coding: utf-8 -*-
import requests
import pandas as pd
import datetime
import re


def get_channel(TOKEN, SLACK_URL):
    params = {
        "token": TOKEN,
    }
    response = requests.get(SLACK_URL, params=params)  # Request
    all_channel_ids = [x['id']
                       for x in response.json()['channels']]  # Extract channel name
    all_channel_names = [x['name']
                         for x in response.json()['channels']]  # Extract channel name
    return {'id': all_channel_ids, 'name': all_channel_names}


def get_timestamp_id(SLACK_CHANNEL_ID, TOKEN, SLACK_URL):
    params = {
        "channel": SLACK_CHANNEL_ID,
        "token": TOKEN,
    }
    response = requests.get(SLACK_URL, params=params)
    all_timestamp_ids = [x['ts'] for x in response.json()['messages']]
    return all_timestamp_ids


def get_post(SLACK_CHANNEL_ID, TOKEN, SLACK_URL, timestamp_id):
    params = {
        "channel": SLACK_CHANNEL_ID,
        "token": TOKEN,
        "ts": timestamp_id
    }
    response = requests.get(SLACK_URL, params=params)  # Request
    replys = [x['text']
              for x in response.json()['messages']]  # Extract post comments
    replys = [re.sub('[|]|\n|\u3000|\ufeff|\u200d', ' ', x).strip()
              for x in replys]  # Delete unnecessary character codes
    return replys


def main():
    # Define
    TOKEN = <ACCESS TOKEN>
    SLACK_URL_CHANNEL = 'https://slack.com/api/conversations.list'
    SLACK_URL_HISTORY = 'https://slack.com/api/conversations.history'
    SLACK_URL_REPLY = 'https://slack.com/api/conversations.replies'


    # Get channel name and id
    all_channels = get_channel(TOKEN, SLACK_URL_CHANNEL)

    for i in range(len(all_channels['id'])):
        print(all_channels['id'][i], all_channels['name'][i])
        all_posts = []
        post_dates = []
        
        # Get timestamp id
        all_timestamp_ids = get_timestamp_id(
            all_channels['id'][i], TOKEN, SLACK_URL_HISTORY)

        # Get post and reply
        for timestamp_id in all_timestamp_ids:
            posts = get_post(all_channels['id'][i], TOKEN,
                             SLACK_URL_REPLY, timestamp_id)
            all_posts.append(posts)
            post_dates.append(datetime.datetime.fromtimestamp(
                float(timestamp_id)).strftime('%Y%m%d_%H%M%S'))

        # Save
        df = pd.DataFrame({"Date": post_dates, "Post comment": all_posts}).replace(
            {'[': '', ']': '', '\n': ' ', '\u3000': ' ', '\ufeff': ' ', '\u200d': ' '})

        df.to_csv("{}_{}_slack_postcomment.csv".format(
            datetime.datetime.now().strftime('%Y%m%d_%H%M%S'), all_channels['name'][i]), index=False)


if __name__ == '__main__':
    main()

結果

出力結果は、次のようにまとめられる。

Date Post comment
20210201_153746 ['コンニチハ']
20210201_153739 ['こんにちは']
20210201_153306 ['こんにちは']
20210122_110645 ['<@U01L782L7HN> has joined the channel']


頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓

動かしながら学ぶ PyTorchプログラミング入門

動かしながら学ぶ PyTorchプログラミング入門

  • 作者:斎藤勇哉
  • 発売日: 2020/11/30
  • メディア: Kindle版