dawguk / php-garmin-connect
一个用于查询 Garmin Connect "API" 的 PHP 适配器
Requires
- php: >=5.3.0
- ext-curl: *
- ext-json: *
Requires (Dev)
- squizlabs/php_codesniffer: 2.8.*
README
一个用于查询 Garmin Connect "API" 的 PHP 适配器
前言
Garmin 实际上并没有为他们的 Connect 工具提供一个合适的 API。嗯,他们似乎有,但只是半成品;他们似乎已经放弃了它或者让它过时了,文档非常少,并且似乎没有一种“正确”的方式来验证用户。
所以感谢 Collin @tapiriik 和他的精彩的公共 Python 仓库 (https://github.com/cpfair/tapiriik),这个项目是为那些喜欢大象而不是蛇的人而生的 ;)
代码相当有文档记录,这是必须的,因为我们必须做一些相当复杂的事情。一旦完成身份验证,基本上就是老式的 RESTFUL API 东西。哦,但我们正在使用 CURL 糖果处理来保持会话状态。呃。
完整示例
我们只需使用我们的 Garmin Connect 凭据进行连接。
<?php $arrCredentials = array( 'username' => 'xxx', 'password' => 'xxx', ); try { $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $objResults = $objGarminConnect->getActivityList(0, 1, 'cycling'); foreach($objResults->results->activities as $objActivity) { print_r($objActivity->activity); } } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
API 函数
库实现了一些基本的 API 函数,您可以使用它们来检索有用的信息。方法签名如下
getActivityTypes()
返回一个 stdClass 对象,该对象包含一个名为 dictionary 的数组,该数组包含代表活动类型的 stdClass 对象。
示例
try { $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->getActivityTypes(); foreach ($obj_results->dictionary as $item) { print_r($item); } } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
响应
Array
(
[0] => stdClass Object
(
[typeId] => 1
[typeKey] => running
[parentTypeId] => 17
[sortOrder] => 3
)
[1] => stdClass Object
(
[typeId] => 2
[typeKey] => cycling
[parentTypeId] => 17
[sortOrder] => 8
)
getActivityList(integer $intStart, integer $intLimit, string $strActivityType)
返回一个 stdClass 对象,该对象包含一个名为 results 的数组,该数组包含代表活动的 stdClass 对象。它接受三个参数 - start、limit 和活动类型;start 是您希望开始的记录,limit 是您希望返回的记录数,活动类型是从 getActivityTypes()
返回的(可选)活动类型的字符串表示。
示例
try { $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->getActivityList(0, 1); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
响应(不全面)
stdClass Object
(
[results] => stdClass Object
(
[activities] => Array
(
[0] => stdClass Object
(
[activity] => stdClass Object
(
[activityId] => 593520370
[activityName] => stdClass Object
(
[value] => Untitled
)
[activityDescription] => stdClass Object
(
[value] =>
)
[locationName] => stdClass Object
(
[value] =>
)
[userId] => 1653429
[username] => bob@bob.bob
[uploadDate] => stdClass Object
(
[display] => Thu, 18 Sep 2014 1:34 PM
[value] => 2014-09-18
[withDay] => Thu, 18 Sep 2014
[abbr] => 18 Sep 2014
[millis] => 1411047273000
)
[uploadedWith] => stdClass Object
(
[key] => garminExpressWin
[display] => Garmin Express Windows
[displaySingular] => Garmin Express Windows
[version] => 2.9.6.10
)
[device] => stdClass Object
(
[key] => edge510
[display] => Garmin Edge 510
[displaySingular] => Garmin Edge 510
[version] => 3.10.0.0
)
getActivitySummary(integer $intActvityID)
返回一个 stdClass 对象,该对象包含一个名为 activity 的 stdClass 对象,该对象包含许多代表您传入作为参数的活动 ID 的数据。此活动 ID 可以从 getActivityList()
响应中获取(例如 $objResponse->results->activities[0]->activity->activityId)。
示例
try { $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->getActivitySummary(593520370); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
响应
恐怕这个响应太大,无法在这里显示 - 您需要执行上述操作并亲自查看!
getActivityDetails(integer $intActivityID)
如果您认为前面的函数返回了很多数据,您最好坐下来 - 这是一个很大的函数!
与往常一样,它返回一个 stdClass 对象,该对象包含一个名为 "com.garmin.activity.details.json.ActivityDetails" 的 stdClass 对象(是的!)它包含一些成员和对象,代表您活动的原始数据。因此,所有原始运动数据也会返回(指标)。您可以将此视为 GPX 数据的文本表示,例如。
它包含一个stdClass对象的数组(度量),这些是指标数据的索引。例如,此信息显示指标索引 3 代表温度数据,索引 1 是自行车踏频等。
指标数据位于指标数组中,该数组是一系列包含名为 metrics 的数组的 stdClass 对象,其索引可在度量数据中找到。
您看到它时就会明白。
注意:此方法可能需要一段时间才能返回数据,因为它可能很大。
示例
try { $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->getActivityDetails(593520370); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
响应
不可能!
getDataFile(string $strType, integer $intActivityID)
根据指定的活动ID返回数据类型的字符串表示。第一个参数是以下之一:
示例
try { $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->getDataFile(\dawguk\GarminConnect::DATA_TYPE_GPX, 593520370); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
响应(不全面)
<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="Garmin Connect" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<metadata>
<link href="connect.garmin.com">
<text>Garmin Connect</text>
</link>
<time>2014-09-18T17:22:50.000Z</time>
</metadata>
<trk>
<name>Untitled</name>
<trkseg>
<trkpt lon="-2.246061209589243" lat="53.48290401510894">
<ele>54.599998474121094</ele>
<time>2014-09-18T17:22:50.000Z</time>
<extensions>
<gpxtpx:TrackPointExtension>
<gpxtpx:atemp>22.0</gpxtpx:atemp>
<gpxtpx:cad>0</gpxtpx:cad>
</gpxtpx:TrackPointExtension>
</extensions>
getWorkoutList(integer $intStart, integer $intLimit, bool $myWorkoutsOnly, bool $sharedWorkoutsOnly)
返回stdClass对象数组。
示例
try { $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->getWorkoutList(0, 10); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
响应
[ { "workoutId": 12345678, "ownerId": 12345678, "workoutName": "1.5h run", "description": null, "updateDate": "2020-04-20T15:26:05.0", "createdDate": "2020-04-20T15:26:05.0", "sportType": { "sportTypeId": 1, "sportTypeKey": "running", "displayOrder": 1 }, "trainingPlanId": null, "author": { "userProfilePk": null, "displayName": null, "fullName": null, "profileImgNameLarge": null, "profileImgNameMedium": null, "profileImgNameSmall": null, "userPro": false, "vivokidUser": false }, "estimatedDurationInSecs": null, "estimatedDistanceInMeters": null, "poolLength": 0.0, "poolLengthUnit": { "unitId": null, "unitKey": null, "factor": null }, "workoutProvider": null, "workoutSourceId": null, "consumer": null, "atpPlanId": null, "workoutNameI18nKey": null, "descriptionI18nKey": null, "exerciseCriteria": null, "shared": false, "estimated": true } ]
createWorkout(string $data)
返回创建的锻炼的JSON对象。
示例
try { $data = ''; $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->createWorkout($data); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
响应
{"workoutId":204516560,"ownerId":80242598,"workoutName":"Testing 1, 2, 3...","description":null,"updatedDate":"2020-04-20T16:06:19.0","createdDate":"2020-04-20T16:06:19.0",...}
deleteWorkout(integer $id)
从Garmin网站上删除锻炼,并返回无内容。
示例
try { $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->deleteWorkout(593520370); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
createStepNote(integer $stepID, string $note, integer $workoutID)
创建一个新的笔记并将其附加到步骤上。Garmin不返回任何内容 - 204。
示例
try { $data = ''; $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->createStepNote(593520370, 'Hello World', 123456789); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
scheduleWorkout(integer $id, string $data)
在您的日历上创建新事件,并返回JSON对象作为响应。
示例
try { $data = ''; $objGarminConnect = new \dawguk\GarminConnect($arrCredentials); $obj_results = $objGarminConnect->scheduleWorkout(593520370, $data); print_r($obj_results); } catch (Exception $objException) { echo "Oops: " . $objException->getMessage(); }
响应
{"workoutScheduleId":305583643,"workout":{"workoutId":204503966,"ownerId":80242598,"workoutName":"3h run","description":null,"updatedDate":"2020-04-20T15:26:06.0","createdDate":"2020-04-20T15:26:06.0","sportType":{"sportTypeId":1,"sportTypeKey":"running", ...}