Moves APIでwebサービスを作りたい全ての人に向けて書きました
- 2014.06.29(Sun) 09:00
- WEB制作
持ってるだけで、歩数や距離、消費カロリーなんかを計算してくれる次世代健康管理アプリの「Moves」。今じゃすっかり有名になってFacebookに買収されちゃいましたが、登場当時は感動したのを覚えています。
MovesのAPIを使って、何か面白いwebサービスを作りませんか?ブログにMovesの記録を自動で掲載してみたくありませんか?MovesのAPIでプログラムを開発する人たちの「嫁」みたいな存在になれることを目指して、Moves APIの使い方をまとめました。
Moves for Developers Moves
目次
1アプリケーションを登録する
MovesのAPIを利用するためには、Movesに対して「このプログラム(〜.php)があなたのAPIを利用しますよ」と申請する必要があります。それが「アプリケーション登録」です。
1-1アカウントを取得する
MovesのAPIを利用するのに、開発者は「Googleのアカウント」でログインする必要があります。もし、Googleのアカウントを持っていない人は、下記で取得して下さい。
Google アカウントの作成 Google
1-2アプリケーションを登録する
アプリケーションを登録するには、下記のページにアクセスします。まだの場合は、ログインが求められますので、Googleのアカウントでログインして下さいね!
Manage Your Apps Moves
Manage Your Apps
「Manage Your Apps」の画面には、登録したアプリケーションが表示されます。まだ登録していないので、何もありませんよね。「Create a New App」をクリックして、アプリの登録を始めましょう!
Create a New App
はじめに入力するのは「アプリ名(Application name)」と「開発者名(Developer)」です。お試し段階なのでアプリ名は「Test」で大丈夫です。また、開発者名に関しては、フルネームが気が引けるならニックネームでいいと思います。サンプル画像はクリックで拡大表示できます。
1-3クライアントID、シークレットを確認する
登録が完了すると、上記図の画面に移動します。上部にあるタブの内、「Development」を選択すると「Client ID」と「Client secret」を確認することができます。この2つは、あなたのアプリを表す識別キーなので、他人に知られないように管理して下さい。「Reset Secret」をクリックすれば、クライアントシークレットを変更することができます。
1-4Redirect URIを登録する
また、重要なのが「Redirect URI」の設定です。後ほど、アプリ認証を行なうためにPHPプログラムを作成するのですが、そのファイルの設置先となるURLを入力して下さい。ユーザーはこのURLにアクセスして、アプリ認証を行なうことになります。
URIを入力し、「Save Changes」をクリックすると登録することができます。上記のメッセージ(Redirect URI(s) updated)が出れば成功です。
1-5アプリケーション登録に関するその他の情報
多人数向けではなく個人的にMoves APIを利用する分には、調整する必要のない他の項目を一応、紹介しておきます。
Images
「Image」のタブを開くと、アプリのアイコン(512x512のPNG限定)と、スクリーンショット(PNG限定)を登録することができます。APIを利用して作成したwebサービスを本格的に公開する場合のみ、こちらから登録して下さい。
Info
「info」のタブを開くと、概要や、webサイトのURL、iTuneのidなどといった、アプリの詳細情報を登録することができます。作成したプログラムを公開しないのであれば、登録する必要はありません。
2クライアントID、シークレットを使ってOAuth認証をする
それでは、Movesに保存されているユーザーの個人的なデータを利用するために、そのユーザーの「アクセストークン」を取得しましょう。「アクセストークン」を取得するには、アプリ認証をする必要があります。MovesはOAuth2.0という認証形式を採用しています。
OAuth 2.0 OAuth
2-1Movesのアプリ認証について
例えばTwitterやFacebookなどでは、アプリ認証をする時、ユーザーが「アプリを認証する」というボタンをクリックすれば、それで完了でした。しかし、Movesの場合はそれだけではなく、「スマホでMovesを起動し、指定されたPINコードを入力する」という作業を行なう必要があります。
これからアプリ認証のサンプルプログラムを通して、一緒に見ていきましょう。なお、アプリ認証に関する公式ドキュメントは下記のページで確認することができます。
Authentication and Authorization Moves for Developers
2-2MovesでOAuth認証をするPHPのサンプルプログラム
下記が、Movesでアプリ認証を行なうためのサンプルプログラムです。$client_id、$client_secret、$redirect_uriをそれぞれ設定して下さい。$redirect_uriにはこのプログラムのURLを指定します。こちらはアプリ登録の際に設定した「Redirect URI」と一致している必要があります。
$scopeにはパーミッションを設定します。Movesの場合、「activity」「location」の2種類のパーミッションがあります。「activity」は運動データ、「location」は位置データを取得する権限です。両方指定する場合は、半角スペースで区切って下さい。
<?php
//リダイレクトURI (このプログラムを設置したURL)
$redirect_uri = 'http://syncer.jp/oauth.php';
//クライアントID、クライアントシークレット
$client_id = 'Cn7do2McmeGIvoBmJ72XNM7C5Nq8017B';
$client_secret = 'Iz6_JvIdAd0MNhoDeIMiX_dEQk6w6VP3uI1537OR7OSRrA125FXSDuovNiyjQq35';
//アプリの権限 (半角スペースで区切る)
$scope = 'activity location';
//アプリ認証画面へ移動
if(!isset($_GET['code']) || empty($_GET['code'])){
header("Location: https://api.moves-app.com/oauth/v1/authorize?response_type=code&client_id={$client_id}&scope=".rawurlencode($scope));
exit;
}
//ユーザーがPINコードを入力後
$obj = json_decode(@file_get_contents(
'https://api.moves-app.com/oauth/v1/access_token',
false,
stream_context_create(
array('http' => array(
'method' => 'POST',
'content' => http_build_query(array(
'grant_type' => 'authorization_code',
'code' => $_GET['code'],
'client_id' => $client_id,
'client_secret' => $client_secret,
'redirect_uri' => $redirect_uri,
)),
))
)
));
//アクセストークンを[$access_token]に格納
$access_token = $obj->access_token;
//リフレッシュトークンを[$refresh_token]に格納
$refresh_token = $obj->refresh_token;
//ブラウザに出力
echo "あなたのアクセストークンは{$access_token}です!
あなたのリフレッシュトークンは{$refresh_token}です!
";
2-3Movesアプリを起動してのPINコードの入力作業
準備が整ったら、先ほどのサンプルプログラムを起動して下さい。
PINコードの発行
問題がなければ、上記の画面が表示されるはずです。青い枠で囲んである6180 3228の部分がPINコードにあたります。ユーザーはこの画面を確認後、スマホでアプリを起動し、このPINコードを入力します。
Optionを開く
Movesを起動すると、画面右下に「M」というボタンがあり、タップすると上記図のようなオプションが表示されます。そのうち、「接続されているアプリ」をタップして下さい。
PINの入力画面に移動する
画面右上にある「Enter PIN」のボタンをタップして、PINコードの入力画面に移動します。
フォームにPINコードを入力する
PINコードの入力フォームが現れるので、先ほど画面に表示されていた「PINコード」を入力します。なお、半角スペースは省略してかまいません。
アプリ連携を許可する
ここで初めて、ユーザーは「アプリの認証」を行ないます。アプリがデータにアクセスするのを許可する場合、「Allow」をタップします。これで、PINコードの入力作業が完了します。
2-4アクセストークンとリフレッシュトークンを確認する
ユーザーがスマホのMovesアプリ上で連携を許可すると、先ほど、PINコードを表示していた画面が、$redirect_uriで設定したURLに移動し、アクセストークンとリフレッシュトークンが表示されます。この2つのキーを誰にも知らないよう、管理(メモ)して下さい。
リフレッシュトークンに関しては、「アクセストークンの有効期限切れ対策」の項で説明するので、今は保存だけしておいて下さい。ユーザー向けに、Moves APIを利用したサービスを提供するには、「PINコードの入力方法」の案内だったり、この2つのキーをデータベースに保存するシステム作りが必要になってきますねー。
3ユーザーのサマリーを取得してみよう!
前章では「アクセストークン」を取得しました。これらを使って、この章からはユーザーの様々なデータを取得していきましょう。まずはユーザーのサマリーデータを取得します。公式ドキュメントは下記ページをご覧下さい。
Daily summaries Moves for Developers
3-1Summariesのリクエスト方法
Summariesのデータを取得するためには、それぞれの指定されたURLに、GETメソッドでリクエストを送ります。なお、どのリクエストも、パラメータにaccess_tokenというプロパティ名で、アクセストークンを付与する必要があります。アプリのパーミッションで「activity」を指定している必要があります。
[GET] https://api.moves-app.com/api/1.1/user/summary/...
データを取得する期間の調整
どの期間のサマリーデータを取得するかを、URLの組み立て方によって調整することができます。
| 期間 | リクエストURL |
|---|---|
| 1日 | ...daily/{YYYYMMDD}
[例] 2014年1月2日 … 20140102 |
| 1週 | ...daily/{YYYY-Www}
[例] 2014年の12週目 … 2014W12 |
| 1月 | ...daily/{YYYYMM}
[例] 2014年1月 … 201401 |
| 期間指定 | ...daily?from={YYYYMM}&to={YYYYMM}
[例] 2014/1/10〜1/25 … from=20140110&to=20140125 ※最大31日間まで指定可 |
| 過去〜日間 | ...daily?pastDays={日数}
[例] 過去7日間 … 7 ※最大31日間まで指定可 |
取得できるJSONデータ
Summariesでは下記のJSONデータを取得できます。1日ごとのデータが配列形式で含まれています。また、それぞれの日ごとの「歩き(walking)」「走り(run)」「サイクリング(cycling)」といったカテゴリ別のデータが、summaryの中に配列方式で格納されています。主要なデータに青文字でコメントを付けてあります。
[
{
"date": "20140625", //日付
"summary": [
{
"activity": "cycling", //運動項目
"group": "cycling", //運動カテゴリ
"duration": 3320, //時間(秒)
"distance": 10958, //距離(メートル)
"calories": 293 //カロリー
},
{
"activity": "walking_on_treadmill",
"group": "walking",
"duration": 3411,
"distance": 4207,
"steps": 6800, //歩数
"calories": 244
},
{
"activity": "transport",
"group": "transport",
"duration": 585,
"distance": 946
}
],
"caloriesIdle": 1674,
"lastUpdate": "20140626T152106Z"
},
{
"date": "20140626",
"summary": [
...
],
...
},
...
]
運動カテゴリの種類
JSONデータ内ではgroupに格納される、運動カテゴリの種類は下記の通りです。運動項目の種類については、「運動項目のデータを取得する」をご参考下さい!
| データ | 解説 |
|---|---|
| walking | ウォーキング |
| running | ランニング |
| cycling | サイクリング |
| transport | 交通機関(電車、車など) |
3-21日のサマリーデータを取得するPHPのサンプルプログラム
それでは、早速1日分のサマリーデータを取得してみましょう。例えば、2014年6月10日のサマリーデータを取得するためには、URLを次のように組み立てます。
[GET] https://api.moves-app.com/api/1.1/user/summary/daily/20140610?access_token={アクセストークン}
取得するためのサンプルプログラムが、下記の通りです。
<?php
//リクエストURL
$request_url = 'https://api.moves-app.com/api/1.1/user/summary/daily/20140610';
//アクセストークン
$access_token = 'Bmj4T5XE2hrb9Mrp364XedfVG70GnM7Pbl1krXr3Fkq97ZrEOvIqTyE3MbFp2KdZ';
//リクエストURLにアクセストークンを結合
$is_param = explode('?',$request_url);
$request_url .= (isset($is_param[1]) && !empty($is_param[1])) ? '&access_token='.$access_token : '?access_token='.$access_token;
//JSONデータを取得し、オブジェクト形式に変換
$obj = json_decode(@file_get_contents($request_url));
//取得したデータを展開
echo "<h1>指定期間のデータ</h1>";
foreach($obj as $item){
//1日ごとのサマリーを解析
echo "<h2>{$item->date}</h2>";
foreach($item->summary as $summary){
//運動項目
$value = $summary->activity;
//運動カテゴリ
$category = $summary->group;
//時間(秒)
$duration = $summary->duration;
//距離(メートル)
$distance = $summary->distance;
//カロリー(kcal)
$cal = (isset($summary->calories)) ? $summary->calories : '-';
//歩数
$steps = (isset($summary->steps)) ? $summary->steps : '-';
//出力
echo "<p>項目:{$value}<br/>カテゴリ : {$category}<br/>時間 : {$duration}<br/>距離 : {$distance}<br/>カロリー : {$cal}<br/>歩数 : {$steps}<br/></p>";
}
}
プログラムの実行結果
プログラムを実行すると、上記の図のように、指定した日の運動データが一覧で簡易表示されます。右下の画像はスマホのMovesアプリの画面を合成したものです。実際のMovesアプリ上のデータと合っているか比較してみて下さいね!画像はクリックで拡大できます。
4ユーザーのアクティビティを取得してみよう!
前章では「サマリーデータ」を取得しました。サマリーデータはその名の通り、概要(まとめ)でしかありません。アクティビティAPIでは、運動に関するさらに細かいデータを取得することが可能です。公式ドキュメントは下記ページをご覧下さい。
Daily activities Moves for Developers
4-1Activitiesのリクエスト方法
Activitiesのデータを取得するためには、それぞれの指定されたURLに、GETメソッドでリクエストを送ります。全てのリクエストのパラメータにはaccess_tokenのプロパティ名で、アクセストークンを付与して下さい。また、アプリのパーミッションで「activity」を指定している必要があります。
[GET] https://api.moves-app.com/api/1.1/user/activities/...
データを取得する期間の調整
どの期間のアクティビティデータを取得するかを、URLの組み立て方によって調整することができます。これらは「サマリーデータ」の時と全く一緒です。
| 期間 | リクエストURL |
|---|---|
| 1日 | ...daily/{YYYYMMDD}
[例] 2014年1月2日 … 20140102 |
| 1週 | ...daily/{YYYY-Www}
[例] 2014年の12週目 … 2014W12 |
| 1月 | ...daily/{YYYYMM}
[例] 2014年1月 … 201401 |
| 期間指定 | ...daily?from={YYYYMM}&to={YYYYMM}
[例] 2014/3/2〜4/1 … from=20140302&to=20140401 ※最大31日間まで指定可 |
| 過去〜日間 | ...daily?pastDays={日数}
[例] 過去7日間 … 7 ※最大31日間まで指定可 |
取得できるJSONデータ
取得できるJSONデータは下記の通りです。summary内にはSummariesで取得できるものと同じJSONデータが含まれています。segmentsには、その日のセグメントが配列形式で、それぞれのセグメント内のactivitiesには、セグメントごとの運動内容が配列形式で含まれます。
[
{
"date": "20140625",
"summary": [ //Summariesと同様
...
],
"segments": [ //セグメント
{
"type": "move", //セグメントの種類
"startTime": "20140625T032544+0900", //セグメントの開始時間
"endTime": "20140625T034815+0900", //セグメントの終了時間
"activities": [ //運動内容
{
"activity": "cycling",
"group": "cycling",
"manual": false, //マニュアルで追加された運動か
"startTime": "20140625T032544+0900",
"endTime": "20140625T034815+0900",
"duration": 1351,
"distance": 4274,
"calories": 115
}
],
"lastUpdate": "20140625T082952Z"
},
{
"type": "place", //セグメントの種類
"startTime": "20140625T034815+0900",
"endTime": "20140625T035114+0900",
"activities": [
{
"activity": "walking",
...
}
],
"lastUpdate": "20140625T082952Z"
},
{
"type": "move", //セグメントの種類
...
},
{
"type": "place", //セグメントの種類
...
},
...
],
"caloriesIdle": 1674,
"lastUpdate": "20140626T152106Z"
}
]
セグメントとは…?
テキストだけだとピンときませんよね…?「セグメント」とは、上記図の区切りのことです。図では上から「自転車(移動)」「ラーメン店(場所)」「自転車(移動)」となっていますよね?この「移動」「場所」「移動」が、それぞれ1まとまりのデータとして、segments内に配列形式で含まれているというわけです。
「移動」はmove、「場所」はplaceとして、typeプロパティに格納されています。青文字コメントで「セグメントの種類」と付けている部分です。そして、それぞれのセグメント内の運動データが、activities内に、格納されています。
4-21日のアクティビティデータを取得するPHPのサンプルプログラム
それでは、1日分のアクティビティデータを取得してみましょう。例えば、2014年6月25日のアクティビティデータを取得するためには、URLを次のように組み立てます。
[GET] https://api.moves-app.com/api/1.1/user/activities/daily/20140625?access_token={アクセストークン}
取得するためのサンプルプログラムが、下記の通りです。$request_urlと$access_tokenは自身の環境に合わせて調整して下さいね!
<?php
//リクエストURLとアクセストークン
$request_url = 'https://api.moves-app.com/api/1.1/user/activities/daily/20140625';
$access_token = 'TZ2A8neY7upM944UW6G74LRYDRBsYvxbs_9MYvE9d7e8W1q9zKO2e8alSMrK_v58';
//リクエストURLにアクセストークンを結合
$is_param = explode('?',$request_url);
$request_url .= (isset($is_param[1]) && !empty($is_param[1])) ? '&access_token='.$access_token : '?access_token='.$access_token;
//JSONデータを取得し、オブジェクト形式に変換
$obj = json_decode(@file_get_contents($request_url));
//取得したデータを整理
echo "<h1>指定期間のデータ</h1>";
foreach($obj as $segments){
echo "<h2>{$segments->date}</h2>";
foreach($segments->segments as $item){
//セグメントの種類
$segment = $item->type;
//セグメントの開始時間と終了時間(ついでに整形)
$start = date('H:i',strtotime($item->startTime));
$end = date('H:i',strtotime($item->endTime));
//出力
echo "<h3>[{$segment}] {$start}〜{$end}</h3>";
//運動内容の解析
foreach($item->activities as $sub_item){
//運動項目
$value = $sub_item->activity;
//運動カテゴリ
$category = $sub_item->group;
//時間(秒)
$duration = $sub_item->duration;
//距離(メートル)
$distance = $sub_item->distance;
//カロリー(kcal)
$cal = (isset($sub_item->calories)) ? $sub_item->calories : '-';
//歩数
$steps = (isset($sub_item->steps)) ? $sub_item->steps : '-';
//出力
echo "<p>項目:{$value}<br/>カテゴリ : {$category}<br/>時間 : {$duration}<br/>距離 : {$distance}<br/>カロリー : {$cal}<br/>歩数 : {$steps}<br/></p>";
}
}
}
プログラムの実行結果
プログラムを実行すると、ブラウザに指定した日のアクティビティデータが表示されます。右側はMovesアプリの該当部分の画面を合成したものです。実際にデータを見比べてみると、感覚が掴みやすいと思います。画像はクリックすると拡大できます。
5ユーザーの滞在記録(プレイス)を取得してみよう!
前章では「アクティビティデータ」を取得しました。今度は運動データではなく、「場所」のデータを取得してみましょう。Movesに記録された「ユーザーが滞在した場所」のデータを取得できるのが、この章で紹介するPlaces APIです。
Daily places Moves for Developers
5-1Placesのリクエスト方法
Activitiesのデータを取得するためには、それぞれの指定されたURLに、GETメソッドでリクエストを送ります。全てのリクエストのパラメータにはaccess_tokenのプロパティ名で、アクセストークンを付与して下さい。アプリのパーミッションで「location」を指定している必要があります。
[GET] https://api.moves-app.com/api/1.1/user/places/...
指定できるパラメータ
どの期間の場所データを取得するか、URLの組み立て方によって調整することができます。これらは「サマリーデータ」「アクティビティデータ」の時と全く一緒です。
| 期間 | リクエストURL |
|---|---|
| 1日 | ...daily/{YYYYMMDD}
[例] 2014年1月2日 … 20140102 |
| 1週 | ...daily/{YYYY-Www}
[例] 2014年の12週目 … 2014W12 |
| 1月 | ...daily/{YYYYMM}
[例] 2014年1月 … 201401 |
| 期間指定 | ...daily?from={YYYYMM}&to={YYYYMM}
[例] 2014/7/2〜7/20 … from=20140702&to=20140720 ※最大31日間まで指定可 |
| 過去〜日間 | ...daily?pastDays={日数}
[例] 過去7日間 … 7 ※最大31日間まで指定可 |
取得できるJSONデータ
リクエストによって取得できるJSONデータを見てみましょう。このように、指定した期間に滞在した場所のリストがsegments内に配列形式で格納されます。場所の緯度・経度も取得できるので、Google Maps APIなどを使えば、地図を描写することが可能ですねー。
[
{
"date": "20140626",
"segments": [
{
"type": "place",
"startTime": "20140626T020401+0900", //滞在開始時間
"endTime": "20140626T020651+0900", //滞在終了時間
"place": {
"id": 192729813,
"name": "魂のチャーシュー麺 麺処 清水", //場所名
"type": "foursquare",
"foursquareId": "51824568498ea1d79f1fcdf2", //foursquare ID
"foursquareCategoryIds": [
"4bf58dd8d48988d1d1941735"
],
"location": {
"lat": 35.789234360168, //緯度
"lon": 139.79790515057 //経度
}
},
"lastUpdate": "20140626T152114Z"
},
...
],
"lastUpdate": "20140626T231227Z"
}
]
Movesでは場所名を、foursquareと連動して登録することができます。その場合、foursquare上の場所IDも記録されるため、foursquareのAPIと連携すれば、写真やクチコミなど、さらに詳しい情報と関連付けることが可能です。例えば、サンプルのfoursquare IDの51824568498ea1d79f1fcdf2を利用して、foursquareのパーマリンクを、次の通り組み立てることができます。
https://ja.foursquare.com/v/51824568498ea1d79f1fcdf2 [リンク]
場所タイプの種類
JSONデータ内ではtypeに格納される、場所タイプの種類は下記の通りです。
| データ | 解説 |
|---|---|
| unknown | 名前未登録 |
| home | 「自宅」の設定 |
| school | 「学校」の設定 |
| work | 「勤務地」の設定 |
| user | マニュアルで名前を登録 |
| foursquare | foursquareで名前を登録 |
5-21日の滞在記録(プレイス)データを取得するPHPのサンプルプログラム
それでは、1日分の滞在記録データを取得してみましょう。例えば、2014年6月26日のデータを取得するためには、URLを次のように組み立てます。
[GET] https://api.moves-app.com/api/1.1/user/places/daily/20140626?access_token={アクセストークン}
取得するためのサンプルプログラムが、下記の通りです。$request_urlと$access_tokenは自身の環境に合わせて調整して下さいね!
<?php
//リクエストURLとアクセストークン
$request_url = 'https://api.moves-app.com/api/1.1/user/places/daily/20140626';
$access_token = 'TZ2A8neY7upM944UW6G74LRYDRBsYvxbs_9MYvE9d7e8W1q9zKO2e8alSMrK_v58';
//リクエストURLにアクセストークンを結合
$is_param = explode('?',$request_url);
$request_url .= (isset($is_param[1]) && !empty($is_param[1])) ? '&access_token='.$access_token : '?access_token='.$access_token;
//JSONデータを取得し、オブジェクト形式に変換
$obj = json_decode(@file_get_contents($request_url));
//取得したデータを整理
echo "<h1>指定期間のデータ</h1>";
foreach($obj as $segments){
echo "<h2>{$segments->date}</h2>";
foreach($segments->segments as $item){
//滞在場所の開始時間と終了時間(ついでに整形)
$start = date('Y/m/d H:i',strtotime($item->startTime));
$end = date('Y/m/d H:i',strtotime($item->endTime));
//場所名
$name = (isset($item->place->name) && !empty($item->place->name)) ? $item->place->name : '不明';
//場所タイプ
$type = $item->place->type;
//緯度と経度
$lat = $item->place->location->lat;
$lon = $item->place->location->lon;
//出力
echo "<h3>{$start}〜{$end}</h3><p>場所名 : {$name}<br/>場所タイプ : {$type}<br/>緯度 : {$lat}<br/>経度 : {$lon}</p>";
}
}
プログラムの実行結果
プログラムを実行すると、ブラウザに指定した日の滞在(プレイス)データが表示されます。Movesアプリの画面を右側に合成してあるので、見比べてみて下さいね。画像はクリックすると拡大できます。ちなみに「HOME(自宅)」の緯度・経度にはモザイクかけてます…。
6ユーザーのストーリーラインを取得してみよう!
これまで、「サマリー(概要)」「アクティビティ(運動)」「プレイス(場所)」と、取得してきました。続いてこの章では、それらを総合した「ストーリーライン」の取得方法を紹介します。
Daily storyline Moves for Developers
6-1Storylineのリクエスト方法
Storylineのデータを取得するためには、それぞれの指定されたURLに、GETメソッドでリクエストを送ります。全てのリクエストのパラメータにはaccess_tokenのプロパティ名で、アクセストークンを付与して下さい。アプリのパーミッションで「activity」「location」の両方を指定している必要があります。
[GET] https://api.moves-app.com/api/1.1/user/storyline/...
期間をURLで指定する
どの期間のストーリーラインを取得するかを、URLの組み立て方によって調整することが可能です。これらは「サマリーデータ」「アクティビティデータ」「プレイスデータ」の時と一緒ですが、取得できる日数は最大7日間となっています。
| 期間 | リクエストURL |
|---|---|
| 1日 | ...daily/{YYYYMMDD}
[例] 2014年1月2日 … 20140102 |
| 1週 | ...daily/{YYYY-Www}
[例] 2014年の12週目 … 2014W12 |
| 1月 | ...daily/{YYYYMM}
[例] 2014年1月 … 201401 |
| 期間指定 | ...daily?from={YYYYMM}&to={YYYYMM}
[例] 2014/2/10〜2/16 … from=20140210&to=20140216 ※最大7日間まで指定可 |
| 過去〜日間 | ...daily?pastDays={日数}
[例] 過去3日間 … 3 ※最大7日間まで指定可 |
「トラックポイント」を取得する
Storylineでは「トラックポイント」を取得することができます。このトラックポイントとは「移動した際に通った全ての座標(緯度・経度)」です。それらの座標を全て繋ぎ合わせることによって、図のように地図上にラインを作成したりすることができます。
トラックポイントをJSONデータに含めるには、下記のパラメータをリクエストURLに追加します。膨大なデータ量になるのでご注意下さい。
trackPoints=true
取得できるJSONデータ
リクエストによって取得できるJSONデータを見てみましょう。Storylineは、「サマリー」「アクティビティ」「プレイス」を全て混ぜ合わせたJSONデータになっています。オプションで「トラックポイント」を有効にした場合、それに加えてactivitiesの中にtrackPointsが追加されます。
[
{
"date": "20131105",
"summary": [ //Summariesと同様
...
],
"segments": [ //Activitiesと同様
{
"type": "move",
"startTime": "20131105T065908+0900",
"endTime": "20131105T082413+0900",
"activities": [
{
"activity": "walking",
"group": "walking",
"manual": false,
"startTime": "20131105T065908+0900",
"endTime": "20131105T070454+0900",
"duration": 346,
"distance": 750,
"steps": 650,
"calories": 44,
"trackPoints": [ //トラックポイント
{
"lat": 35.79771, //緯度
"lon": 139.79265, //経度
"time": "20131105T065908+0900" //時間
},
{
"lat": 35.79771,
"lon": 139.79265,
"time": "20131105T065909+0900"
},
...
]
},
...
],
"lastUpdate": "20131105T023625Z"
},
{
"type": "place", //Placesと同様
...
},
...
],
"caloriesIdle": 1674,
"lastUpdate": "20131122T131338Z"
}
]
6-21日のストーリーラインデータを取得するPHPのサンプルプログラム
それでは、1日分のストーリーラインデータを取得してみましょう。例えば、2013年11月5日のデータを取得するためには、URLを次のように組み立てます。
[GET] https://api.moves-app.com/api/1.1/user/storyline/daily/20131105?access_token={アクセストークン}&trackPoints=true
取得するためのサンプルプログラムが、下記の通りです。$request_urlと$access_tokenは自身の環境に合わせて調整して下さいね!
<?php
//リクエストURLとアクセストークン
$request_url = 'https://api.moves-app.com/api/1.1/user/storyline/daily/20131105?trackPoints=true';
$access_token = 'TZ2A8neY7upM944UW6G74LRYDRBsYvxbs_9MYvE9d7e8W1q9zKO2e8alSMrK_v58';
//リクエストURLにアクセストークンを結合
$is_param = explode('?',$request_url);
$request_url .= (isset($is_param[1]) && !empty($is_param[1])) ? '&access_token='.$access_token : '?access_token='.$access_token;
//JSONデータを取得し、オブジェクト形式に変換
$obj = json_decode(@file_get_contents($request_url));
//取得したデータを整理
echo "<h1>指定期間のストーリーライン</h1>";
foreach($obj as $segments){
echo "<h2>{$segments->date}</h2>";
foreach($segments->segments as $item){
//滞在場所の開始時間と終了時間(ついでに整形)
$start = date('Y/m/d H:i',strtotime($item->startTime));
$end = date('Y/m/d H:i',strtotime($item->endTime));
echo "<h3>{$start}〜{$end}</h3>";
//場所の場合
if($item->type == 'place'){
//場所名・場所タイプ・緯度・経度
$name = $item->place->name;
$type = $item->place->type;
$lat = $item->place->location->lat;
$lon = $item->place->location->lon;
//出力
echo "<p>場所名 : {$name}<br/>場所タイプ : {$type}<br/>緯度 : {$lat}<br/>経度 : {$lon}</p>";
//運動の場合
}elseif($item->type == 'move' || $item->type == 'off'){
//運動内容の解析
foreach($item->activities as $sub_item){
//運動項目・カテゴリ・時間(秒)・距離(メートル)・カロリー(kcal)・歩数
$value = $sub_item->activity;
$category = $sub_item->group;
$duration = $sub_item->duration;
$distance = $sub_item->distance;
$cal = (isset($sub_item->calories)) ? $sub_item->calories : '-';
$steps = (isset($sub_item->steps)) ? $sub_item->steps : '-';
//トラックポイントを取得してる場合
$tracks = '';
if(isset($sub_item->trackPoints)){
//個々のトラックポイントを取得
foreach($sub_item->trackPoints as $points){
//緯度・経度・時間(ついでに整形)
$tlat = $points->lat;
$tlon = $points->lon;
$ttime = date('H:i:s',strtotime($points->time));
//変数[$traks]に格納
$tracks .= "<br/>{$ttime} … {$tlat},{$tlon}";
}
}
//出力
echo "<p>運動項目:{$value}<br/>運動カテゴリ : {$category}<br/>時間 : {$duration}<br/>距離 : {$distance}<br/>カロリー : {$cal}<br/>歩数 : {$steps}<br/>{$tracks}</p>";
}
}
}
}
プログラムの実行結果
プログラムを実行すると、ブラウザに指定した日のストーリーラインのデータが表示されます。上記はトラックポイントを有効にした場合で、座標情報が取得できているのが分かると思います。トラックポイントは数秒ごとに記録されるので、膨大な量になります。クリックで画像を拡大することができます。
7運動項目のデータを取得する
Movesで設定することができる運動の種類は50項目以上にもなります。これらの運動項目の種類が現在どれだけあるのかを、APIで取得することができます。webサービスを運営している人にとっては、新しく追加された運動項目について把握できるので、便利ですよね。
Activity list Moves for Developers
7-1運動項目リストのリクエスト方法
下記のURLにアクセスすることで、運動項目リストを取得することができます。なお、このリクエストには「アクセストークン」は必要ないため、下記の「リンク」をクリックすればすぐに取得することができます。
[GET] https://api.moves-app.com/api/1.1/activities [リンク]
JSONデータはインデント(改行など)されていないため、非常に見づらいです。整形されたJSONデータを確認したい場合は、下記のオンラインツールをご利用下さい。
JSON整形 Syncer Tools
取得できるJSONデータ
このAPIでは、下記のJSONデータを取得できます。50以上の運動項目のデータが配列形式で含まれています。groupは、運動カテゴリに所属している運動項目データにだけ、含まれています。
[
{
"activity": "cycling", //運動項目
"group": "cycling", //運動カテゴリ
"geo": false, //トラックポイントの記録に対応しているか
"place": true, //場所内の運動として記録されるか
"color": "00cdec", //イメージカラー
"units": "duration,calories" //記録されるデータ
},
{
"activity": "dancing",
"group": "", //運動カテゴリに所属してないので存在しない…
"geo": false,
"place": true,
"color": "963fcc",
"units": "duration,calories"
},
...
]
7-2運動項目リストは公式ドキュメントでも確認できる
これらのデータは、APIを経由して取得しなくても、公式ドキュメントのページで確認することができます。プログラムに組み込んで何かに利用することがない限り、確認するだけならこちらのページを見た方が早いでしょう。
8MovesのAPI周りのこと
この章では、Moves APIを利用する上で知っておくと便利な情報を色々と紹介します。
8-1アクセストークンの有効期限について
Moves APIのアクセストークンには、60日間の有効期限があります。そのため、例えばMovesから定期的にデータを取得するプログラムを作成していても、60日後にはアクセストークンが無効になることで、プログラムが機能しなくなってしまいます。
もう1回ユーザーがアプリ認証をすればいいですけど、PINコードの入力なんて面倒ですよね…。これらを防ぐ方法として、「リフレッシュトークン」という機能が提供されています。簡単に言えば、「アクセストークンを新しく更新し、有効期限をリセットする」機能です。公式ドキュメントは下記のページをご覧下さい。
Authentication and Authorization Moves for Developers
リフレッシュトークンのリクエスト方法
リフレッシュするためには、下記のURLにPOSTメソッドでリクエストする必要があります。
[POST] https://api.moves-app.com/oauth/v1/access_token
また、リフレッシュトークンを行なう際は、リクエストURLに下記のパラメータを付与します。アプリ認証の際にアクセストークンと一緒に取得した「リフレッシュトークン」は、ここで利用することになります。
| プロパティ名 | 値 |
|---|---|
| grant_type | [必須] [refresh_token] |
| refresh_token | [必須] リフレッシュトークン |
| client_id | [必須] クライアントID |
| client_secret | [必須] クライアントシークレット |
| scope | パーミッションを変更する場合に指定 |
リフレッシュトークンを取得するサンプルプログラム
$client_idと$client_secret、そしてアプリ認証の時にアクセストークンと一緒に取得していた「リフレッシュトークン」の値を$refresh_tokenにセットしてから、起動して下さい。リフレッシュをすると、現在のアクセストークン、リフレッシュトークンは無効になるのでご注意下さい。
<?php
//クライアントIDとシークレット
$client_id = 'Cn7do2McmeGIvoBmJ72XNM7C5Nq8017B';
$client_secret = 'Iz6_JvIdAd0MNhoDeIMiX_dEQk6w6VP3uI1537OR7OSRrA125FXSDuovNiyjQq35';
//リフレッシュトークン
$refresh_token = '5yjEVrFpq5zR6zCRh1i0iEALF5730pTVv2MXYo676hIwml_Wa_j90fZLvfI32P7B';
//リフレッシュ後のパーミッション
$scope = 'activity location';
//リフレッシュトークンを取得し、オブジェクト形式に変換
$obj = json_decode(@file_get_contents(
'https://api.moves-app.com/oauth/v1/access_token',
false,
stream_context_create(
array('http' => array(
'method' => 'POST',
'content' => http_build_query(array(
'grant_type' => 'refresh_token',
'refresh_token' => $refresh_token,
'client_id' => $client_id,
'client_secret' => $client_secret,
'scope' => $scope,
)),
))
)
));
//新しいアクセストークンを[$access_token]に格納
$access_token = $obj->access_token;
//新しいリフレッシュトークンを[$refresh_token]に格納
$refresh_token = $obj->refresh_token;
//ブラウザに出力
echo "<p>あなたの新しいアクセストークンは<mark>{$access_token}</mark>です!</p><p>あなたの新しいリフレッシュトークンは<mark>{$refresh_token}</mark>です!</p>";
8-2レートリミットの確認方法
Moves APIのレートリミットは、2014年6月現在、下記表のように設定されています。
| 時間 | 回数 |
|---|---|
| 1分あたり | 60回 |
| 1時間あたり | 2,000回 |
公式ドキュメントは下記のリンクをご確認下さい。
Rate limiting Moves
通常の使用範囲内であれば、制限を超えることはないと思いますが、現在どれくらいの使用回数が残っているかを調べるには、レスポンスヘッダーの内容を確認・解析します。レスポンスヘッダーは、APIをリクエストをした後に、自動で$http_response_headerに配列形式で格納されます。
Array ( [0] => HTTP/1.1 200 OK [1] => Server: nginx [2] => Date: Sat, 28 Jun 2014 19:19:32 GMT [3] => Content-Type: application/json; charset=utf-8 [4] => Content-Length: 362 [5] => Connection: close [6] => X-RateLimit-HourRemaining: 1997 //1時間あたりの残り使用回数 [7] => Last-Modified: Thu, 26 Jun 2014 15:21:06 GMT [8] => Etag: W/"af1cf4b5a9c4d6f8ab5661ef8bea9f29" [9] => X-RateLimit-HourLimit: 2000 //1時間あたりの使用回数上限 [10] => X-RateLimit-MinuteRemaining: 59 //1分あたりの残り使用回数 [11] => X-RateLimit-MinuteLimit: 60 //1分あたりの使用回数上限 )
配列のキー番号、6、9、10、11番をそれぞれ確認すれば、残り使用回数を把握できるというわけですねー。面倒ですが、プログラムにこの数値を組み込むには、例えば下記のように文字列を切り離して数値を得る必要があります。
//1時間あたりの残り使用回数の数値を得るサンプル
//[X-RateLimit-HourRemaining: 1997]を[: ]で区切る
$array = explode(': ',$http_response_header[6]);
//残り使用回数(サンプルでは1997)を、変数[$remain]に格納
$remain = $array[1];
9Moves APIを使ったサービスいろいろ
Moves APIを使って、どんなサービスができるのか。色々と考えたものを掲載していきます。これからAPIを利用してサービスなどを作成しようと思っている方のヒントになれば幸いです!
9-1ブログのサイドバーに運動記録を表示
主に運動系のライフログを書いている方は、ブログのサイドバーに「今月の運動記録」のような形で、Movesのデータを表示してみてはいかがでしょうか?Moves APIを利用すれば、簡単にできちゃいます。
サンプルプログラム
$access_tokenをセットしてプログラムを起動すれば、今月の各運動データの合計値を取得、出力することができます。
<?php
//アクセストークン
$access_token = 'wB4r_uN7qEr_gim9zVQKjhawp0yT6vx1a0StyLM163rtzO3PNlK96_c1dovNAKIx';
//リクエストURL
$request_url = 'https://api.moves-app.com/api/1.1/user/summary/daily/'.date('Ym').'?access_token='.$access_token;
//JSONデータを取得し、オブジェクト形式に変換
$obj = json_decode(@file_get_contents($request_url));
//記録用配列の初期値
$data = array(
'walking' => array(
'duration' => 0,
'distance' => 0,
'steps' => 0,
),
'running' => array(
'duration' => 0,
'distance' => 0,
'steps' => 0,
),
'cycling' => array(
'duration' => 0,
'distance' => 0,
),
);
//日ごとの解析
foreach($obj as $summary){
//サマリーの解析
foreach($summary->summary as $item){
//運動カテゴリ
$category = $item->group;
//歩き、走り、自転車のみ記録
if($category == 'transport') continue;
//時間(秒)・距離(メートル)・歩数を合計していく
$data[$category]['duration'] += $item->duration;
$data[$category]['distance'] += $item->distance;
if(isset($item->steps)) $data[$category]['steps'] += $item->steps;
}
}
//出力
echo "
<h1>今月の運動記録</h1>
<h2>ウォーキング</h2>
<p>合計時間:{$data['walking']['duration']} 秒
<br/>合計距離:{$data['walking']['distance']} メートル
<br/>合計歩数:{$data['walking']['steps']} 歩</p>
<h2>ランニング</h2>
<p>合計時間:{$data['running']['duration']} 秒
<br/>合計距離:{$data['running']['distance']} メートル
<br/>合計歩数:{$data['running']['steps']} 歩</p>
<h2>サイクリング</h2>
<p>合計時間:{$data['cycling']['duration']} 秒
<br/>合計距離:{$data['cycling']['distance']} メートル</p>
";
プログラムの実行結果
このように、今月の各運動の合計値がブラウザに出力されます。サンプルは、デザインがシンプルなものですが、自分のブログに合うようにアレンジしてみて下さいね。面白いコンテンツが1つ加わることになると思います!
9-2行動の軌跡を地図に描写する
StorylineのトラックポイントとGoogle Map APIを組み合わせれば、行動の軌跡をGoogle Maps上にラインで描写することが可能です。自分がどこに行ったのかが分かって、面白いですよー。
サンプルプログラム
$access_tokenと$dateを設定して、プログラムを起動してみて下さい!
<?php
//アクセストークン
$access_token = 'Bmj4T5XE2hrb9Mrp364XedfVG70GnM7Pbl1krXr3Fkq97ZrEOvIqTyE3MbFp2KdZ';
//行動記録を描写する日付
$date = '20131105';
//サマリーを取得するためのURL
$request_url = 'https://api.moves-app.com/api/v1/user/storyline/daily/'.$date.'?trackPoints=true&access_token='.$access_token;
//データを取得する
$json = file_get_contents($request_url);
$obj = json_decode($json);
//ヘッダーの出力(Google Map APIのJavascriptを読み込む)
echo '
<html>
<head>
<meta charset="utf-8"/>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false" charset="utf-8"></script>
</head>
<body>';
//地図のキャンパス用コンテナを出力
echo '<div id="map" style="width: 800px; height: 600px;"></div>';
//Javascriptのコードを動的に生成
echo '<script type="text/javascript">
var latlngData = [ ';
//全てのトラックポイントを取得していく
foreach($obj[0]->segments as $segments){
if(isset($segments->activities)){
foreach($segments->activities as $activities){
if(isset($activities->trackPoints)){
foreach($activities->trackPoints as $trackpoints){
echo '{ lat:"'.$trackpoints->lat.'", lng:"'.$trackpoints->lon.'" }, ';
}
}
}
}
}
echo '
];
var arrCoords = new Array();
for (i = 0;i < latlngData.length;i++) {
var latlng = new google.maps.LatLng(latlngData[i].lat, latlngData[i].lng);
arrCoords.push(latlng);
}
// Google Mapで利用する初期設定用の変数
var latlng = new google.maps.LatLng('.$trackpoints->lat.','.$trackpoints->lon.');
var mapOptions = {
zoom: 14,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: latlng
};
//地図を出力する
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
new google.maps.Polyline({
map: map,
path: arrCoords,
strokeWeight: 5,
strokeColor: "#f00",
strokeOpacity: "0.5"
});
</script>
';
プログラムの実行結果
このように、地図上に全てのトラックポイントを結びつけたラインが引かれます。なお、Google Maps APIに関しては、下記の公式ドキュメントをご確認下さい。
9-3リアルタイム地図
私が真っ先に考えたのが「リアルタイム地図」です。Movesのデータから最新の座標を受け取り、Google Mapsにマーカーを付けて表示するというもの。ユーザーのみんなに、現在自分がいる場所を公開することができます。
リアルタイム地図のPHPサンプルプログラム
下記がMovesに記録されている最新の位置情報を取得するサンプルプログラムです。$access_tokenを設定してからプログラムを起動して下さい。
<?php
//アクセストークン
$access_token = 'Bmj4T5XE2hrb9Mrp364XedfVG70GnM7Pbl1krXr3Fkq97ZrEOvIqTyE3MbFp2KdZ';
//[Storyline]を利用して、最新のトラックポイント(座標)を取得
$request_url = 'https://api.moves-app.com/api/1.1/user/storyline/daily/'.date('Ymd').'?trackPoints=true&access_token='.$access_token;
//ストーリーラインのデータを取得し、連想配列形式に変換
$obj = json_decode(@file_get_contents($request_url),true);
//ストーリーラインの配列を[昔→今]から[今→昔]に並び替え
krsort($obj[0]['segments']);
foreach($obj[0]['segments'] as $item){
//最新のセグメントが[場所]の場合
if($item['type'] == 'place'){
//場所の緯度・経度を配列[$geo]に格納
$geo = array( $item['place']['location']['lat'] , $item['place']['location']['lon'] );
//最新のセグメントが[運動]の場合
}elseif($item['type'] == 'move' || $item['type'] == 'off'){
//アクティビティの存在を確認
if(isset($item['activities'][0])){
//アクティビティの配列を[昔→今]から[今→昔]にする
krsort($item['activities']);
foreach($item['activities'] as $activities){
//トラックポイントの存在を確認
if(isset($activities['trackPoints'][0]['lat']) && isset($activities['trackPoints'][0]['lon'])){
//トラックポイントの配列を[昔→今]から[今→昔]にする
krsort($activities['trackPoints']);
foreach($activities['trackPoints'] as $trackpoints){
//最新の緯度・経度を配列[$geo]に格納
if(isset($trackpoints['lat']) && isset($trackpoints['lon'])){
$geo = array( $trackpoints['lat'] , $trackpoints['lon'] );
break;
}
}
}
//最新の緯度・経度が取得できた時点でループ終了
if(isset($geo)) break;
}
}
//最新の緯度・経度が取得できた時点でループ終了
if(isset($geo)) break;
}
}
//緯度・経度を利用して、Google Mapsで地図を表示
echo '<img src="http://maps.googleapis.com/maps/api/staticmap?size=640x480&markers=color:red%7C'.$geo[0].','.$geo[1].'&sensor=false">';
プログラムの実行結果
このように、Movesに記録された最新の場所が、Google Mapsの地図で表示されます。ちなみに、Google Mapsを画像形式で出力できる「Google Static Maps API」の仕様に関しては、下記の公式ドキュメントをご参考下さい!
場所を知らせる地図の効用
例えば、私が大好きな、「猿回しのさくらちゃん」のご主人と猿は、全国各地を回って芸を披露しています。そういった、常に移動をする職業の人がホームページを持ち、このリアルタイム地図を利用してファンに自分の場所を教える、という使い方があってもいいんじゃないでしょうか。
これを応用して、複数人のリアルタイムな位置情報を取得し、ネットでの鬼ごっこ、かくれんぼゲームイベントを行なうのも面白いかもしれません。参加者全員の位置を、地図にマーカーで表示できるので、ツイキャスやニコニコなどの生放送と併せて配信すれば、リスナーも楽しめますよね。
この連載の記事一覧
この記事へのコメント
感想、ご指摘などお気軽にお寄せ下さい。「関連記事を書いた」という方はご報告いただければリンクします。
記事の更新履歴
- 記事を公開しました。
2014/06/29 09:00
※Twitter、Facebook、はてな、いずれかのアカウントをお持ちの方は、本人認証(ログイン)を行なうことができます。
※本人認証をすることで、書き込みの待ち時間なし、画像アップロード、アイコンなどが利用できます。
※認証時にサービスと連携しますが、名前とアイコン以外の情報を読み込んだり、また書き込みを行なうことはありません。連携で要求する権限は「公開情報の読み取り」のみです。
コメントは、0件です。