はじめに
研究室や職場でSlackを使っていると、
「この前のスライドどこ?」「プリンタの設定どこにあったっけ?」
といったやり取り、ありますよね。
手動でDriveやNotionなどを探すのは地味に手間なので、
SlackのDMにキーワードを送ると自動でURLを返すbot をGoで作りました。
本記事ではその仕組みと設計のポイントを紹介します。
背景(作ろうと思ったきっかけ)
Slackにも検索機能はありますが、資料URLだけを即座に出す用途には少し冗長です。
DriveやNotionにまとめても、どこに書いたかを探すのが面倒でした。
そこで、
- routes.yaml という1枚のYAMLファイルにキーワードとURLを登録
- SlackのDMでキーワードを送るだけで即座に返す
という簡易リンク辞書botを作りました。
作成したアプリの概要
SlackのDMで「スライド」「旅費精算」などの単語を送信すると、対応するURLを返してくれるbotです。
主な機能:
- routes.yamlでキーワードとURLを管理
- SlackのDMでキーワードを送ると対応URLを返す
- Cloud Run上で常時稼働し、署名検証とリトライ対応
- HMAC署名検証・再送対策つき
リクエストはSlackのEvents API(event_callback)で受け取り、
3秒制限に対応するため非同期処理で返信しています。
使用技術
- 言語:Go 1.22
- フレームワーク:標準net/http
- インフラ:Google Cloud Run
- Slack API:Events API + chat.postMessage
- データ:routes.yaml(YAML形式のリンク辞書)
構成
.
├── Dockerfile
├── README.md
├── go.mod
├── go.sum
├── main.go
└── routes.yaml
routes.yaml の例
links:
- keywords: ["スライド", "発表資料"]
url: "https://drive.google.com/slide/xxxx"
note: "研究発表スライド"
- keywords: ["旅費", "精算"]
url: "https://docs.google.com/spreadsheets/xxxx"
note: "旅費精算シート"
実装で工夫したポイント
- 即時レスポンス + 非同期処理
- Slackの3秒制限に対応し、体感レスポンスを高速化
- 重複イベント対策(LRUキャッシュ)
- 再送イベントを無視して冪等性を担保
- ログレベル管理(INFO/WARN/ERROR)
- 環境変数
LOG_LEVELで制御可能
- 環境変数
今後追加したい機能
- Slackにアップされたファイルを自動的に辞書登録
- Notion / Drive API などと連携してURL更新を自動化
- /add や/list コマンドでSlack上から編集可能にする
- chatGPT APIと連携して文脈検索対応
まとめ
Goの標準ライブラリだけで、軽量・安全なSlackbotを構築できることを実感しました。
署名検証・リトライ・非同期化といった
運用を意識した実装を行うことで、Cloud Run上でも安定して動作します。
シンプルですが、拡張次第でかなり汎用的に使えると思います。
GitHub