25
17

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 5 years have passed since last update.

大谷翔平の打席になったら自動でチャンネルを変える

Last updated at Posted at 2016-03-31

プロ野球開幕しましたね。
メジャー志向の大谷翔平が日本で見れるのも、
残りわずか…かもしれません。

見逃さないよう、大谷翔平の打席になったら、
自動でチャンネルを変えたいと思います。

開発環境の他に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つ前の打者でチャンネルを変える工夫や、
先頭打者の場合の処理分岐など、チューニングが結構必要かと思います。

動画も上げてみましたので、興味のある方はぜひ。

25
17
0

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
25
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?