前の記事では、タスクを分解し、まず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を使っていきます。