録画サーバの予約状況をslackに通知したくて、手始めに作ったのを以下の記事にしました。
上記の状態から、録画サーバからapiを使用して予約情報を取得し、slackに通知できるようにしました。この記事では追加した内容を書いてます。
apiを利用して録画サーバから予約番組情報取得
以下のようにcurlを利用して情報を取得するようにしました。
汎用的なapiクライアントを作れば良かったのですが、手っ取り早く実装したかったので、外部コマンドのcurlを呼び出すようにexec.Command
を使用しました。
raw, err := exec.Command("curl", "http://192.168.1.254:20772/api/reserves.json").Output() if err != nil { log.Fatal(err) }
予約番組情報をslackに通知
JSONから取得した予約番組情報をスライスに格納しました。以下のようにappned
を使用して、スライスに格納していきます。
str = append(str,"*録画サーバの予約状況*") for i, y := range yoyaku { str = append(str, fmt.Sprintf("%d)%s(%d分)\n%s:%s\n", i, time.Unix((y.Start/1000), 0).Format("1/2Mon15:04"), y.Seconds/60, y.Channel.Name, y.Title)) }
その後、slackに通知するために、スライスを文字列のstringに変換しました。変換はstrings.Join
を利用しています。表示数が多いと見にくいので、最初の10こを通知するようにしています。
strings.Join(str[0:10],"\n")
想定外だったキャンセルしている予約録画番組も表示される
作ってみたはいいのですが、欠点があります。それは、キャンセルした番組も表示されてしまうのです。このslack通知の運用を始めてから気づきました。
コード
完成したのは、以下です。slackのAPIトークンは隠してます。
import ( "encoding/json" "fmt" "github.com/nlopes/slack" "log" "os/exec" "strings" "time" ) type Yoyaku struct { ID string `json:"id"` Category string `json:"category"` Title string `json:"title"` FullTitle string `json:"fullTitle"` Detail string `json:"detail"` Start int64 `json:"start"` End int64 `json:"end"` Seconds int `json:"seconds"` Description string `json:"description"` Channel struct { Type string `json:"type"` Channel string `json:"channel"` Name string `json:"name"` ID string `json:"id"` Sid int `json:"sid"` Nid int `json:"nid"` HasLogoData bool `json:"hasLogoData"` N int `json:"n"` } `json:"channel"` } var ( slackAPIToken = "Your slackAPIToken " slackChannel = "information" ) func main() { raw, err := exec.Command("curl", "http://192.168.1.254:20772/api/reserves.json").Output() if err != nil { log.Fatal(err) } var yoyaku []Yoyaku if err := json.Unmarshal(raw, &yoyaku); err != nil { log.Fatal(err) } var str []string // 出力する str = append(str, "*録画サーバの予約状況*") for i, y := range yoyaku { str = append(str, fmt.Sprintf("%d)%s(%d分)\n%s:%s\n", i, time.Unix((y.Start/1000), 0).Format("1/2Mon15:04"), y.Seconds/60, y.Channel.Name, y.Title)) } reserve := strings.Join(str[0:10], "\n") api := slack.New(slackAPIToken) attachment := slack.Attachment{ Pretext: "<<<録画サーバ>>>", Text: "http://192.168.1.254:20772/#!/dashboard/top/", } _, _, err = api.PostMessage(slackChannel, slack.MsgOptionText(reserve, false), slack.MsgOptionAttachments(attachment)) if err != nil { fmt.Printf("%s\n", err) return } // fmt.Printf("Message successfully sent to channel %s at %s", channelID, timestamp) }