東京生まれHOUSE MUSIC育ち

悪そうな奴はだいたい友達なの?

chinachuで予約録画番組をslackに通知することができた!


スポンサードリンク

録画サーバの予約状況をslackに通知したくて、手始めに作ったのを以下の記事にしました。

nomusicnolife.hatenablog.com

上記の状態から、録画サーバから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)
}

f:id:padobure:20200215213323j:plain