[Androidアプリ]大谷通知アプリを作ってみた

大谷翔平選手が打席に立つときにプッシュ通知を送るAndroidアプリを作った時のメモです。
[こちらのアプリです(Google Play)](https://play.google.com/store/apps/details?id=com.Ohtani.tetsuya.showtime)
iOS未対応ですが、iOSユーザー用にTwitterアカウントを用意しました(@ sho_time___)
Androidアプリのプッシュ通知送信時に上記アカウントで自動ツイートするように致しました。
#なぜ作ったか
プログラミングを始めてみたのでなにかアプリを作ってみたいなと思っていたタイミングで
[このスレ](http://hawk.5ch.net/test/read.cgi/livejupiter/1525968571/)を見て自分も欲しいし難易度もちょうどよさそうかなと思い作成してみようと思いました。
# 概要
pythonで15秒ごとにMLBの試合データを取得し、大谷選手が打席に立つか判別しFCMでプッシュ通知を送信しています。
pythonファイルはAmazonEC2においてcronを5分間隔で設定して実行するように設定しております。(forで15秒を20ループ=5分)
※15秒20ループですと最後の方のループで打席に立った判定が出た場合、大谷の打席が終わるより先に次の5分のcronがきて2度通知がいってしまっていました。20ループから60ループに変更しcronを15分間隔にすることで2度通知がいってしまう確率を下げました(for内の処理数が増えるので少し遅延が大きくなってしまうのであまりやりたくなかった)(7/9追記)

アプリの機能は現在
・プッシュ通知(打者時)
・本日行われる試合の開始時刻
・MLB At Bat/スポナビ一球速報アプリを開く
・大谷選手関連のニュースを表示(10/6追加)
となっております。
#使用したもの
Android Studio3.1.2
Amazon Web Service/AmazonEC2
Firebase/Cloud Messaging
Admob

#作成工程
##pythonで打席判別
まずはそもそも打席に大谷が立つかどうかを判別するプログラムが作れるかどうか、わからなかったのでできるのかどうか色々と考えてみることに

1.APIで簡単に求められるか
簡単にぱっと判別できるならそれに越したことはないのでMLB API やMLB LIVE APIなどいろいろとサーチしてAPIを探しました。が簡単に求められそうなものはなかった(とこの時は思いました)

2.yahooスポーツかMLB At Batのサイトをスクレイピング？
速報を行っているサイトからデータを得ればよいのでは？と考えデータの抽出方法を調べていたところスクレイピングにいきついたのですが、どうやら法に引っかかりそうだと気づき断念

3.APIを使って判別again
じゃあやっぱAPIしかないのかと再度探しまくりましたところ、
[MLBgameというAPI](http://panz.io/mlbgame/)が1番いけそうかなと(1でもたどり着いてはいました)思い、こちらからどうにかデータをとっていく方向で最終的にどうにかなりました。
###流れ
game.dayで"Angels"を含む試合を取得、gameidを取得
→gameidからplayer_stats取得
→home/away判別
→home or awayの出場選手データ取得
→大谷選手のplayer_idから打順を取り出す
→今現在の攻撃が表か裏か判別
→最新の打席結果が大谷選手の打順1個前の選手か否か判別

直接求められるもの/そうでないものありましたがなんとか打席に立つか判定できました

##pyfcmを使う
Androidでプッシュ通知を行うということで調べていったところFirebaseのCloud Messagingで実装するのがよさそうだとなりまして、どうやってpythonで処理するか調べましたところ
[pyfcm](https://pypi.org/project/pyfcm/)があると！
こちらapi_keyとmessage,topic_nameを入力すると簡単にプッシュ通知が送れるようになってるっぽいですね。楽に実装出来てありがたい限りです。
この処理をさっきの打席に立つか判定したあとに入れて打席に立つとプッシュ通知が行われるようにできました。

##Amazon Web Service(Amazon EC2)へ登録
サーバーどうしようかな……と思いましてレンタルサーバーだのいろいろ調べたんですが、無料(期間限定ですが)でcronいけそうなのはAWSかなーとなりましてこちらに登録。
インスタンス(t2.micro)を作成し、pyenv環境構築し、python3を使えるようになりました。
[参考にさせて頂きました](https://qiita.com/tisk_jdb/items/01bd6ef9209acc3a275f)
[参考にさせて頂きました](https://qiita.com/mogom625/items/b1b673f530a05ec6b423)

##crontab設定
結構手間取りました
[crontabの書き方](https://qiita.com/azusanakano/items/4448bf805f006acda907)
リンクばかりで恐縮ですが主に上記の記事を参考に設定しました。
最初はパスが通ってなくてmoduleがないよ！って怒られました()

##アプリを作っていく
サーバー側はだいたい終わったかなと思ったのでアプリの画面を作っていくことに
プッシュ通知の機能だけだったらなんも表示しなくてもいいんですが()それだと寂しいので
・速報アプリを開くボタン
・試合開始時刻と対戦相手の表示
・大谷に関するニュースのタイトルとリンク表示(未実装)→2018/10/06実装

あたりがいいかなと思い、とりあえず速報アプリ(MLB At Bat/スポナビ一球速報)を開くボタン実装(楽でした)

該当アプリをインストールしていない状態でボタンを押した場合の例外処理書いていなかったためにクラッシュしてしまう問題を解決しました('18/07/04追記)
[参照](https://teratail.com/questions/2267)

試合開始時刻と対戦相手ですが、スポナビの日程に日本時間が載ってるのでそちらを参照しました。がアプリでそちらを取得する処理が書けず(そもそもやっていいのかわからないので断念)、Google Spread Sheetに入力してそちらを取得しようかと思いましたがそれもうまくいかず(できるはずだとは思うのですが)onCreate内で結局配列に手入力でぶち込んで時間によって表示されるものを変えるという荒業に出てしまいました(なので現時点での日程にしか対応できていません)

~~またニュースについてはRSSのURLは[こちら](https://news.google.com/news/rss/headlines/section/q/%e5%a4%a7%e8%b0%b7%e7%bf%94%e5%b9%b3/%e5%a4%a7%e8%b0%b7%e7%bf%94%e5%b9%b3?ned=jp&hl=ja&gl=JP)でだいじょぶだと思うのですが、kotlinでどう処理すればよいかわからず未実装です。~~

~~本当はこれら問題を解決してからリリースしなければだとは思うのですが、大谷選手の復帰に間に合わせるためにこのまま突っ走ってしまいました。~~

※ニュースについて実装しました！ 2018/10/12追記

#作ってみての感想
実は作成しているときに大谷選手が右肘を故障してしまい、1度開発を中断しておりました。
その間簡単なアプリを作ってみて、大谷選手が復帰できそうだとなってから開発を再開したのですが、中断前と比べてかなり順調に開発できました。(簡単なものでステップアップしていけたからですかね)

今後としてはとりあえず未実装のニュース機能の実装を目指し、大谷選手が投手としても復帰した時には登板時に通知を送れる機能(オプション)も実装出来たらよいかなと思っております。

#あとがき
と書いている間に初の通知が＼( 'ω')／ウオオオオオアアアーーーッ！

ここまで読んでくださりありがとうございます。
かなり怪しいところが多いかと思いますのでご指摘、ご助言などコメントいただけると大変うれしく思います。


追記:Google Playのエンタメ部門急上昇ランキング6位になってました！(全体138位)
またQiitaのトレンドでも4位に入れていただいたみたいで嬉しい限りです！