初心者がPythonでSlackbotを作ってみた！3 〜Slackbot機能編〜

:::note warn
この記事はプログラミングを始めて5ヶ月の初心者が書いています。間違い等あるかもしれません:bow_tone1:
:::
#目的
Slackで動くBotを作成する:robot::zap:
前回の記事は[こちら](https://qiita.com/hayahaya2/items/d952455ff5fb20808262)。
前々回の記事は[こちら](https://qiita.com/hayahaya2/items/0787225d9fa66dbcdf4f)
#対象読者
とりあえずSlackで動くBotを作ってみたい人！

#完成イメージ
さて、ようやくですがBotに機能を実装させていきましょう！
今回作るBotは次のものです:fireworks:
![bot_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912865/2ab40a38-0fe2-206e-b3f3-559cac563ff6.png)

###機能①
「こんにちは！」とメッセージを送ると、メンションをつけて「こんにちは！」と返信してくれる機能。
###機能②
「今何時？」と聞くと、現在の時間を教えてくれる機能。

#準備
1. 左サイドメニューバーの「Event Subscriptions」の「Enable Events」をONにする。
1. 「Subscribe to bot events」の「Add Bot User Event」をクリックする。
![slack2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912865/2446273f-6db4-f1f9-076b-5ffb7d6cea03.png)
1. 「message.channels」を選択する。
![slack2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912865/e22bd9c4-c368-1934-d656-85a74a7d5378.png)
1. 左サイドメニューバーの「Install App」の「Reinstall to Workspace」をクリックし、再インストールを行う。
![slack2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912865/b1fd1d6b-52fd-ee51-d89e-ae29d29e0367.png)

#機能①の実装

####0. 全体のコード

![message_hello.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912865/f5440ed2-cd81-769f-e2cf-9b5e70553400.png)

```python:app.py
#こんにちは！と送るとメンションしてこんにちはと返してくれる機能
@app.message('こんにちは！')
def message_hello(message, say):
    say(f'<@{message["user"]}> さん、こんにちは！')
```

####1. Botを呼び出すためのキーワードを設定する

**POINT キーワードの設定**
`@app.message('Botを呼び出すためのキーワード')`


今回は「こんにちは！」という言葉に反応させたいので、

```python:app.py
@app.message('こんにちは！')
```

####2. Botの機能を関数で定義する

**POINT 機能の定義**

```
def 好きな関数名(message, say):
    Botの機能
```
**・message** … Botを呼び出すためのキーワードを送信したメッセージの情報。
**・say** … Botの返信を定義する関数。sayのカッコの中身に返信メッセージを入れる。


#####補足：「message」をprintするとこんな感じ。

:::note info
{'client_msg_id': '********-****-****-****-************', 'type': 'message', 'text': 'こんにちは！', 'user': 'U**********', 'ts': '********** . ******', 'team': 'T**********', 'blocks': [{'type': 'rich_text', 'block_id': 'dm3', 'elements': [{'type': 'rich_text_section', 'elements': [{'type': 'text', 'text': 'こんにちは！'}]}]}], 'channel': 'C**********', 'event_ts': '********** . ******', 'channel_type': 'channel'}
:::
辞書と同じように扱えて、例えば、`message['text']`と[ ]でkeyを指定すると、`こんにちは！`というvalueを取り出すことができる。


今回の場合は、メンション + こんにちは と返信して欲しいので、

```python:app.py
def message_hello(message, say):
    say(f'<@{message['user']}>さん、こんにちは！')
```


`メンションのコードの書き方：　＜@ユーザーID＞`
※ユーザーIDとは、Uからはじまる数字と大文字アルファベットの11文字の羅列のことで、message['user']に存在している。



###3. アプリ（Bot）を実行する
あっという間に完成！！おめでとうございます:hugging:
さっそく、ちゃんと動くか確かめてみましょう！
ターミナルで以下のコマンドを実行し、Slackで、「こんにちは！」とメッセージを送信してみてください :raised_hands_tone1:

```
$ python3 app.py
```

#####注意： アプリ（Bot）をメッセージを送るチャンネルに招待しておく必要があります。

問題がなければ次に進みましょう！

#機能②の実装
今度はもう少し実用的（？）な機能を実装していきましょう！

###0. 全体のコード
![clock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912865/980253a7-2c38-48a4-197b-93945e800ff3.png)

```python:app.py
@app.message('今何時？')
def clock(message, say):
    time_now = datetime.datetime.now().strftime('%H時%M分%S秒')
    say('現在' + time_now + 'です。')
```
###1. 時間を読み取るためのライブラリをimportする

```python:app.py
import datetime
```

###2. 現在の時間を読み取る

```python:app.py
time_now = datetime.datetime.now().strftime('%H時%M分%S秒')
```

`datetime.datetime.now()`までのところで、現在の時間を読み取り、`strftime()`でその表示方法を指定（詳しいことは省略）。

###3. Botの機能として実装する

```python:app.py
@app.message('今何時？')
def clock(message, say):
    time_now = datetime.datetime.now().strftime('%H時%M分%S秒')
    say('現在' + time_now + 'です。')
```

###4. アプリ（Bot）を実行する

```
$ python3 app.py
```

きちんと実行できれば、Botがメッセージを送信した時刻を教えてくれるはずです！
コードを少しいじって、`strftime()`の中身を `%Y/%m/%d`に変えるだけで、時間ではなく、年 / 月 / 日を表示してくれるようになります。この場合は、キーワードを「今って何年何月何日？」に変えても良さそうです。


#最後に
このようにslack_boltを使うと、簡単にBotを作成することができます。Botの機能を定義するところで、スプレッドシーを操作できるようにしたりするともっとBotの可能性が広がりそうです。アイデア次第でさまざまなBotを制作できると思うので、Bot制作を楽しんでみてください:thumbsup_tone1:

#参考
https://slack.dev/bolt-python/ja-jp/tutorial/getting-started

#関連

https://qiita.com/hayahaya2/items/0787225d9fa66dbcdf4f

https://qiita.com/hayahaya2/items/d952455ff5fb20808262