💬

PHPでSlack通知をするときに文字数制限に引っかかる?

2021/12/26に公開

結論

ライブラリを載せ替えましょう

背景

APIを使ってSlack通知を行うときに、すでに実装されてるライブラリを使うことが多いかと思います。
その中で Frlnc/php-slack というライブラリがありますが、Slack通知をする際に、送信するメッセージの文字数超過によりエラーが発生することがあります。
Slackのドキュメントを見ると、4000字くらいまでは送れそうですが、7~800字でもエラーになってしまいます。
内部の実装を見てみると、「あ、そういうことか」という気づきがあったので、備忘録として記事を残します。

何が問題だったのか

Frlnc/php-slack というライブラリでは、各APIの実行は src/Core/Commander.php で下記のように実装されています(一部抜粋)。

public function execute($command, array $parameters = [])
{                   

    // 前処理

    if (isset($command['post']) && $command['post']) {
        return $this->interactor->post($url, [], $parameters, $headers);  
    }
    
    return $this->interactor->get($url, $parameters, $headers);
}

実行するコマンドが $command で送られますが、'post' => true で実装されてる場合、 POST メソッドで実行されます。
ただメッセージを送る chat.postMessage というコマンドには 'post' => true で実装されていないため、 GET メソッドで実行されます。
なのでURLの文字数超過が起こってしまうために、通知が失敗してしまいます。

対策

基本的には開発が止まっているのでライブラリの載せ替えを検討しましょう。
もしすぐには載せ替えられないのであれば、 Commander.php を継承したクラスを作り、 post を true にしてあげるのは一つの手かもしれません。

use Frlnc\Slack\Contracts\Http\Interactor;
use Frlnc\Slack\Core\Commander;

class SlackCommander extends Commander
{
    /**
     * {@inheritDoc}
     */
    public function __construct($token, Interactor $interactor)
    {
        parent::__construct($token, $interactor);
        self::$commands['chat.postMessage']['post'] = true;
    }
}

ライブラリのPRを見ると修正PRが投げられていますが、特に進展がなさそうなので、早めの載せ替えが望まれますね。
https://github.com/Frlnc/php-slack/pull/26

Discussion