5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SlackAdvent Calendar 2021

Day 11

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

Last updated at Posted at 2021-12-10

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

はじめに

Slackを楽しんでいますか:bangbang::bangbang::bangbang:
Bolt 入門ガイド(Bolt for Python)」わかりやすい! です。
ここの通りにやることで例の完全理解1に容易に到達できます。

SDKは他にBolt for JavaScriptBolt for Javaとありまして、私はなんとな〜くBolt for Pythonに飛びつきました。

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

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

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

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

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

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

ソースコード

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

Slash Commands

/thread-reaction

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

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

ソースコード

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

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

Bolt for Pythonを使って、簡単に素早くSlackアプリを作ってイゴかしていくことで、Slackを便利にもっともっと楽しめます。
Bolt 入門ガイド(Bolt for Python)」がわかりやすいです。
まだの方、はじめてみようという方は、まずはこのガイドから取り組まれることをオススメします。

Enjoy Slack :bangbang::bangbang::bangbang:
⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡⚡

元気ですか! 元気があれば何でもできる!


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

  1. https://twitter.com/ito_yusaku/status/1042604780718157824

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

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?