Botを使ってSlackで簡単#NowPlaying

この記事は、[富士通クラウドテクノロジーズ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/fjct)の17日目の記事です。
昨日は[@heriet](https://qiita.com/heriet)さんの「[PowerPoint(pptx)をtextlintする](https://qiita.com/heriet/items/e0685fb0e9eed0101a3e)」でした。

技術職ではなく企画職というやつなので、PowerPointを作る機会がかなり多くあります。
その分表記ゆれを指摘される機会もかなり多くあるので、興味あります！

## はじめに

さてさて、佐々木と申します。
普段は、[ニフクラ mobile backend](https://mbaas.nifcloud.com/)の企画を担当しています。

皆さんは、お仕事中に音楽を聴きますか？
聴くという人聴かないという人、職場環境や電話対応が多いなどの理由から実質聴けない人もいらっしゃると思います。
弊社はエンジニアが中心の会社ということもあり、各々ヘッドホンやイヤホンをつけながら仕事をしている方も多く、おそらく世間一般よりは音楽を聴きながら仕事をしている人が多い職場だと思います。
今日はそんな、仕事中の音楽にまつわるお話です。

## #NowPlaying

Twitter上でよく使われている#NowPlayingというハッシュタグをご存知でしょうか？
これは、「今わたしはこの曲を聴いています」という意味のハッシュタグで、音楽好きたちがよく使っていて、僕も時々使います。
また、ボタン一つで曲名／アーティストをツイートしてくれるような、#NowPlaying投稿をサポートしてくれるアプリもいくつかあり、非常に気軽にツイートすることができます。

弊社のSlack上には、まさにこの#NowPlayingを投稿するためだけのチャンネルがあり、社内の音楽好きたちが集まって日々仕事中に聞いている曲を投稿しあっています。
(自分がとても好きな曲を誰かが聴いている、という状況に遭遇した人は、emojiのリアクションで静かにはしゃぎます)

しかし、Twitterのように投稿をサポートしてくれるアプリがあるわけでもなく、手打ちで曲名／アーティスト名をタイプしています。
(特に、僕が好きなTHEE MICHELLE GUN ELEPHANTというバンドなんかは本当に長いのでぐぬぬ……となります)

そこで、この作業を自動化してくれるようなBotを作ろうと思いました。

## Botのフローと構成

僕はSpotifyを使って音楽を聞いているので、以下のような流れのBotを作ろうと思いました。

`Botにリプライを飛ばす→Spotifyが流している曲をAPI経由で取得してくる→取得結果から曲名とアーティスト名をPost`

BotはPythonで動いていて、以下のパッケージを使用しています。

- slackbot
    - その名の通りSlack BotをPythonから動かす際に便利
- spotipy
    - SpotifyのAPIをPythonから楽に動かせるようにしてくれる

ちなみに、エンジニアではない僕はこの構成に至るまで、APIリファレンスを見て全部JavaScript(しかもフロントエンド)で実装しようとするなど、無茶なことを沢山試みたのですが、つよつよエンジニアの先輩に助けられ、この構成を教えていただきました。
感謝！

## 作り方

では、作り方を解説していきます。
なお、SlackのBotsインテグレーションについては事前に設定いただき、APIトークンを控えた状態にしておいてください。
※僕はPython3.7.2で試しました。

### Spotify側の設定

まずは、以下手順でSpotify側でクライアントIDとクライアントシークレットを払い出します。

1. [ここ](https://developer.spotify.com/dashboard/login)にアクセスいただき、「LOG IN」からSpotiyアカウントでログイン
2. 「CREATE AN APP」をクリック
3. 3つほど設問が出てきますが、上からそれぞれ「アプリ／ハードウェア名」「概要」「作成物の種別」を入力もしくは選択し、「Next」をクリック
4. 商用利用ですか？のような問が出てきますので、「No」をクリック
5. 諸々同意&チェックいただき、「SUBMIT」をクリック
6. 作成が完了するので、「SHOW CLIENT SECRET」をクリックし、出てきたクライアントシークレットと、その上にあるクライアントIDを控える ※このキーは漏洩しないよう注意
7. 右上の「EDIT SETTINGS」をクリック
8. Redirect URIsに「http\://localhost:8888/callback」と入力し、「ADD」をクリックした後、「SAVE」をクリック 

### サーバの開発

#### パッケージ導入

まず、slackbotを導入します。

```terminal
$ pip3 install slackbot
```

次に、spotipyを導入します。

```terminal
$  pip install spotipy
```

#### ディレクトリの整理／ファイルの作成

どこかにプロジェクトフォルダを作成いただき、その中で作業をします。
以下のような階層になるようにディレクトリ／ファイルを作成してください。

```
プロジェクトフォルダ
  ├ plugins/
  │    ├ __init__.py
  │    └ my_mention.py
  ├ run.py
  └ slackbot_settings.py
```

#### run.pyの編集

run.pyを開いていただき、実行用スクリプトを書いていきます。
Botを起動する際は、このスクリプトを実行します。

```python:run.py
# coding: utf-8

from slackbot.bot import Bot

def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    print('slackbotが起動しました')
    main()
```

#### slackbot_settings.pyの編集

続いて、設定ファイルの編集を行います。
「SlackのBotsインテグレーションのAPIトークン」の部分は、Slack側で作成したBotのAPIトークンに置き換えてください。

```python:slackbot_settings.py
# coding: utf-8

API_TOKEN = "SlackのBotsインテグレーションのAPIトークン"

DEFAULT_REPLY = "想定されていないコマンドです。"

PLUGINS = ['plugins']
```

#### my_mention.py

では、いよいよ返答を作っていきます。
Spotifyのユーザー名／クライアントID／クライアントシークレット／SlackのユーザーIDを置き換えてください。
なお、Spotifyのユーザー名は[ここ](https://www.spotify.com/jp/account/overview/)にアクセスすれば知ることができます。
SlackのユーザーIDは[ここ](http://help.receptionist.jp/?p=1100#memberid)に確認方法が載っています。

```python:my_mention.py
import spotipy
import spotipy.util as util
from slackbot.bot import respond_to

@respond_to('NP')
@respond_to('np')
def mention_func(message):
    scope = 'user-read-currently-playing'

    token = util.prompt_for_user_token(username="Spotifyのユーザー名", scope, client_id="クライアントID", client_secret="クライアントシークレット", redirect_uri="http://localhost:8888/callback")

    spotify = spotipy.Spotify(auth=token)
    current_track = spotify.current_user_playing_track()

    if message.body['user'] == 'SlackのユーザーID':
        if type(current_track) == dict:
            message.send(current_track['item']['name'] + ' - ' + current_track['item']['artists'][0]['name'])
        else:
            message.send('何も再生してないよ')
    else:
        message.send('きみ誰？')
```

## 実行！

これで完成です。
実行しましょう。

```terminal
$ python run.py
```

あとは、任意のチャンネルにinviteして `@botの名前 np` とメンションすると、初回は、ブラウザが立ち上がって認証を求められます。認証すると、真っ白な画面に遷移するので、遷移先のURLをコピーしてターミナルに貼り付けてください。
※2回目以降、認証は不要です

![slack.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280892/88faf895-cc17-c1a7-e0ef-3c8eb2a0a89b.jpeg)

ちなみに、他の人がメンションを飛ばしても「君は誰？」と返信されます。

## おわりに

というわけで、これを使うと簡単にSpotifyで聴いている曲をSlackに投稿することができるようになりました。

ただ、今はBotを実行しているサーバーで認証が必要なのと、複数人の認証情報を保存できるようにできていないので、僕専用になっています。
色んな人が使えるようにしたいと思っているので、引き続き改修していければと思っています！

明日は、[@aokuma](https://qiita.com/aokuma)さんで、「ニフクラでもいい感じに Kubernetes を使いたい！」です。
楽しみです！

ではでは、よいクリスマスを。