Skip to content

Strava 定时同步失败:Standard Tier 需订阅 / Application Inactive #56

Description

@yuler

背景

GitHub Actions 工作流 Sync Strava Activities(每小时 :55 cron)自 2026-06-30 22:19 UTC 起持续失败。最后一次成功同步约为 2026-06-30 21:23 UTC

示例失败 run:actions/runs/28581001311

本地执行 pnpm sync:strava:activities 复现相同错误。

错误信息

Strava API /athlete/activities failed (403):
{"message":"Forbidden","errors":[{"resource":"Application","field":"Status","code":"Inactive"}]}
  • Inactive 不是仓库里的配置,而是 Strava API 返回的错误体(errors[].code
  • 错误在 src/utils/strava.tsstravaFetch() 中抛出,经 scripts/sync-strava-activities.mjs 打印
  • Token refresh 通常能成功;失败发生在拉取 /athlete/activities 时,说明是 OAuth 应用状态 被 Strava 标记为不可用

根因(Strava 政策变更)

Strava Developer Program 更新(2026-06-30 生效):

  • Standard Tier 开发者必须有 活跃的 Strava 订阅 才能继续使用 API
  • 未满足条件时,应用状态变为 Inactive,API 返回 403
  • 当前应用信息:Standard Tier,Client ID 212904,Category Training,1/1 athletes

官方参考

当前站点影响

  • 站点构建时只读本地 data/strava/activities/*.json展示不受影响
  • 已有约 68 条活动缓存;2026-06-30 之后的新运动不会自动同步
  • 断的是自动同步管道,不是前端展示逻辑

相关实现:

  • Workflow: .github/workflows/sync-strava.yml
  • 同步脚本: scripts/sync-strava-activities.mjs
  • API 封装: src/utils/strava.ts
  • 博文记录: src/content/posts/2026/app-strava.mdx

已尝试 / 进展

  • 确认 GitHub Actions 与本地脚本逻辑正常
  • 重新 OAuth 授权(scope: read,activity:read_all)— 授权流程 OK,但应用仍为 Inactive(需先解决订阅)
  • 查找 3 个月免费过渡码 邮件 — 未找到(见下文)

3 个月免费码说明

  • 资格Active developer = 2026 年内至少发过 1 次 API 请求(我们符合,6/30 前同步成功)
  • 发放方式:仅通过邮件,后台无兑换入口
  • 搜索建议:邮箱关键词 Strava API Update3-monthdeveloper;时间约 2026 年 5 月底~6 月初;检查垃圾邮件 / 其他关联邮箱

若仍未收到,可向 Strava 补要:


⚠️ 重要提醒:3 个月免费码到期后必须处理

如果拿到并兑换 3 个月免费订阅码

  1. 记录兑换日期,到期前约 2 周设置提醒
  2. 到期前必须二选一(否则应用会再次变为 Inactive,定时同步再次失败):
    • 续费 Strava 订阅(Standard Tier 无额外 API 费用,订阅即含 API 访问)
    • 停用 API 自动同步,改用下方替代方案
  3. 兑换后还需:
    • 重新 OAuth 拿新 refresh_token(scope: read,activity:read_all
    • 更新 GitHub Secrets:STRAVA_CLIENT_IDSTRAVA_CLIENT_SECRETSTRAVA_REFRESH_TOKEN
    • 手动触发 Sync Strava Activities 验证

若本身已是 Strava 订阅用户,无需免费码,直接确保订阅活跃 + 更新 token 即可恢复 API。


后续可探索方案(按优先级)

A. 恢复 API 自动同步(推荐,若愿意付费或拿到免费码)

  1. 订阅 / 兑换 3 个月免费码
  2. 重新 OAuth → 更新 Secrets → 验证 workflow
  3. 到期前决定是否续订

B. 向 Strava 补要免费码(零成本,需等待)

见上文社区发帖 / 邮件支持

C. 冻结定时任务(零成本,维持现状)

  • Disable workflow 或改为仅 workflow_dispatch,避免每小时失败通知
  • 站点继续展示已有 JSON 数据

D. Strava Bulk Export 导入(零成本,半自动)

  • Exporting your Data and Bulk Export
  • Settings → My Account → Request Your Archive(不是删号
  • ZIP 含 activities/(GPX/FIT)+ activities.csv
  • 需编写导入脚本:GPX → 现有 JSON 格式(含 polyline 编码)
  • 适合「不定期手动同步」,非实时

E. 不推荐

  • 订阅 1 个月再取消 → 到期后再次 Inactive
  • 爬取 Strava 网页 → 违反 ToS
  • 第三方中转平台 → 2026 政策已限制 intermediary
  • 申请 Extended Access → 个人站场景不现实

待办 checklist

  • 再搜一遍邮箱(含垃圾邮件)找 3 个月免费码
  • 若无码:Strava 社区 / 支持补要
  • 若拿到码:记录兑换日 + 设置 3 个月到期提醒
  • 恢复 API 后:OAuth → 更新 Secrets → 手动跑 workflow 验证
  • 到期前决定:续订 vs 改 Bulk Export / 冻结同步
  • (可选)Disable 当前失败的 cron,减少噪音

相关链接速查

用途 链接
失败 Actions https://github.com/yuler/yuler.dev/actions/workflows/sync-strava.yml
Strava API 设置 https://www.strava.com/settings/api
Strava 订阅 https://www.strava.com/settings/subscription
政策更新公告 https://communityhub.strava.com/insider-journal-9/an-update-to-our-developer-program-13428
API FAQ https://communityhub.strava.com/developers-knowledge-base-14/strava-api-faq-12906
补要免费码参考帖 https://communityhub.strava.com/developers-api-7/3-months-free-code-13532
数据 Bulk Export https://support.strava.com/en-us/articles/15401919-exporting-your-data-and-bulk-export
本站实现博文 https://yuler.dev/posts/2026/app-strava/(源码 src/content/posts/2026/app-strava.mdx

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions