jimmy0699/strava

一个用于访问Strava API数据的Laravel包。

v1.1.0 2022-05-17 10:51 UTC

This package is auto-updated.

Last update: 2024-09-17 15:41:30 UTC


README

GitHub release GitHub watchers GitHub stars GitHub forks GitHub code size in bytes GitHub issues GitHub last commit

Laravel Strava 包

一个用于访问Strava API数据的Laravel包。兼容Laravel 5.0及以上版本。

目录

Strava 访问凭证

为了使用此包,您需要在您的Strava账户中创建一个应用。 创建Strava应用 以访问您的API凭证。有关Strava API的更多信息,请点击此处 Strava API

安装

要在您的Laravel项目中安装此包,请使用以下composer命令

composer require codetoad/strava

发布Strava配置文件

vendor:publish 命令将在您的Laravel项目配置文件夹中发布一个名为 ct_strava.php 的文件,位置在 config/ct_strava.php。使用您从创建的Strava应用中生成的Strava API凭证编辑此文件。

php artisan vendor:publish --provider="CodeToad\Strava\StravaServiceProvider"

已发布配置文件内容

'client_id' => env('CT_STRAVA_CLIENT_ID', '')
'client_secret' => env('CT_STRAVA_SECRET_ID', '')
'redirect_uri' => env('CT_STRAVA_REDIRECT_URI', '')

或者,您可以选择忽略上述发布命令,并将以下变量添加到您的 .env 文件中。请确保添加您的Strava应用凭证

CT_STRAVA_CLIENT_ID=ADD-STRAVA-CLIENT-ID-HERE
CT_STRAVA_SECRET_ID=ADD-STRAVA-SECRET-HERE
CT_STRAVA_REDIRECT_URI=ADD-STRAVA-REDIRECT-URI-HERE

自动发现

如果您正在使用Laravel 5.5+,则无需手动添加服务提供者或外观。这将自动发现。对于Laravel 5.5以下的所有版本,您必须在您的Laravel项目 config/app.php 中适当数组中手动添加ServiceProvider & Facade

提供者

CodeToad\Strava\StravaServiceProvider::class,

别名 / 外观

'Strava' => CodeToad\Strava\StravaFacade::class,

使用方法

使用Strava外观

将Strava外观添加到您的控制器顶部,以便您可以访问Strava类方法。

use Strava;

class MyController extends Controller
{
  // Controller functions here...
}

用户认证

调用 Strava::authenticate() 方法以将其重定向到Strava。如果认证成功,用户将被重定向到您在 config 文件或 .env 文件中添加的 redirect_uri。现在,您也可以在认证时传递 $scope 参数。根据需要添加或删除作用域。一些是必需的,一些是可选的。有关可用作用域的详细信息,请参阅此处 Strava认证作用域

public function stravaAuth()
{
  return Strava::authenticate($scope='read_all,profile:read_all,activity:read_all');
}

获取用户访问令牌

当返回到重定向URI时,调用 Strava::token($code) 方法以生成用户的Strava访问令牌和刷新令牌。令牌使用重定向URI中 code 参数的值生成。请确保将用户的 access_tokenrefresh_token 存储在您的数据库中。

public function getToken(Request $request)
{
  $token = Strava::token($request->code);

  // Store $token->access_token & $token->refresh_token in database
}

示例响应

"token_type": "Bearer"
"expires_at": 1555165838
"expires_in": 21600 // 6 Hours
"refresh_token": "671129e56b1ce64d7e0c7e594cb6522b239464e1"
"access_token": "e105062b153da39f81a439b90b23357c741a40a0"
"athlete": ...

此时,您有权访问 Athlete 对象,可用于登录您的网站。当然,您需要编写自己的登录系统逻辑,但运动员姓名、电子邮件等数据包含在对象中,以便您可以对用户进行验证。

访问令牌过期

根据Strava实施的新流程,访问令牌现在将在6小时后过期,并且需要使用刷新令牌进行更新。在上面的示例中,您可以看到响应中有一个refresh_token和一个expires_at字段。当存储用户访问令牌时,您可能还想存储expires_at字段。这将允许您检查当前访问令牌何时过期。

当调用以下任何Strava方法时,您可能想将当前时间与expires_at字段进行比较,以验证令牌。如果令牌已过期,您需要调用Strava::refreshToken($refreshToken)方法以生成新的令牌。您所需要做的就是传递用户当前存储的refresh_token,然后该方法将返回一组新的令牌(访问令牌和刷新令牌),并使用响应中的新令牌更新当前用户的令牌。以下是一个示例,使用Strava::athlete($token)方法。

use Carbon\Carbon;

public function myControllerFunction(Request $request)
{
  // Get the user
  $user = User::find($request->id);

  // Check if current token has expired
  if(strtotime(Carbon::now()) > $user->expires_at)
  {
    // Token has expired, generate new tokens using the currently stored user refresh token
    $refresh = Strava::refreshToken($user->refresh_token);

    // Update the users tokens
    User::where('id', $request->id)->update([
      'access_token' => $refresh->access_token,
      'refresh_token' => $refresh->refresh_token
    ]);

    // Call Strava Athlete Method with newly updated access token.
    $athlete = Strava::athlete($user->access_token);

    // Return $athlete array to view
    return view('strava.athlete')->with(compact('athlete'));

  }else{

    // Token has not yet expired, Call Strava Athlete Method
    $athlete = Strava::athlete($user->access_token);

    // Return $athlete array to view
    return view('strava.athlete')->with(compact('athlete'));

  }

}

