PythonによるSlack bot作成

SlackでYoutubeの動画idをコメントしたら勝手にプレイリストに追加してくれるbotを作りたかった。

そうすればみんなで共有のプレイリストをカスタマイズしていけて楽しいかなと思ったのですが、Youtube Data APIの認証を勘違いして頓挫しました。

 

Slack bot側も同時進行で作ってたのでせっかくなのでまとめます。

 

Slack bot

やりたいことを確認すると、

  1. SlackでYoutubeの動画のidをコメント
  2. botがプレイリストに追加(できない!)
  3. みんなで好きにプレイリストに追加できる!(できない!)

です。

 

できない!

でもbotの部分は動くのでまとめました。

 

Slack appを作成する

以下のページを大いに参考にしました。

 

まずはSlack APIにアクセスしてbotの体となるアプリを作成します。

Create an Appをクリックして、アプリの名前と導入するWorkspaceを選択します。

Workspaceから退出すると、このアプリを管理できなくなるので注意してください。

 

Bot Usersの欄を選択してbot機能を追加します。

 

Install Appからワークスペースにこのアプリを追加します。

 

確認画面が出るのでワークスペースが合っているか確認しましょう。

 

Authorizeを押したらOAuth Tokenが表示されます。

 

後で使うので2つ目の「Bot User OAuth Access Token」をメモしておきましょう。

これがbotを起動させる上で必要になります。

 

これでひとまずWorkspaceにアプリをインストールすることができました。

しかしこの時点ではbot機能が起動していません。

 

チャンネルに招待したりメンションを送ることはできますが、退出状態になっています。

 

botを機能させるためには、後述のbotの反応を定義したプログラムを実行する必要があります。

 

bot機能を作成する

こちらを参考にしました。

 

先ほど作成したアプリが体としたら今から作成するプログラムがbotの脳になります。

先述のOAuth Tokenを使ってReal Time Messaging APIを利用することで会話が可能になります。

 

イメージとしては、

  1. botの機能を記述したプログラムを実行
  2. OAuth Tokenで認証
  3. プログラムがSlackのイベントをリアルタイムで取得
  4. 定義されたイベント(メンションなど)を検知
  5. 定義に従って返答する

こんな感じです。

 

まずはプロジェクトを作って、Slackからbotと会話することを目指します。

 

slackbotライブラリをインストールします。


pip install slackbot

 

以下のリポジトリが簡単に使えそうだったのでこちらをクローンします。


git clone https://github.com/lins05/slackbot.git

pip install slackbot

 

ルートディレクトリにslackbot_settings.pyファイルを作成します。

ここに様々な設定を記述していきます。

 

ひとまず変数APIトークンとデフォルトの返信を設定しましょう。

APIトークンは先ほどメモしたBot User OAuth Access Tokenを使います。


API_TOKEN = YOUR_API_TOKEN

DEFAULT_REPLY = "Sorry but I didn't understand you"

 

これだけ!

実行するとプログラムがSlackのイベントをリアルタイムに取得します。


python run.py

 

Slack側で確認するとログイン状態になりました!

 

試しにメッセージを送ってみると設定した通りのメッセージが返ってきました。

 

Slack bot経由でYoutube Playlistに追加する(できない!)

ではここまでセパレートに確認していたYoutube Playlistの操作とSlack botを連携させます。

イメージとしては、

  1. Slackでbotに追加してほしいvideoのIDを送信する
  2. botがIDを取得
  3. Youtube APIを叩いてPlaylistに動画を追加する

とりあえず以上。

 

ということで、Slack botにコマンドを設定します。

詳しいルールは以下に書いてあります。

 

run.pyに以下を追記します。

 

respond_toデコレータをつけることでダイレクトメッセージ、もしくは@をつけたメンションに反応します。

下の画像はbotを招待したチャンネル。メンションのみに反応しています。

 

listen_toデコレータを使えばbotが所属するチャンネルの発言に対して反応させることができます(メンションでなくても)。

 

今回のvideo idのようにbotにパラメータを渡したいときは正規表現を用います。

 

で、肝心のプレイリストへの追加処理をやっている途中で、Youtube Data APIでリストを追加するにはOAuth認証が必要でAPIキーではできないことがわかりました。

 

そんなわけで終了。

 

まとめ

残念ながらYoutube Data APIとの連携で失敗したのでここまでになります。

以前にもSlackのbot機能を触ったことがあったのですが大分変わっていて結構迷いました。Slack Appの思想とか垣間見えたので勉強になりました。

botの部分はうまく使えそうなので、別のサービスと連携するアイディアが思いついたら実装してみます。

 

参考

コメントを残す