Pythonを使った、Slackからのメッセージ取得1/3

前の記事では、タスクを分解し、まずSlackからメッセージを取得する必要があることが分かりました。

この記事からは、Slackからメッセージを取得するのを目指します。

能力の獲得

能力1: Slackからメッセージを取得する

Q. Slackのメッセージを取得するにはどうすればいい? A. conversations.historyを使おう

Slackの特定のチャンネルのメッセージをプログラムで取得する方法を調べるため、「slack メッセージ 取得」で検索し、Slack のメッセージ履歴を取得する | DevelopersIOを見つけます。内容を読むと、Slackからメッセージを取得する「channels.history」が使えなくなった代わりに「conversations.history」が使えるらしいです。そしてスレッド内のメッセージは「conversations.replies」を使えば良さそうです。

「conversations.history」を検索すると、公式文書のようなものが出てきました(英語はキツいですが、高速道路ではなく散歩なのでゆっくり読み進めます)。

Q. conversations.historyはどう使う? A. scopeを… (Q. scopeって何?)

conversations.history method | Slack

To use the method, you'll need at least one of the channels:, groups:, im: or mpim: scopes corresponding to the conversation type you're working with.

scopeという未知の単語が出てきました。調べてみましょう。

Q. scopeってなに? A. チャンネル内のメッセージなどを見る権限

scopeにはchannels・groups・im・mpimがあり、このうちのいくつかが必要とのこと。何も考えずに全部渡してしまえば動きそうだけど、散歩なのでゆったり調べます。scopeを「slack scopes」と検索すると、公式文書が出てきます。

channels:historyには「View messages and other content in public channels that your slack app has been added to」、つまり「slack appが追加されたパブリックチャンネルのメッセージなどを見れる」と書かれています(似たような名前にchannels:readがありますが、これはチャンネルについての情報が見れるだけらしく、紛らわしいですね)。

groups:historyには「View messages and other content in private channels that your slack app has been added to」、つまり「slack appが追加されたプライベートチャンネルのメッセージなどを見れる」と書かれています。

チャンネルには種類があることが分かりました。パブリックチャンネルとプライベートチャンネルについて「パブリックチャンネル Slack」と検索し チャンネルとは?を見つけます。

パブリックチャンネルとは、ワークスペースの誰でも参加できるチャンネルで、プライベートチャンネルは招待制のようです。パブリックチャンネルがチャンネル一覧で#で始まるチャンネルで、プライベートチャンネルは錠(鍵)マークで始まるチャンネルでした。特にプライベートチャンネルのメッセージを取得して万が一漏洩させたら問題になりそうなので、今回は自分のパブリックチャンネルを使いました。

パブリックチャンネルとプライベートチャンネルのマーク

im:historyには、「View messages and other content in direct messages that your slack app has been added to」、つまり「slack appが追加されたダイレクトメッセージのメッセージなどを見れる」と書かれています。dm:historyじゃないんかい!と思いながらも理解します。

mpim:historyには、「View messages and other content in group direct messages that your slack app has been added to」、つまり「slack appが追加されたグループダイレクトメッセージのメッセージなどを見れる」と書かれています。mpって何だろうと「mpim slack」で調べると mpim type | Slackには「multiparty IM」と書いてありました。

今回はパブリックチャンネルで行うので、channels:のscopeを与えるとよさそうです(まだ理解しただけで、与えていません)。

Q. conversations.historyはどう使う? scopeを持ったtokenを使って、HTTPでGETする

Noticesが読めるようになったので、続いてFactsを読みます。HTTPの部分にGET https://slack.com/api/conversations.historyと書かれています。PythonからHTTPのGETをする方法を知るため、「http get python」を検索します。Pythonにしたのは Slack のメッセージ履歴を取得する | DevelopersIOでPythonを使っていたからです(もちろん、著者が慣れているという理由もあります)。

HTTPのPOST/GETリクエストをする を読むと、Pythonで

import requests
response = requests.get('http://www.example.com')  # 'http://www.example.com'は例

とすればいいらしく、Slack のメッセージ履歴を取得する | DevelopersIOにも同様の記述が見られます。ここでチャンネルのメッセージを取得しているようです(予想通りではありますが、あやふやな理解が100個有るといつかその100個を確かめることになるので、調べられるところは調べておくと吉)。

conversations.history method | Slackに戻り、読み進めると、Required Scopeにはさっき見たchannels:historyなど4つのscopesが書かれています。

Content typesは…「Content types Slack」と検索したけど分かりませんでした。次に「application/x-www-form-urlencoded」と検索してContent-typeについて少し勉強してみよう:application/jsonとapplication/x-www-form-urlencodedの違い を見つけ、エンコードされたURLでデータが送受信されるらしいことがわかります。今回は細かいURLエンコードについて解説しませんが、「エンコードされたURLでデータが送受信される」と頭の片隅に置きます。

Factsの最後にはRate limits Tier 3と書かれています。そのまま「Rate limits Tier 3」と検索し、Rate Limits | Slackを見つけます。「Tier 3 methods allow a larger number of requests and are typically attached to methods with paginating collections of conversations or users. Sporadic bursts are welcome.」「50+ per minute」と書かれています。SlackのAPIの観点では、余裕で毎分実行して良さそうです(処理が追い付かないとか、処理にお金がかかるとか他の制約はあるかも知れない)。

Slack のメッセージ履歴を取得する | DevelopersIOのコード(以下)を見ると、

import requests

url = "https://slack.com/api/conversations.history" 
token = "XXX"

header={
    "Authorization": "Bearer {}".format(token)
}

payload  = {
    "channel" : "C022M6U7G4F"
}

res = requests.get(url, headers=header, params=payload)

print(res.json())

となっています。channelとtokenはわからないけど、概形ができたので次の記事からchannelとtokenを解決します。

この記事では、取得のために必要な権限であるscopeの存在が判明しました。次の記事ではscopeを使っていきます。

© 2019- estie, inc.