注销用户

您可以让用户通过您的Strava应用程序注销其Strava账户。只需允许用户调用以下方法,传递为其账户存储的访问令牌。

Strava::unauthenticate($token);

可用方法

所有方法都需要访问令牌,一些方法接受以下列出的可选参数。

  • 可选参数
    • $page (Int - 默认 1)
    • $perpage (Int - 默认 10)
    • $before (Int/Timestamp - 默认 = 最近)
    • $after (Int/Timestamp - 默认 = 最近)

运动员数据

返回当前认证的运动员。

Strava::athlete($token);

用户活动数据

返回运动员的活动。

Strava::activities($token, $page, $perPage, $before, $after);

用户单个活动

返回由认证的运动员拥有的给定活动。

Strava::activity($token, $activityID);

用户单个活动流

返回给定活动的流。

// $keys is a string array containing required streams
// e.g. ['latlng', 'time']
Strava::activityStream($token, $activityID, $keys = '', $keyByType = true);

活动评论

返回给定活动的评论。

Strava::activityComments($token, $activityID, $page, $perPage);

活动Kudos

返回对活动点赞的运动员。

Strava::activityKudos($token, $activityID, $page, $perPage);

活动圈数

返回活动的圈数数据。

Strava::activityLaps($token, $activityID);

活动区域

Summit功能要求。返回给定活动的区域。

Strava::activityZones($token, $activityID);

更新活动

更新由认证的运动员拥有的给定活动。需要activity:write权限,因此要更新活动,您需要按照以下方式进行认证:Strava::authenticate('read_all,profile:read_all,activity:read_all,activity:write');

Strava::updateActivityById($token, $activityID, array $updateableActivity);

您可以从以下内容更新一个或多个单独的参数

// Example $updateableActivity
$updateableActivity = [
    'commute' => false,
    'trainer' => false,
    'description' => 'Easier ride than usual',
    'name' => 'Fun ride',
    'type' => 'Ride', // string, instance of ActivityType
    'gear_id' => 'b12345678987654321',
];

在官方Strava文档中查找更多详细信息

运动员区域

返回认证运动员的心率区和功率区。

Strava::athleteZones($token);

运动员统计数据

返回运动员的活动统计数据。

Strava::athleteStats($token, $athleteID, $page, $perPage);

俱乐部

使用其标识符返回给定的俱乐部。

Strava::club($token, $clubID);

俱乐部成员

返回给定俱乐部成员列表。

Strava::clubMembers($token, $clubID, $page, $perPage);

俱乐部活动

检索特定俱乐部成员的最近活动。认证的运动员必须属于请求的俱乐部才能访问此端点。支持分页。尊重所有活动的运动员个人资料可见性。

Strava::clubActivities($token, $clubID, $page, $perPage);

俱乐部管理员

返回给定俱乐部的管理员列表。

Strava::clubAdmins($token, $clubID, $page, $perPage);

运动员俱乐部

返回包括认证运动员的俱乐部的列表。

Strava::athleteClubs($token, $page, $perPage);

装备

使用设备ID返回设备数据。

Strava::gear($token, $gearID);

路线

使用其路线ID返回路线。

Strava::route($token, $routeID);

运动员路线

返回由认证运动员创建的路线列表,使用他们的运动员ID。

Strava::athleteRoutes($token, $athleteID, $page, $perPage);

赛道

返回指定的段。

Strava::segment($token, $segmentID);

赛道努力

返回由认证的运动员拥有的活动中的段努力。

Strava::segmentEffort($token, $segmentID);

星标赛道

返回认证运动员的星标段列表。

Strava::starredSegments($token, $page, $perPage);

获取API限制

Strava在响应头中返回关于API调用配额和使用的信

以下方法在耗尽API限制的调用(如获取活动)时将返回此信息。一些调用(如刷新访问令牌)似乎不会耗尽API调用限制,这就是为什么您将在结果数组中收到null的原因。

当您在第一次尝试获取限制时,在耗尽限制的任何API调用之前,您将收到null。默认配额限制不是硬编码的,因为不同的账户可能有不同的限制。

所有API限制

返回多维数组中的所有限制,例如。

[  
	['allowance']['15minutes'] => "100",  
	['allowance']['daily'] => "1000",  
	['usage']['15minutes'] => "7",  
	['usage']['daily'] => "352",  
]
Strava::getApiLimits();

分配的API限制

返回 Strava 账户的每日和 15 分钟请求限制,例如。

[  
	['15minutes'] => '100',  
	['daily'] => '1000',  
]
Strava::getApiAllowanceLimits();

已使用 API 调用

返回 Strava 账户已使用的每日和 15 分钟调用次数,例如。

[  
	['15minutes'] => '7',  
	['daily'] => '352',  
]
Strava::getApiUsageLimits();

参数类型

$token        = string
$activityID   = integer
$athleteID    = integer
$clubID       = integer
$gearID       = integer
$routeID      = integer
$segmentID    = integer
$page         = integer
$perPage      = integer
$before       = integer (timestamp)
$after        = integer (timestamp)

缓存

强烈建议您出于以下两个原因对发送到 Strava 的请求进行缓存。

(1) 速率限制

Strava 的 API 速率限制为每 15 分钟 100 个请求和每日 10,000 个请求。如果您的网站流量较大,您可能需要考虑缓存 Strava 的响应数据,以避免超出这些限制。

(2) 网站加载速度

缓存您的 Strava 数据将显著提高网站加载时间。

有用链接