dawguk/php-garmin-connect

一个用于查询 Garmin Connect "API" 的 PHP 适配器

v1.7.0 2021-05-19 14:45 UTC

This package is auto-updated.

Last update: 2024-09-19 22:17:05 UTC


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", ...}