私が最近チョコチョコっとつくったSlackアプリのソースコードを全文掲載 （2021/12/11）

https://qiita.com/advent-calendar/2021/slack

2021/12/11(土)の回です。

# はじめに

[Slack](https://slack.com/)を楽しんでいますか:bangbang::bangbang::bangbang:
「[Bolt 入門ガイド（Bolt for Python）](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started)」わかりやすい！　です。
ここの通りにやることで例の**完全理解**[^1]に容易に到達できます。

SDKは他に[Bolt for JavaScript](https://github.com/SlackAPI/bolt-js)、[Bolt for Java](https://github.com/slackapi/java-slack-sdk)とありまして、私はなんとな〜く[Bolt for Python](https://github.com/SlackAPI/bolt-python)に飛びつきました。

[^1]: https://twitter.com/ito_yusaku/status/1042604780718157824

完全理解したあとに私が作ってイゴかしてみた[^2]もののソースコードを全文掲載します。

## 前提と言う名の言い訳とみなさまへのお願い

ひとつ言い訳をしておきます。
私は[Python](https://www.python.org/)で対価をいただいたことはなく、なんとなく雰囲気で書いています。
ソースコードの改善点などありましたら、ぜひ教えてください。
「優しく教えてください」なんていいません。
罵詈雑言、なんでも:ok:です。
教えてくださる方のエネルギーとお時間を頂戴するわけですし、私としては、信用に足りうる記事を公開しておくことを第一義としたいとおもっています。
教えてくださることは本当にありがたいことです。
コメント等をいただけましたら記事を改善アップデートいたします。

忌憚のないご批正を賜り得ば大幸の至りでございます。



[^2]: 「動かしてみた」の意。おそらく西日本の方言、たぶん。NervesJPではおなじみ。少し古いオートレースの映像ですが、実況アナウンサーが「針[^3]イゴきます」とはっきり言っています。https://autorace.jp/netstadium/SearchMovie/Movie/iizuka?date=2017-01-04&p=5&race_number=11&pg=

[^3]: 大時計の針のこと。針がイゴいてある地点まで到達すると選手はスタートを切って良い発走の合図。針がイゴきはじめると(おそらく)選手は緊張するし、スタートはその後のレース展開に大きく影響するので、車券を握りしめている観客たちがもっとも緊張する瞬間であるため、先の尖った鋭いものを連想させる針は緊張の暗喩としても言い得て妙。

# ① あるメッセージ配下のスレッドに `:ok:` 等の良リアクションをつける

- [スラッシュコマンド](https://slack.dev/bolt-python/ja-jp/concepts#commands)をトリガにしています
    - 例: `/thread-reaction https://hogehoge.slack.com/archives/CKXQHOGEHOGE/p1637107216110100`
- この[スラッシュコマンド](https://slack.dev/bolt-python/ja-jp/concepts#commands)を作る前までは、あるスレッド配下の書き込みに対してみたよ的な意味で :ok: や :+1: を手動で**平日毎日10個**くらいつけることを**3年間**くらい続けて参りました
- 特に議論が巻き起こる可能性があるスレッドではなく日々の予定を書き込んでみんなに共有する目的のスレッドです
- ちゃんと全部に目を通して、そのうえでリアクションボタンだけスラッシュコマンドで済ますことにしています
- せっかく投稿をしたのなら、なんらかの反応が欲しいものではないでしょうか[^3]
- 投稿に対して誰が絵文字リアクションを付けたのかは気にせず、とにかく一個でも絵文字リアクションがついていたらアプリでは追加しないという簡単な仕様にしています
    - スラッシュコマンドを発動したあとに、遅れて書き込みする人がいて、そうしたときにこの判定を入れなずにコマンドを実行すると複数個の絵文字がついちゃうメッセージができてしまいますのでそれを避ける意図です

[^3]: 私だけの感じ方かもしれません。「あしたのジョー」で主人公の矢吹丈が乾物屋のノリちゃんにそんなことを言うシーンがありまして、私は多用しています。

## ソースコード

```python:app.py
import os
import random
from functools import reduce
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

# ボットトークンとソケットモードハンドラーを使ってアプリを初期化します
app = App(token=os.environ.get("SLACK_BOT_TOKEN"))

@app.command("/thread-reaction")
def handle_some_command(ack, body, logger, client):
    ack()
    logger.info(body)
    text = body['text']
    parent_ts = text.split('/')[-1][1:][:10] + '.' + text.split('/')[-1][1:][10:]
    channel_id = body['channel_id']

    replies = app.client.conversations_replies(
        channel=channel_id,
        ts=parent_ts,
        limit=1000
    )

    icons = ['thumbsup', 'tada', 'rocket', 'ok']

    messages = replies['messages']
    list_of_ts = list(reduce(lambda acc, m: acc if 'reactions' in m else acc + [m['ts']], messages, []))
    for ts in list_of_ts:
        if ts == parent_ts:
            continue

        try:
            client.reactions_add(
                channel=channel_id,
                name=random.choice(icons),
                timestamp=ts)
        except:
            pass

# アプリを起動します
if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()
``` 

## Slackアプリの設定

他にも設定したところがあるかもしれません。
はっきり覚えているところだけ書いておきます。

### OAuth & Permissions

![スクリーンショット 2021-11-23 12.36.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/e4ac0424-48c5-802c-eca1-16f47f24461a.png)

### Slash Commands

`/thread-reaction`

# ② とにかくメッセージが書き込みがあったら良リアクションをつける

- **[元気ですか！  元気があれば何でもできる！](https://www.youtube.com/watch?v=aYby247E9j4)**
- 元気、勢いをつけます
- ウザいと感じる人はいるとおもいます
- 元気がないチャンネル、これから勢い:rocket::rocket::rocket:をつけないといけないチャンネルの賑やかし:tada:です
- いや、マヂ元気がなかったのです、チャンネルに
- 締め切りに追われていて、チャンネルに勢いが必要だと感じたわけです（勝手に）
- それで朝、出勤前に突貫でつくって、さくらインターネットさんの[Hacobune](https://www.sakura.ad.jp/information/announcements/2021/08/12/1968207782/)にデプロイしてイゴかすところまでを15分くらいで仕上げました
    - もちろん、[Bolt 入門ガイド（Bolt for Python）](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started)は何周もやったし、[Hacobune](https://www.sakura.ad.jp/information/announcements/2021/08/12/1968207782/)へのデプロイと[Docker](https://www.docker.com/)の知識はそれなりにはありまして、その瞬間における15分の前に費やした時間はけっこうな長さ ーー 私の人生があります
    - 15分は単なるひとつの点にすぎません
    - 本当に15分という時間だけですべてをやってのける人はいるとおもいます
    - それを私ができないだけのことです
    - 15分の前に膨大な時間が私には必要ですが、本当に全部15分だけでドキュメントを読み込んでやりきってしまう人種がいるのだとおもいます
    - その才能・センスの差が、現実世界では資本主義のいまの日本では収入の差になって現れているのだとおもいます
- 世間の有り様の一端を詳らかにしたことは一旦置いておいて話を戻します
- **[元気ですか！  元気があれば何でもできる！](https://www.youtube.com/watch?v=aYby247E9j4)**

## ソースコード

```python:app.py
import os
import random
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

# ボットトークンとソケットモードハンドラーを使ってアプリを初期化します
app = App(token=os.environ.get("SLACK_BOT_TOKEN"))

@app.event("message")
def handle_message_events(body, logger, client):
    logger.info(body)
    ts = body['event']['ts']
    channel = body['event']['channel']
    icons = ['thumbsup', 'tada', 'rocket']

    client.reactions_add(
        channel=channel,
        name=random.choice(icons),
        timestamp=ts)


# アプリを起動します
if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()
```

## Slackアプリの設定

他にも設定が必要なところがあるかもしれません。
はっきり覚えているところだけ書いておきます。

![スクリーンショット 2021-11-23 12.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/be274c2f-1506-2550-c96b-9be334fcc682.png)



# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

[Bolt for Python](https://github.com/SlackAPI/bolt-python)を使って、簡単に素早く[Slack](https://slack.com/)アプリを作ってイゴかしていくことで、[Slack](https://slack.com/)を便利にもっともっと楽しめます。
「[Bolt 入門ガイド（Bolt for Python）](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started)」がわかりやすいです。
まだの方、はじめてみようという方は、まずはこの[ガイド](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started)から取り組まれることをオススメします。


Enjoy [Slack](https://slack.com/) :bangbang::bangbang::bangbang:
⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡


**[元気ですか！  元気があれば何でもできる！](https://www.youtube.com/watch?v=aYby247E9j4)**

---

明日は、@MintoAoyama さんの[「Slackの投稿、たくさんあって見逃してしまう…」を防げるかもしれない "ピックアップチャンネル" "ストックスレッド" （と読んでるハック）](https://qiita.com/advent-calendar/2021/slack)」です。
楽しみです!!!
これぜひ欲しいものかも!!!