0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Go製のCGIからSlackに投稿する

Posted at

はじめに

やったことはタイトルの通りですが、ひさびさにGoを触ってみようと思ったので軽く試してみました。
参考にあげてる記事を適当にそのままくっつけただけです。

環境

  • go: 1.17.5
  • Apache: 2.4

Slack投稿準備

Slack API を使用してメッセージを投稿する を参考に、ボット用トークンを取得する。

  • workspaceにアプリを作成
  • Bot Token Scopeschat: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を使う
  • リクエストの読み込みに使うReadAllioutilから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に届く

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?