Swim.com 活用のすすめ
自分以外に使っている人を見たことないですが、Swim.com というスイマー用の SNS があります。
この SNS は、泳いだ距離や速さを自動的に記録できるスイムウォッチや、Swim.com アプリが動くスマートウォッチに対応しており、スイマー同士でスコアを競えるようになってます(参考:Swim.com に対応したスイムウォッチ一覧)。まあ、SNS ですけど、自分のデータをアップロードして、確認するためだけにも使えます。
僕は、去年の9月までは Pebble Time で水泳データを記録していたのですが、10月以降はより高機能な Garmin Swim というスイムウォッチに乗り換えました。Garmin Swim のデータは Garmin Connect というサイトで確認できるのですが、以前のタイムとも比較したいので、Garmin Connect のデータを Swim.com にも連携させています。
図にすると、以下のような感じです。
このように連携させることで、以下の Workout 画面(https://www.swim.com/my-workouts/)で、Pebble Time の測定値と Garmin Swim の測定値を一覧できます。
今回の目的
Swim.com で一覧表示はできるんですが、1回あたりに泳いだ距離や、泳ぐペースの変化をグラフ表示するような機能はありません。また、Garmin Connect には CSV エクスポート機能があるのですが、Swim.com の方には CSV エクスポート機能も API もなんにもありません。厳しい……。
異なるスイムウォッチで測定した結果をなんとかグラフ化したいと思い、Workout 画面のデータをエクスポートする処理を実装しました。
採用した方法:JSON を手作業でテキストファイルに貼り付けて、Ruby のスクリプトで CSV に変換
色々試したのですが、Swim.com はログイン機能が特殊で、単にユーザ名とパスワードを POST するだけではログインできそうになかったので、自動化は早々に諦めました。厳しい……。
その一方で、一度ログインしてしまえば、Workout 画面の情報は GET で簡単に取得できることがわかりました。Workout 画面は最新の10件のデータを表示し、ページの末尾に到達すると次の10件を読み込むのですが、内部的には以下の URL に GET でアクセスしていました。
https://www.swim.com/workout/listing/search?pageIndex=1&pageSize=10&orderBy=workoutdate&orderDir=DESC&_=1461254054552
ざっと試した感じでは、この pageSize を 10 から 1000 に変えれば 1000 件取得できるし、orderDir を DESC から ASC に変えれば昇順に取得できるみたいです。やさしい……。
というわけで、こんな手順でエクスポートすることにしました。
- Web ブラウザで Swim.com にログインする
- Web ブラウザで https://www.swim.com/workout/listing/search?pageIndex=1&pageSize=1000&orderBy=workoutdate&orderDir=ASC にアクセスする
- 2 で表示された JSON を swim_com.json にコピペする
- swim_com.json と同じディレクトリに swim_com_parser.rb を置いて、
ruby swim_com_parser.rb
を実行する - パース結果が swim_com.csv に出力されるので、このファイルをよしなにする
swim_com_parser.rb は Gist で公開しておきました。ご参考ください。
JSON Parser for swim.com workout data