スポーツログアプリのStravaからAPIでアクティビティデータを取得してみる

2021.05.05

ベルリンオフィスの小西です。

私の住んでいるドイツではロックダウンは続きつつも春がやってきて陽も長くなり、仕事後や週末によくロードバイクでサイクリングしています。

自転車の走行ログには Strava というアプリを使っていて、有料プランに契約するくらいハマっているのですが、今回はStrava APIを使ってアクティビティのデータ(走行ログ)を取得してみたいと思います。

Stravaとは

スポーツのアクティビティを記録するアプリです。

ジョギング、ウォーキング、サイクリング、水泳など多種多様なスポーツに対応していて、私は主にロードバイクでサイクリングルートの設定や、走行記録の分析で使っています。少なくとも自転車分野では現状世界一使われているアプリかと思います。

iOSアプリ単体でも記録はできますが、私はWahooというサイクルコンピューターと連携させてそちらでより正確なログをとってStravaに送っています。

有料プランでは過去のアクティビティの統計や分析が利用できるのですが、今回紹介するAPIを駆使すれば、年ごとの走行距離などある程度のデータは自分で整理することができそうなのでやってみます。

前提

Stravaに登録していて、いくつかアクティビティデータがあることが前提です。

プランは無料版で大丈夫です。

アクセストークンの準備

https://www.strava.com/settings/api にアクセスし、最初のアプリケーションを登録します。

  • [Website]はいったん適当で。
  • [Authorization Callback]はいったんlocalhostにしておいて、公開する時に本番ドメインを利用します。

strava mypage api screenshot

アイコン画像の登録が求められます。

strava mypage api screenshot

マイページからアクセストークンの取得

https://www.strava.com/settings/api

strava mypage api screenshot

API疏通確認

先ほど取得したアクセストークンを使ってcurlコマンドを実行します。

curl -X GET \
https://www.strava.com/api/v3/athlete \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN'

すると下記のようなユーザー情報が取得できます。

{"id":11877561,"username":"konishi_ryo","resource_state":2,"firstname":"Ryo","lastname":"Konishi","bio":"Japanese cyclist in Düsseldorf","city":"デュッセルドルフ","state":"ノルトライン・ヴェストファーレン州","country":"ドイツ","sex":"M","premium":true,"summit":true,"created_at":"2015-10-24T04:49:13Z","updated_at":"2021-05-03T18:15:48Z","badge_type_id":1,"weight":63.0,"profile_medium":"https://graph.facebook.com/775511522558533/picture?height=256\u0026width=256","profile":"https://graph.facebook.com/775511522558533/picture?height=256\u0026width=256","friend":null,"follower":null}%

OAUTHで認証

公式のインストラクションに沿って、OAUTHで認証します。

先述のMypageからクライアントIDを取得して、下記に挿入します。

http://www.strava.com/oauth/authorize?client_id=[YOUR_CLIENT_ID]&response_type=code&redirect_uri=http://localhost/exchange_token&approval_prompt=force&scope=activity:read

注意!

公式ドキュメントだとパラメータ scope=read となっているのですが、 このままだと肝心のアクティビティデータが取得できません。 scope=activity:read とすることで解決します。ここでけっこうハマった。。。

上記URLをブラウザで叩くと下記のページに遷移します。「アクティビティに関するデータを表示する」の選択肢が表示され、チェックが入っていればOKです。

strava mypage api screenshot

This site can’t be reachedみたいなエラーが出ると思いますが、それでOK!

strava mypage api screenshot

ブラウザのURL欄から、Authorizaiton code(code=パラメータから先)をコピーして、下記のコマンドの AUTHORIZATIONCODE に差し替えて実行してください。

curl -X POST https://www.strava.com/oauth/token \
	-F client_id=YOURCLIENTID \
	-F client_secret=YOURCLIENTSECRET \
	-F code=AUTHORIZATIONCODE \
	-F grant_type=authorization_code

client_id, client_secretはマイページから取得できます。日本語のStravaのマイページでは、[クライアントシート]となっていますが、これクライアントシークレットだと思います。

上記実行後、下記のレスポンスが返ってくればOK。

{"token_type":"Bearer","expires_at":1620163249,"expires_in":5278,"refresh_token":"XXXXXXXXXXXXXXXXXXXXXXXXX","access_token":"XXXXXXXXXXXXXXXXXXXXXXXXX","athlete":{"id":11877561,"username":"konishi_ryo","resource_state":2,"firstname":"Ryo","lastname":"Konishi","bio":"Japanese cyclist in Düsseldorf","city":"デュッセルドルフ","state":"ノルトライン・ヴェストファーレン州","country":"ドイツ","sex":"M","premium":true,"summit":true,"created_at":"2015-10-24T04:49:13Z","updated_at":"2021-05-03T18:15:48Z","badge_type_id":1,"weight":63.0,"profile_medium":"https://graph.facebook.com/775511522558533/picture?height=256\u0026width=256","profile":"https://graph.facebook.com/775511522558533/picture?height=256\u0026width=256","friend":null,"follower":null}}%

上記の中で access_token の値をコピーしておいてください。

APIを叩いてアクティビティデータの一覧を取得してみる

ではAPIを叩いてデータを取得してみましょう。

APIガイドはここにまとまっています。

下記のコマンドでアクティビティの一覧が取得できます。

curl -X GET \
https://www.strava.com/api/v3/athlete/activities \
-H 'Authorization: Bearer ACCESS_TOKEN'

上記を叩いて、直近30件のアクティビティデータがjsonで返ってくれば成功です!

[{"resource_state":2,"athlete":{"id":11877561,"resource_state...

長いので端折りますが、走行距離、日時、平均&最高速度などアプリ上から確認できるデータはあらかた揃っていました(もちろん走行時にアプリやサイクルコンピューターでデータが取れていることが前提です)。

また上記のコマンドを見ていただくとわかると思いますが、他人のデータは取れません。あくまで自分のアクティビティデータを取得して楽しむためのものです。同じクラブの人のデータを集約できたりすれば面白そうですが。

さいごに

Strava APIのドキュメントはちょっと素っ気ない感じで、これだけ人気のアプリなのにあまりユースケースも見当たらないのが残念ですが、アクティビティに対するコメントやKudos(いいね!みたいなもの)の取得、アクティビティの新規作成もできたりします。

次回の記事ではアプリで今年走った距離を取得・表示してみようと思います。自分のブログに走行距離などを表示してモチベーション維持にいいかなぁと思っています。

今年の目標は自転車で2,000km走ること!

参考情報

https://developers.strava.com/docs/reference/