東京生まれHOUSE MUSIC育ち

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

chinachuで予約録画番組をslackに通知するために:golangでJSONを扱う


スポンサードリンク

記事が長くなったので、目次です。

やりたいこと

Slackに色々なものを通知しています。例えば、録画サーバでエンコードした番組情報とか、録画サーバのCPUやファイルシステムの利用率等を通知しています。

Chinachuで録画予約している内容を通知できたら便利かなと思い、手を動かしてみました。

この記事で書いていること

この記事ではchinachuのAPIから返却されるJSONを扱うまでを書いています。

というのも、slackに通知するまでに技術的に超える課題がありそうなので、今回はJSONを扱えるようにまでと範囲を絞って記事にしました。

参考にした記事

golangでJSONを扱えるようにするには、参考になる記事が数多くあります。その中で、以下の記事を参考にしました。

qiita.com

qiita.com

ChinachuのAPI

予約一覧は以下で取得することができます。

以下を参照すると、「/reserves」を使用すると予約している番組が返却されるとのこと。

github.com

試しにブラウザから以下のURLを指定してみます。

http://192.168.1.254:20772/api/reserves.json

そうすると、以下のようにブラウザにAPIからJSONが返却されました。

f:id:padobure:20200215213129p:plain

作ったプログラム

手始めに吐き出されたJSONをファイルにしてみました。そのJSONファイルから必要な情報を編集するプログラムを作りました。

encoding/jsonでUnmarshalってやればJSONを扱えるのが便利でした。

苦労したところは、録画の開始時刻の表示でした。UNIXタイムを使用しているのかと思っていたのですが、なぜか桁数が多くて未来日になるのです。とりあえず、1000で割ったらなんとか表示されたのでこれでOKかなと思います。おそらく、仕様としてUNIXタイムに補足情報的なのを付与しているのかなと想像しながら、深くは調べてないです。

