🧩

COROS(カロス)トレーニングハブのデータをAPI経由で取得する

2023/01/08に公開

キプチョゲやキリアンが愛用しているスポーツウォッチCOROS(カロス)は、計測したデータをダッシュボードTraining Hubから閲覧できます。

生成されたデータをシステマティックな取得したいことがありますが、残念ながら、Training Hubは公式なAPIが存在しません。

そのため、ブラウザ(アプリ)閲覧時と同じ仕組みを使い、COROS Training HubからAPIでデータをcURL/Python経由で取得する方法を紹介します。

前提

  • COROS Training Hubのアカウントを所持している
  • 2023/01/09時点の情報

APIの流れ

COROS Training HubのAPIは非常にシンプルです。

認証情報をもとにアクセストークンを取得し、アクセストークンとともにデータを要求するだけです。

アクセストークンを取得

アクセストークンを取得するには、以下のAPIを利用します。

リクエスト

POST:

Header:

  • content-type: application/json

Data:

  • {"account":"foo@example.com","accountType":2,"pwd":"YOUR_HASHED_PASSWORD"}'

ハッシュ化されたパスワードは、ChromeのDevToolsなどから、実際のリクエストをご確認ください。

レスポンス

{
  "apiCode": "XXXXXXXX",
  "data": {
    "accessToken": "YOUR_ACCESS_TOKEN",
    "birthday": 20000123,
    ...
    "runScoreList": [
      {
        "avgPace": 345,
    ...
  },
  "extend": {
    "grayHeaders": {}
  },
  "message": "OK",
  "result": "0000"
}

レスポンスの data -> accessToken からアクセストークンを取得できます。

cURL版

$ curl -D - 'https://teamapi.coros.com/account/login' \
  -H 'content-type: application/json' \
  --data-raw '{"account":"foo@example.com","accountType":2,"pwd":"YOUR_HASHED_PASSWORD"}'

Python版

import json
import requests

headers = {
    "content-type": "application/json",
}
payload = '{"account":"foo@example.com","accountType":2,"pwd":"YOUR_HASHED_PASSWORD"}'
URL_AUTH = "https://teamapi.coros.com/account/login"
res_auth = json.loads(requests.post(URL_AUTH, headers=headers, data=payload).text)
token = res_auth['data']['accessToken']

データを取得

認証APIで取得したアクセストークンをリクエストヘッダーに渡すと、データを取得できます。

例えば、ダッシュボードのActivity Listがあります。

このアクティビティ一覧を取得するには、以下のAPIを利用します。

リクエスト

GET :

Header :

  • content-type: application/json
  • accesstoken: YOUR_ACCESS_TOKEN

レスポンス

{
  "apiCode": "XXXXXXXX",
  "data": {
    "count": 14,
    "dataList": [
      {
        "adjustedPace": 583,
        "ascent": 446,
        "avg5x10s": 651,
        "avgCadence": 149,
        "avgHr": 134,
        "avgPower": 116,
        "avgSpeed": 651,
        ...
            ],
    "pageNumber": 1,
    "totalPage": 1
  },
  "message": "OK",
  "result": "0000"
}

data->count が対象データ数です。
1回あたりに返すデータ数は、リクエスト時のsizeでコントロールします。

pageNumbertotalPageが異なる場合は、GETパラメーターのpageNumberを調整して適宜、ページ送りしてください。

startDay/endDayGETパラメーターにより、日付による範囲指定も可能です。

次のGETパラメーターは、対象区間を2022年12月に限定する場合です。

?size=100&pageNumber=1&startDay=20221201&endDay=20221231&modeList=

cURL版

curl -D - 'https://teamapi.coros.com/activity/query?size=10&pageNumber=1&modeList=' \
  -H 'accept: application/json' \
  -H 'accesstoken: YOUR_ACCESS_TOKEN'

Python版

import json
import requests

headers = {
    "accesstoken": token,
    "content-type": "application/json",
}

URL_DATA = "https://teamapi.coros.com/activity/query?size=10&pageNumber=1&modeList="
res_data = json.loads(requests.get(URL_DATA, headers=headers).text)

for data in res_data['data']['dataList']:
    print(data)

一連の流れをまとめる

以上をまとめて、2022年12月分のアクティビティ一覧をCSV出力するには、以下の様にします。

実行結果です

date,name,sportType,totalTime,distance,calorie,trainingLoad
20221230,Foo Run,100,9538,14651.11,1266085,117
20221228,Bar Run,100,3844,5049.67,426847,35
20221227,Bar Bike,200,2831,14636.66,62314,420
20221224,Foo Run,100,2345,4002.47,288226,31
20221218,Baz,100,14696,24009.9,2135983,264
20221217,Tokyo Run,100,8091,17739.38,1331496,184
20221213,Foo Run,100,2991,6900.9,512450,71
20221212,Foo Run,100,2981,7309.62,534430,79
20221206,Indoor Run,101,2707,6830.0,377457,110
20221201,Indoor Run,101,3622,9130.0,555887,224

sportTypeはスポーツの種類です。

例えば

  • 100 : ランニング
  • 101 : トレッドミル
  • 200 : バイク

を表します。

Activity List以外のAPIも同様にして取得できます。

Discussion