プロ野球開幕しましたね。
メジャー志向の大谷翔平が日本で見れるのも、
残りわずか…かもしれません。
見逃さないよう、大谷翔平の打席になったら、
自動でチャンネルを変えたいと思います。
開発環境の他にIRKitと、
日本ハム主催試合の中継をしているGAORAとの契約が必要です。
今回使用したコードはgithubに置きました。
試合経過をスクレイピング
MLBではAPIがごろごろありそうなのですが、
NPBではソースが少なく、有名なスポーツナビから試合経過を取得してみます。
(スクレイピング周りは法律関係難しいそうで、もしご迷惑かけるようでであればば削除します)
今回は、Go言語というものにチャレンジしてみたかっため、
スクレイピングにはgoqueryを使ってみることとします。
doc, err := goquery.NewDocument(path + query)
if err != nil {
log.Fatal(err)
}
cNo := doc.Find("#batter .playerNo").Text()
cTeam := doc.Find(".score .act").Text()
cNext := doc.Find("#nextR p").Text()
この短いコードだけで欲しい情報が取得できました。
成功し出力すると、以下のような結果が返ってきます。
上から、現在の打席の背番号、攻撃中のチーム名、次の打者の名前です。
No: #8
Team: 日本ハム
Next: 大谷翔平
IRKitでチャンネルを変える
次の打者が大谷翔平であれば、
チャンネルを変えるようにrequestを送りたいのですが、
Go言語ではnet/httpを使うとできるのだそうです。
やってみます。
Jsonの中身は、IRKitのサンプルそのままです。
setしているheaderもIRKitの仕様でrequestに含める必要があります。
json := `{"format":"raw","freq":38","data":` + チャンネルの信号 + `}`
var ch = bytes.NewBuffer([]byte(json))
req, err := http.NewRequest("POST", "http://192.168.12.51/messages", ch)
req.Header.Set("X-Requested-With", "curl")
できました!
実際には、リモコンのCSボタンを押して、チャンネルを変えるという
2つの処理が必要だったのですが、
処理の間に、一呼吸おいてあげる必要があります。
time.Sleep(1 * time.Second)
などで間隔を空けてあげる必要があります。
感想
一番ありがたかったのが、Go言語のクロスコンパイルでした。
Macで作って、RaspberryPiで動かす予定だったので、
OSとアーキテクチャを指定するだけで、
何の問題もなく動いたのはすごく助かりました。
引き続き、Go言語には触れていきたいと思います。
スクレイピングは経験値が必要だと思いました。
今回の例でいうと、スポーツナビの速報ではリアルタイムではなく、
不規則なタイムラグがあります。
大谷翔平が回の先頭打者だった場合や、初球打ちした場合など、
打席が終わった後にチャンネルが変わるという残念な結果となります。
2つ前の打者でチャンネルを変える工夫や、
先頭打者の場合の処理分岐など、チューニングが結構必要かと思います。
動画も上げてみましたので、興味のある方はぜひ。