kyoden/php-garmin-connect

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

v3.0.3 2021-05-25 19:51 UTC

This package is not auto-updated.

Last update: 2024-09-25 12:09:44 UTC


README

这是一个从 dawguk 代码分支出来的版本,主要用于更新到最新的 Garmin Connect 功能。这是一个用于查询 Garmin Connect "API" 的 PHP 适配器

分支:dawguk/php-garmin-connect 并与 klorie/php-garmin-connect 合并

前言

Garmin 的 Connect 工具并没有一个真正的 API。嗯,他们似乎有,但是做得半途而废;他们似乎已经放弃了它或者让它过时了,文档非常稀少,而且似乎没有“正确”的方式来验证用户。

所以多亏了 Collin @tapiriik 和他的出色的公共 Python 仓库(https://github.com/cpfair/tapiriik),这个项目应运而生,为那些喜欢大象而不是蛇的人们;)

代码有很好的文档记录,这是必须的,因为我们必须做一些相当棘手的事情。一旦完成身份验证,基本上就是老式的 RESTFUL API 东西。哦,但我们正在使用 CURL cookie 处理来维护会话状态。呃。

完整示例

我们只需使用我们的 Garmin Connect 凭据进行连接。

<?php
$arrCredentials = array(
   'username' => 'xxx',
   'password' => 'xxx',
);

try {
  $GarminConnect = new \GarminConnect\GarminConnect($arrCredentials);

  $filters = new \GarminConnect\ParametersBuilder\ActivityFilter();
  $filters->betweenDate(new \DateTime('2018-05-01'), new \DateTime('2018-05-31'));
  $filters->type(\GarminConnect\ActivityType::RUNNING);
  $filters->limit(1);

  $results = $GarminConnect->getActivityList($filters);
  foreach ($results as $activity) {print " - {$activity->activityName} at {$activity->startTimeLocal} (type: {$activity->activityType->typeKey})" . PHP_EOL;
   }

} catch (Exception $objException) {
   echo "Oops: " . $objException->getMessage();
}

API 函数

库实现了一些基本的 API 函数,您可以使用这些函数检索有用的信息。方法签名如下

getActivityTypes()

返回一个 stdClass 对象,其中包含一个名为 dictionary 的数组,该数组包含代表活动类型的 stdClass 对象。

示例

try {
   $GarminConnect = new \GarminConnect\GarminConnect($arrCredentials);
   $obj_results = $GarminConnect->getActivityTypes();
   foreach ($obj_results->dictionary as $item) {
      print_r($item);
   }

   } catch (Exception $objException) {
      echo "Oops: " . $objException->getMessage();
   }

响应

stdClass Object
(
[key] => road_biking
[display] => Road Cycling
[parent] => stdClass Object
    (
        [key] => cycling
        [display] => Cycling
    )

[type] => stdClass Object
    (
        [key] => cycling
        [display] => Cycling
    )

)

getActivityList(ActivityFilter $filters)

返回一个 stdClass 对象,其中包含一个名为 results 的数组,该数组包含代表活动的 stdClass 对象。它接受 ActivityFilter 参数,一个用于过滤活动的对象。

示例

   try {
      $GarminConnect = new \GarminConnect\GarminConnect($arrCredentials);
      $fitlers = new \GarminConnect\GarminConnect\ParametersBuilder\ActivityFilter();
      $fitlers->betweenDate(new \DateTime('2018-06-01'), new \DateTime('2018-06-05'));
      $fitlers->type(\GarminConnect\GarminConnect\ActivityType::RUNNING);
      
      $obj_results = $GarminConnect->getActivityList($fitlers);
      print_r($obj_results);
   } catch (Exception $objException) {
      echo "Oops: " . $objException->getMessage();
   }

getActivitySummary(integer $intActvityID)

返回一个 stdClass 对象,其中包含一个名为 activity 的 stdClass 对象,其中包含大量的数据,代表您作为参数传递的活动 ID。此活动 ID 可以从 getActivityList() 响应中获取(例如 $objResponse->results->activities[0]->activity->activityId)。

示例

try {
   $GarminConnect = new \GarminConnect\GarminConnect($arrCredentials);
   $obj_results = $GarminConnect->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 是自行车踏频等。

指标数据位于指标数组中,这是一个包含多个stdClass对象的数组,这些对象包含名为 metrics 的数组,其索引可以在测量数据中找到。

您看到它时就会明白。

注意:此方法可能需要一段时间才能返回数据,因为它可能很大。

示例

try {
   $GarminConnect = new \GarminConnect\GarminConnect($arrCredentials);
   $obj_results = $GarminConnect->getActivityDetails(593520370);
   print_r($obj_results);
} catch (Exception $objException) {
   echo "Oops: " . $objException->getMessage();
}

响应

不可能!

getDataFile(string $strType, integer $intActivityID)

返回给定活动 ID 请求的数据类型的字符串表示形式。第一个参数是以下之一

示例

   try {
      $GarminConnect = new \GarminConnect\GarminConnect($arrCredentials);
      $obj_results = $GarminConnect->getDataFile(\GarminConnect\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>