作ったもの
- リングフィットアドベンチャーの運動ログ(活動時間,消費カロリー,走行距離)をPixelaに記録して草化する機能をサーバーレスで開発
- Switch上でスクショを撮りTwitter投稿すると,画像取得・解析してPixelaのグラフに記録
結果
- 最近のサボりが可視化された💪
- トリガになるツイートは↓な感じ
#リングフィットアドベンチャー #RingFitAdventure #NintendoSwitch pic.twitter.com/ZnoWCO30No
— JagiJagiJagi (@jagijagijag1) January 25, 2020
制約
- 下記画像のような日毎の運動ログ画面から
活動時間
,消費カロリー
,走行距離
を抽出することのみが対象- その他画面のスクショや個別運動ログは対象外
- その他画面のスクショや個別運動ログは対象外
- TwitterのツイートページのHTMLを解析するため,ページの仕様が変わると実行不可
- まれにAWS Rekognitionが
0
をo
と判定し,Pixelaへの記録時にエラーが発生する (数値しかありえないので無理やり補正できなくもないが未実施)
全体方針
- リングフィットの記録はAPIで取得したりはできないので,スクショから情報引っこ抜くしかない(と思われる)
- 頑張り度と継続度がみたいので,ライフログを色々記録しているPixelaで可視化
Switchスクショ取得方針
- Switchのスクショを自動でクラウドストレージに持っていく手段がない
- SDカードを経由する方法だとバッチ的になる & 怠惰なので続かなそう…
- Swithcでスクショ投稿はできるので,Twitterにあげてそこから自動でごにょごにょする方針に → サービス連携として手軽なIFTTTを使って特定のハッシュタグ付きTwitter投稿を自動取得 -> 後続処理のAPIを叩くレシピは後述
スクショからの情報抽出
GarminストレスのときはAWS Rekognitionを使ったが,日本語テキスト検出未対応
そのためGoogle CloudのVision APIを利用する方針で検討,デモ試して行けそう
と思ったが,日付と活動量の数値だけ取るならRekognitionでもできそうなので,慣れているAWSを使う方針に,こっちでも行けそう (↓だけ見ると日本語も取れてるように見えるけど日本語部分は英数字の羅列として結果が返ってくる)
その他つまづきなど
- IFTTTで取得できるリンクは画像自体のリンクでなく画像ツイートページのリンクなので,IFTTTからAPI(Lambda)に渡されるリンクから画像リンクを探し出すはめに…
- Integromatだとツイートの画像リンク取得までできるっぽい
- 日付について,スクショからは月と日(
mm/dd
)しか取れないため,とりあえず処理実行時の年を付与し,それが未来の日付の場合は年を1年前の日付で記録するよう実装- e.g.
01/23
->20200123
,10/23
->20191023
(20201023
は未来なので)
- e.g.
- ツイートページから画像URLを引っこ抜く実装にしたことにより,複数画像のまとめて投稿にも対応可能に
- ただし画像が多いとIFTTTのWebhookの待ち時間を超過するっぽく,IFTTT上は失敗扱いに (Lambdaは正常終了しPixelaにも記録される)
実装内容
環境
- Go 1.13.6
- Serverless Framework 1.61.3
Lambda function (画像取得・情報抽出・グラフ記録)
- IFTTTのレシピ作成時に,Lambda関数を実行するAPI GatewayのエンドポイントURLが必要になるため先にこちら側を実装
- Serverless Frameworkを用いてGoで実装したLambda関数 + API Gatewayをデプロイ
- 詳細はコード参照,概要は以下
- IFTTTから送られてきたツイートのURLを入力に,画像URLを引っこ抜き,Rekognitionでのテキスト検知結果を受け,Pixelaに記録する
- 入力のURLをHTML解析して画像URLを抽出し,画像URLから画像データを取得し,Rekognitionにわたす
- 記録したい情報は,その情報があるであろう座標をあらかじめ与えておき,Rekognitionの結果のうち想定座標に対して最近傍のテキストを利用
- IFTTTから送られてきたツイートのURLを入力に,画像URLを引っこ抜き,Rekognitionでのテキスト検知結果を受け,Pixelaに記録する
IFTTT: Twitter → Webhook (API Gateway)
- IFTTで下記レシピで作成する
- ここではハッシュタグ
#RingFitAdventure
のあるツイートを対象に (任意のハッシュタグでOK) URL
欄にはデプロイしたAPI Gatewayのエンドポイント(=make deploy
した際の出力のServiceEndpoint
)に/ringfit2pixela
などのパスをくっつけたURLを設定
- ここではハッシュタグ
- 下記レシピ作成後,Nintendo Switch内でTwitter投稿すればPixelaに記録されるはず
- ただしIFTTTの実行が結構遅い (10〜20分くらいかかる)