【Laravel】Slack通知をスレッド形式で行う方法


## 概要

みなさん！
アプリケーションからSlackに通知する仕組みを作ったものの、通知量が多くお目当ての通知を探せない！！なんてことありませんか？

この記事を読むと、Slack通知をスレッド形式で行うことで通知わかりやすくする方法がわかるはずです！


## Laravel既存の通知機能

Laravelにはとても便利な[Slackへの通知機能](https://readouble.com/laravel/10.x/ja/notifications.html)があるんですよね。

[Slack Webhookの発行](https://documents.trocco.io/docs/how-to-generate-slack-webhook-url)を行い、ドキュメントに従って実装するとSlackへ通知すること機能が簡単にできてしまいます！

ただ通知量が増えてくるとスレッドを使いたくなるのですよね...。


## そうだSlackAPIを使おう

[chat.postMessage](https://api.slack.com/methods/chat.postMessage)のthread_tsを設定することでどうやら特定のメッセージにリプライが送れるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/3828d903-4c82-5631-d90d-71f17747bcc6.png)


## LaravelからSlackAPIを呼ぶためのライブラリ

今回はこちらのライブラリを使います！
https://github.com/jolicode/slack-php-api

README見て使いやすそうと思ったのが決め手！

> Slack Web APIのすべてのエンドポイント、リクエスト、レスポンスに対する完全なオブジェクト指向インターフェイスを提供します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/98260f7f-9406-55f9-6cbc-ff837f8f721d.png)


## いざ、実装

[Get Started](https://jolicode.github.io/slack-php-api/#/1-get-started)通りにcomposerを設定

```
composer require symfony/http-client nyholm/psr7
composer require jolicode/slack-php-api
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/31a04a20-d112-1d5e-d1d3-b6b685108260.png)



[Slack ボットの作成](https://qiita.com/odm_knpr0122/items/04c342ec8d9fe85e0fe9)を作成してBotUserOAuthTokenを入手



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/b3ad8f10-0f94-4cd1-d703-028eda39b785.png)

Laravel環境で下記コードを動かしてみると！？

```php
$yourSlackToken = "[BotUserOAuthToken]";
$client = ClientFactory::create($yourSlackToken);
$client->chatPostMessage([
    'text' => '全部通知しちゃうゾ！',
    'channel' => '#bot-practice'
]);
```


指定のチャンネルに通知が！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/0ebfcb82-cc98-3bc9-0fce-bcf572780bbd.png)


## スレッド形式で通知

```php

$client = ClientFactory::create($yourSlackToken);
$response = $client->chatPostMessage([
    'text' => '全部通知しちゃうゾ！',
    'channel' => '#bot-practice'
]);

dump($response);

```

Slack通知した後のレスポンスを除くと...
tsという返却値が！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/ab099a08-4ee2-0aba-1828-05a6f5ac0af3.png)


このtsの値をthread_tsとして渡してあげると無事スレッド形式で通知できます！

```php
$client = ClientFactory::create($yourSlackToken);
$response = $client->chatPostMessage([
    'text' => '全部スレッド通知しちゃうゾ！',
    'channel' => '#bot-practice',
    'thread_ts' => '1689573862.454549'
]);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/212d4d55-73f3-b8f7-04b8-c17160215a49.png)


## まとめ

通知BOT多すぎて欲しい通知が見つけられないという方はスレッド化を検討してみてはいかがでしょうか？



## 備考

BOT名の変更はSlackApp管理画面からできます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/29baa27b-dae2-98d0-3571-0264d8736c90.png)


リッチな感じにもできます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/8193092e-0d64-882c-4b72-b08ded2520fd.png)

動かしてみたコード

```php
        $attachments = [];
        $attachments[] = [
            'fallback' => 'fallback',
            'color' => '#36a64f',
            'pretext' => '*お肉を食べましょう！*',
            'title' => 'どこで食べますか？',
            'title_link' => '#',
            'fields' => [
                [
                    'title' => '北海道',
                    'value' => 'ジンギスカンが美味しい',
                    'short' => true,
                ],
                [
                    'title' => '沖縄',
                    'value' => 'ステーキが美味しい',
                    'short' => true,
                ],
            ],
        ];



        $yourSlackToken = "[TOKEN]";
        $client = ClientFactory::create($yourSlackToken);
        $client->chatPostMessage([
            'attachments' => json_encode($attachments),
            'channel' => '#bot-practice',
            'thread_ts' => '1689573862.454549'
        ]);
```




## 参考資料

https://documents.trocco.io/docs/how-to-generate-slack-webhook-url