また、JSONの構造体については、後でカスタマイズしやすいように、表示等で使用してないデータも予め定義しています。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "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"`
 
}

func main() {

    raw, err := ioutil.ReadFile("./sample.json")
    if err != nil {
        log.Fatal(err)
    }

    var yoyaku []Yoyaku
    if err := json.Unmarshal(raw, &yoyaku); err != nil {
        log.Fatal(err)
    }
    // 出力する
    fmt.Println("*** 録画サーバの予約状況 ***")
    for _, y := range yoyaku {
        fmt.Printf("%s(%d分)%s : %s\n",  time.Unix((y.Start / 1000), 0).Format("01月02日15:04"), y.Seconds/60 , y.Channel.Name , y.Title)
    }

}

出力結果

プログラムを実行すると、以下のように1週間分の予約番組が表示されます。

1週間の表示は必要なくて、当日分の予約とか、翌日までの予約が表示されればいいので、そのあたりの変更は別のタイミングでやろうと思います。

# go run json.go

*** 録画サーバの予約状況 ***
02月15日21:00(50分)NHK総合1・東京 : NHKスペシャル
02月15日22:00(60分)NHKEテレ1東京 : SWITCHインタビュー 達人達(たち) 選
02月15日22:00(54分)日テレ1 : トップナイフ ー天才脳外科医の条件ー
02月15日23:00(30分)日テレ1 : マツコ会議高級ランジェリーにハマる女性たち…
02月15日23:30(30分)NHK総合1・東京 : 【よるドラ】伝説のお母さん
02月16日01:45(25分)テレビ東京1 : ゴッドタン
02月16日07:00(30分)日テレ1 : 所さんの目がテン!寒い日に恋しい入浴剤の健康効果とは
02月16日07:00(30分)フジテレビ : ボクらの時代
02月16日07:30(30分)TBS1 : がっちりマンデー!!★人手不足の今…うまく人を集めてがっちり!
02月16日08:25(27分)NHK総合1・東京 : サラメシ シーズン9
02月16日10:00(75分)フジテレビ : ワイドナショー【アカデミー賞に▽テレ朝・宝くじ企画ヤラセ疑惑】
02月16日13:05(27分)NHK総合1・東京 : サンドのお風呂いただきます
02月16日14:00(55分)フジテレビ : ザ・ノンフィクション もう一度 お父さんに逢いたい ~ホストの僕とフィリピン…
02月16日14:00(60分)TBS1 : 今夜第5話!日曜劇場第4話リピート
02月16日19:58(56分)日テレ1 : 世界の果てまでイッテQ! イモトWT南アフリカ珍獣ツアー&温泉同好会寒中水泳
02月16日21:00(54分)TBS1 : 日曜劇場「テセウスの船」第五話
02月16日21:00(50分)NHK総合1・東京 : NHKスペシャル
02月16日21:54(54分)テレビ東京1 : 有吉ぃぃeeeee!~そうだ!今からお前んチでゲームしない?
02月16日23:00(30分)TBS1 : 情熱大陸
02月16日23:25(30分)日テレ1 : ダウンタウンのガキの使いやあらへんで!
02月17日00:10(25分)NHK総合1・東京 : 映像研には手を出すな!
02月17日18:55(30分)NHKEテレ1東京 : 沼にハマってきいてみた▽生放送でスゴ技連発!KAMIWAZA&uiui先輩参戦
02月17日19:30(72分)NHK総合1・東京 : 鶴瓶の家族に乾杯▽憧れの富士絶景SP!藤井隆と山梨県山中湖村ぶっつけ本番旅!
02月17日21:00(54分)フジテレビ : 絶対零度~未然犯罪潜入捜査~
02月17日23:00(40分)フジテレビ : 石橋貴明のたいむとんねる
02月17日23:50(30分)NHK総合1・東京 : 有吉のお金発見 突撃!カネオくん
02月18日00:15(30分)テレビ朝日 : しくじり先生 俺みたいになるな!!
02月18日00:20(50分)NHK総合1・東京 : プロフェッショナル 仕事の流儀
02月18日01:10(50分)NHK総合1・東京 : 世界はほしいモノにあふれてる
02月18日02:45(10分)NHK総合1・東京 : チコちゃんに叱られる!チコっとだけスペシャル
02月18日04:00(15分)テレビ東京1 : 家、ついて行ってイイですか?(明け方)
02月18日18:55(30分)NHKEテレ1東京 : 沼にハマってきいてみた
02月18日19:30(27分)NHK総合1・東京 : サラメシ シーズン9
02月18日20:57(63分)TBS1 : マツコの知らない世界
02月18日22:00(57分)TBS1 : 火曜ドラマ「恋はつづくよどこまでも」
02月18日22:00(30分)NHK総合1・東京 : クローズアップ現代+
02月18日22:30(50分)NHK総合1・東京 : プロフェッショナル 仕事の流儀
02月18日23:15(60分)テレビ朝日 : ロンドンハーツ 第七世代が辛口!
02月18日23:50(45分)NHK総合1・東京 : ブラタモリ
02月19日00:35(50分)NHK総合1・東京 : NHKスペシャル
02月19日00:59(30分)日テレ1 : ラグビー応援TV ONEラグビー
02月19日01:25(50分)NHK総合1・東京 : 【ドラマ10】ハムラアキラ~世界で最も不運な探偵~
02月19日01:26(30分)テレビ朝日 : フリースタイルダンジョン
02月19日18:55(30分)NHKEテレ1東京 : 沼にハマってきいてみた 選
02月19日21:00(60分)テレビ東京1 : 家、ついて行ってイイですか?~告白!家族の秘密SP~
02月19日22:00(30分)NHK総合1・東京 : クローズアップ現代+
02月19日23:50(27分)NHK総合1・東京 : 所さん!大変ですよ
02月20日00:55(50分)NHK総合1・東京 : NHKスペシャル
02月20日04:03(27分)NHK総合1・東京 : サンドのお風呂いただきます
02月20日12:20(25分)NHK総合1・東京 : サラメシ シーズン9
02月20日19:30(27分)NHK総合1・東京 : 所さん!大変ですよ
02月20日22:00(30分)NHK総合1・東京 : クローズアップ現代+
02月20日22:00(54分)テレビ東京1 : カンブリア宮殿
02月20日22:30(50分)NHK総合1・東京 : 世界はほしいモノにあふれてる▽中欧!幻のアンティークを探す旅 チェコ&ドイツ
02月20日23:15(60分)テレビ朝日 : アメトーーク!
02月20日23:56(59分)TBS1 : ダブルベッド SEVEN DAY LOVER/吉村崇 犬飼貴丈 ケンコバ
02月21日00:55(72分)NHK総合1・東京 : 鶴瓶の家族に乾杯▽憧れの富士絶景SP!藤井隆と山梨県山中湖村ぶっつけ本番旅
02月21日01:00(30分)テレビ東京1 : 木ドラ25 ゆるキャン△
02月21日19:30(27分)NHK総合1・東京 : 首都圏情報 ネタドリ!
02月21日19:57(45分)NHK総合1・東京 : チコちゃんに叱られる!▽仮面ライダーのバイク▽発酵食品の謎▽香川の手袋
02月21日20:00(55分)tvk1 : 探偵!ナイトスクープ▽計算ができる天才犬&オムライスマスター・ケイコ師匠出現!?
02月21日21:55(57分)フジテレビ : ダウンタウンなう
02月21日22:00(50分)NHK総合1・東京 : 【ドラマ10】ハムラアキラ~世界で最も不運な探偵~
02月21日23:00(40分)フジテレビ : 全力!脱力タイムズ
02月22日00:00(60分)NHKEテレ1東京 : SWITCHインタビュー 達人達(たち)
02月22日00:20(30分)テレビ朝日 : タモリ倶楽部
02月22日01:10(30分)NHK総合1・東京 : 【よるドラ】伝説のお母さん
02月22日01:40(30分)NHK総合1・東京 : SONGS
02月22日02:10(30分)NHK総合1・東京 : クローズアップ現代+選
02月22日02:20(30分)テレビ朝日 : くりぃむナンチャラ
02月22日02:30(30分)テレビ東京1 : 流派-R since2001
02月22日08:15(45分)NHK総合1・東京 : チコちゃんに叱られる!▽仮面ライダーのバイク▽発酵食品の謎▽香川の手袋
02月22日09:30(135分)TBS1 : 王様のブランチ
02月22日09:30(30分)NHK総合1・東京 : 有吉のお金発見 突撃!カネオくん
02月22日10:55(27分)NHK総合1・東京 : 首都圏情報 ネタドリ!
02月22日11:59(121分)TBS1 : 王様のブランチ
02月22日15:05(50分)NHK総合1・東京 : NHKスペシャル選 ホットスポット最後の楽園 season3
02月22日18:30(30分)日テレ1 : 満天☆青空レストラン 宮川大輔が美味しい食材を求めて日本全国を飛び回る!
02月22日18:30(30分)フジテレビ : もしもツアーズ
02月22日19:30(45分)NHK総合1・東京 : ブラタモリ
02月22日19:54(60分)テレビ東京1 : 出川哲朗の充電させてもらえませんか?四国“お遍路旅”第1弾は香川県!SP完結編
02月22日20:15(30分)NHK総合1・東京 : 有吉のお金発見 突撃!カネオくん
02月22日21:00(50分)NHK総合1・東京 : NHKスペシャル ホットスポット 最後の楽園 season3
02月22日22:00(54分)日テレ1 : トップナイフ ー天才脳外科医の条件ー
02月22日22:00(60分)NHKEテレ1東京 : SWITCHインタビュー 達人達(たち)
02月22日23:00(30分)日テレ1 : マツコ会議
02月22日23:00(30分)NHK総合1・東京 : SONGS
02月22日23:30(30分)NHK総合1・東京 : 【よるドラ】伝説のお母さん

次にやりたいこと

次は直接録画サーバのAPIを叩いて、JSONファイルを取得するように機能を追加していこうと考えています。

Chinachuは認証がいらないので、Linuxコマンドのcurlを使用すれば良さそう。勉強のためには、APIのクライアントを作った方が勉強になりそうですが、まずは予約情報の通知運用をはじめていこうかなと考えています。

f:id:padobure:20200215213323j:plain