5
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 1 year has passed since last update.

法政大学情報科学部Advent Calendar 2021

Day 25

Go 言語で Mattermost Bot を作成する

Last updated at Posted at 2021-12-22

法政大学情報科学部 2 年の阿部哲也です。
今回は大好きな Go 言語で Mattermost の BOT を作成してみました。

Mattermost とは

Mattermost (マターモスト) とは、オープンソースのセルフホスティング式のチャットツール。

自分で構築する Slack みたいな感じ!

Mattermost を Docker compose で構築

docker-compose が導入されていることを確認します。

 >> docker-compose -v
docker-compose version 1.16.1, build 6d1ac21

git clone で mattermost をクローンします。

git clone https://github.com/mattermost/mattermost-docker.git

起動します。

cd mattermost-docker
docker-compose up -d

なにも設定を変えていない場合は、http://localhost で起動を確認できます。
私は VMware (IP: 192.168.202.129) で構築したので、http://192.168.202.129 で確認できました!

Mattermost の設定

  • 日本語に設定します。

左上の三本線 → [Account Settings] → [Display] → [Language] の Edit → 日本語を選びます。

  • 内部通信を許可します。

左上の三本線 → [システムコンソール] → [環境] → [開発者]
[信用されていない内部通信を許可する] に以下を追加します。

127.0.0.1 localhost 自分のIP

自分の場合は、

127.0.0.1 localhost 192.168.202.129

のように設定しました。

  • スラッシュコマンドの有効化

左上の三本線 → [統合機能] → [スラッシュコマンドを追加する]

image.png

[更新する]で操作を終了します。

Go 言語で簡単な BOT を作成する

package main

import (
	"fmt"
	"net/http"
)

//slashコマンドを受け付ける
func slash(w http.ResponseWriter,r *http.Request) {
	text := r.FormValue("text")
	fmt.Fprintf(w,"hello %v",text)
}

func main() {
	http.HandleFunc("/slash",slash)
	http.ListenAndServe(":8090",nil)
}

/slash hogehoge を打つことで、Mattermost から、http://192.168.202.129:8090/slash/hogehoge に POST される。

Go 言語が hogehoge をパラメータ名として受け取り、それを printf で、mattermost で表示される。

という流れで、Mattermost で表示されます。

Bot を作成

  • Bot の作成を有効化します

[システムコンソール] → [統合機能] → [Botアカウント]

Botアカウントの作成を有効にするを有効

  • BOT を作成

[統合機能] → [Botアカウント] → [Botアカウントを追加する]

image.png

更新するを押して終了

image.png

終了する前に、トークンを控えておくことが大切!

  • チャンネル ID を取得

チャンネル名の右の下矢印 → 情報を表示する

image.png

URL の下に小さく ID が載っています。

この時点で、Bot が正しく動作するのか確かめます。
コマンドライン上で以下を入力します。

BODY='{
  "channel_id": "1ngefhpjojyabd9fc7n8twt3xh",
  "message": "Hello!"
}'

curl -i \
  -H 'Authorization: Bearer jmkk43ic3ib3tenmhycbfj7jre' \
  -H 'Content-Type: application/json' \
  -d "$BODY" \
  --trace-ascii - http://192.168.202.129:80/api/v4/posts

channel_id には、さっき確認したチャンネル IDを、Authorization には、Bot のトークンを入力してください。
Bearer は消さないように注意!

うまくいくと以下のようになります。

image.png

Go 言語でプログラムの作成

package main

import (
	"fmt"
	"net/http"
	"net/http/httputil"
	"bytes"
	"os"
	"strings"
	"encoding/json"
)

// アクセストークン、URL を定義
const ACCESSTOKEN = "Bearer jmkk43ic3ib3tenmhycbfj7jre"
const ENDPOINT = "http://192.168.202.129:80/api/v4/posts"

type BODY struct {
	ChannelId string `json:"channel_id"`
	Message string `json:"message"`
}

func HTTPPost(mes string) {

	//debug用
	debug := strings.Split(mes,"_")[0]

	//BODYの作成
	requestBody := new(BODY)
	requestBody.ChannelId = "1ngefhpjojyabd9fc7n8twt3xh"
	requestBody.Message = mes

	// ボディをJSONに変換
	json_body, _ := json.Marshal(requestBody)

	//リクエストを作成する
	req, _ := http.NewRequest("POST", ENDPOINT, bytes.NewBuffer(json_body))
	req.Header.Set("Authorization", ACCESSTOKEN)
	req.Header.Set("Content-Type", "application/json")

	//リクエストを送信
	client := new(http.Client)
	resp,err := client.Do(req)

	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	defer resp.Body.Close()

	//デバッグ用 POSTの内容を確認
	if debug=="debug" {
		//リクエストの内容確認
		dump, _ := httputil.DumpRequestOut(req, true)
		fmt.Printf("%s", dump)

		//POST の内容を確認
		dumpResp, _ := httputil.DumpResponse(resp, true)
		fmt.Printf("%s", dumpResp)
	}
}

//slashコマンドを受け付ける
func slash(w http.ResponseWriter,r *http.Request) {
	text := r.FormValue("text")
	//fmt.Fprintf(w,"hello %v",text)

	//http postする
	HTTPPost(text)
}

func main() {
	http.HandleFunc("/slash",slash)
	http.ListenAndServe(":8090",nil)
}

ずっと 403 エラーが出ていました。以下にまとめました。

GitLab と連携した Bot を現在作成しています。

参考

5
0
1

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
5
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?