Laravel 7.xでslackに通知したい

Incomming Webhookをセットアップして、ターミナルから挙動確認します。

curl -X POST --data-urlencode "payload={\"channel\": \"#hpscript\", \"username\": \"webhookbot\", \"text\": \"これは webhookbot という名のボットから #general に投稿されています。\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/hogeL/hogehoge

curlでslackの#hpscriptのチャネルに投稿されていることを確認できます。

### 1.env設定

SLACK_WEBHOOK_URL=https://hooks.slack.com/services/hogeL/hogehoge

### 2.guzzlehttp/guzzle、slack-notification-channelインストール
$ php composer.phar require guzzlehttp/guzzle
$ php composer.phar require laravel/slack-notification-channel

### 3. Notification作成
$ php artisan make:notification Slack

app/Notifications/Slack.php

use Illuminate\Notifications\Messages\SlackMessage;
class Slack extends Notification
{
    use Queueable;
    protected $content;

    public function __construct($message)
    {
        $this->content = $message;
    }

    public function via($notifiable)
    {
        return ['slack'];
    }

    public function toSlack($notifiable)
    {
        return (new SlackMessage)
            ->from('hpscript', ':bomb:')
            ->to('#general')
            ->content($this->content);
    }

    public function toArray($notifiable)
    {
        return [
        ];
    }
}

app/User.php

public function routeNotificationForSlack($notification){
        return env('SLACK_WEBHOOK_URL');
    }

### 4.slack通知コマンド作成
$ php artisan make:command SendSlackCommand
app/Console/Commands/SendSlackCommand.php

use App\User;
use App\Notifications\Slack;
class SendSlackCommand extends Command
{
    protected $signature = 'slack:send {message}';

    protected $description = 'Send Slack Notification';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $user = new User();
        $user->notify(new Slack($this->argument('message')));
    }
}

### 5.実行
$ php artisan slack:send ‘slack通知のテストです’
-> Slackの#generalのチャネルで挙動確認

コントローラで使いたい場合

use App\Notifications\Slack;
use App\User;

public function index(Request $request)
    {
        //
        $user = Auth::user();
        $user->notify(new Slack($user->name.'さんがログインしました'));
        return view('subscriber.index', compact('user'));
    }

※メモ
– Notifications/Slack.phpのconstructorでenv()は使えない
– slack-notification-channelは、laravel/frameworkと分離してインストールされるがインストール場所が変わっても名前空間は同じため、使い方は同じ

想像以上に手こずりました。

Outgoing webhooks

Outgoing Webhooks sends a post data from Slack via POST when there is a specific post, and sends a response in json in a specific format to that post.

ん?outgoing webhookを検索します。
ありました。

token=hoge
team_id=T0001
team_domain=例

channel_id=C2147483705
channel_name=テスト

timestamp=1355517523.000005
user_id=U1234
user_name=スティーブ

text=googlebot: 身軽なツバメの対気速度はどのくらい?

trigger_word=googlebot:

返信中

{
	"text": "アフリカ系あるいはヨーロッパ系?"
}

Channel :投稿を取得するチャンネル
URL(s) :POST送信先になるURL
Customize Name :レスポンスを返す際の名前
Customize Icon :レスポンスを返す際のアイコン

When a message that meets the conditions is posted, an HTTP request is thrown to the URL(web service) set in advance.


引き金となるワードがあると、特定のURLにリクエストを送ることができるということですね。なるほどー

slackの開発を行う

チャンネルを作っていきます。

チャンネルができました。

web hook用のURLを取得する為に、以下のURLを叩く
https://slack.com/services/new/incoming-webhook

ほうほう、簡単に取得できそうです。
Incoming Webhooks are a simple way to post messages from external sources into Slack. They make use of normal HTTP requests with a JSON payload, which includes the message and a few other optional details described later.
Message Attachments can also be used in Incoming Webhooks to display richly-formatted messages that stand out from regular chat messages.

curl -X POST --data-urlencode "payload={\"channel\": \"#general\", \"username\": \"webhookbot\", \"text\": \"これは webhookbot という名のボットから #general に投稿されています。\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/hoge/hoge/hogehoge

vagrantからpostします。
[vagrant@localhost ~]$ curl -X POST –data-urlencode “payload={\”channel\”: \”#general\”, \”username\”: \”webhookbot\”, \”text\”: \”これは webhookbot という名のボットから #general に投稿されています。\”, \”icon_emoji\”: \”:ghost:\”}” https://hooks.slack.com/services/hoge/hoge/hogehoge
ok

通知されました!Wow!素晴らしい!