タグ
#Slack
Slackに関する記事を公開しています。
自動投稿 bot の設計を「ネタ→投稿」から「背景→投稿」に変えた
LLM で X に自動投稿する bot にテキスト投稿を足そうとして、「ネタの粒度」で機能を分ける設計を始め、書く前に破綻しました。bot を通す理由は「投稿を書くこと」ではなく「そのままでは投稿にならない背景を変換すること」で、境界線を「変換が要るか」の 1 本にしました。毎朝 GitHub の活動と PR 本文の「ハマったこと」欄を集めて Slack に提示する push 型に反転させ、返信がどのネタに届くか分からなくなった混線を 1 ネタ 1 スレッドで、状態機械の使い回しで生まれた競合を条件付き更新で塞いだ記録です。
Slack bot が 3 秒で切られるので Lambda を受付と処理に分けた
Bolt for JavaScript と Lambda の Function URL で Slack bot を動かすと、レスポンスは全リスナーの完了後にしか返らず、Slack の 3 秒制限を毎回超えていました。当初は http_timeout の再送を無視する分岐で凌いでいましたが、初回の処理が失敗するとイベントが静かに消える構造でした。Lambda を「受付」と「処理」に分け、重い処理は自分自身を非同期 invoke して委譲する形に直しました。lazy リスナーは Bolt for Python にしか無い、という前提の取り違えから始まった記録です。
X API への自動投稿が二重になる経路を入口と出口で塞ぐ
Slack から X に 4 コマを自動投稿する bot に、同じ投稿が 2 回出る経路が 2 つありました。入口は Slack の再送(3 秒で切られ最大 3 回届く)とボタンの連打で、イベント ID の条件付き書き込みと status 遷移のロックで塞ぎました。出口は X API の応答が返らないまま再試行することで、失敗を「確実に失敗・結果不明・重複」に分け、結果不明は自動で再試行しないようにしました。実際に二重投稿は起きておらず、コードを読み直して先に塞いだ記録です。
Slack のリンクプレビューがワンタイムのログインリンクを消費する
マジックリンクを Slack Incoming Webhook に流すと、プレビュー生成クローラーが人間より先にリンクを GET してワンタイムトークンを消費し、invalid link になります。unfurl_links / unfurl_media の無効化による対策と、「GET でトークンを消費する」設計自体の問題点をまとめます。