COROS(カロス)トレーニングハブのデータをAPI経由で取得する
キプチョゲやキリアンが愛用しているスポーツウォッチ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
でコントロールします。
pageNumber
とtotalPage
が異なる場合は、GET
パラメーターのpageNumber
を調整して適宜、ページ送りしてください。
startDay/endDay
のGET
パラメーターにより、日付による範囲指定も可能です。
次の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