はじめに
やったことはタイトルの通りですが、ひさびさにGoを触ってみようと思ったので軽く試してみました。
参考にあげてる記事を適当にそのままくっつけただけです。
環境
- go: 1.17.5
- Apache: 2.4
Slack投稿準備
Slack API を使用してメッセージを投稿する を参考に、ボット用トークンを取得する。
- workspaceにアプリを作成
-
Bot Token Scopes
にchat:write
を設定(ユーザーは今回使わないのでパス) - ワークスペースにインストール
-
Bot User OAuth Token
取得
コーディング準備
標準パッケージ以外にslack-go
パッケージも利用するので準備する。
cd your-dir
go mod init example.com/m
go get -u github.com/slack-go/slack
必要な要素
- CGIとして動作させるため、パッケージ
net/http/cgi
を使う - リクエストの読み込みに使う
ReadAll
がioutil
からio
に移動になった
コード全体
main.go
package main
import (
"github.com/slack-go/slack"
"io"
"net/http"
"net/http/cgi"
"net/url"
"strings"
)
const TOKEN = "xoxb-your-token"
// メイン関数
func main() {
cgi.Serve(http.HandlerFunc(handler))
}
// CGIの処理
func handler(w http.ResponseWriter, r *http.Request) {
// POSTメソッドでなければエラーで終了
if r.Method != http.MethodPost {
w.WriteHeader(http.StatusBadRequest)
return
}
// リクエストボディの内容を取得(byte[])
body, err := io.ReadAll(r.Body)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
// urlencodeされているのでmapに分解(デコードも自動でしてくれる)
values, err := url.ParseQuery(string(body))
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
// フィールド`message`の内容をリクエストから取得(string[]からstringにも変換)
message := values["message"]
data := strings.Join(message , "")
// slackクライアント生成して投稿
c := slack.New(TOKEN)
_, _, err = c.PostMessage("#チャンネル名", slack.MsgOptionText(data, true))
if err != nil {
w.WriteHeader(http.StatusConflict)
return
}
w.WriteHeader(http.StatusOK)
}
使い方
- ビルドしてApacheのcgi-bin直下に置く
- ブラウザからとりあえずアクセスする(GETメソッドになるので400エラーの画面が出る)
- Webインスペクターからfetchする
await fetch('main.cgi', {
method: "POST",
body: `message=${encodeURIComponent('めっせーじ内容!!!!')}`
});
- Slackに届く