You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用httr::VERB通过Refresh Token刷新Google Fit API访问令牌

使用httr刷新Google Fit API的Access Token

直接把Refresh Token当作Access Token使用是无效的,必须向Google的OAuth2令牌端点发送特定POST请求来获取新的Access Token。以下是用httr::VERB实现的具体代码:

刷新令牌函数实现

library(httr)

refresh_google_access_token <- function(client_id, client_secret, refresh_token) {
  # Google OAuth2令牌端点
  token_endpoint <- "https://oauth2.googleapis.com/token"
  
  # 构造请求参数
  request_body <- list(
    client_id = client_id,
    client_secret = client_secret,
    refresh_token = refresh_token,
    grant_type = "refresh_token"
  )
  
  # 用VERB显式发送POST请求
  response <- VERB("POST", url = token_endpoint, body = request_body, encode = "form")
  
  # 检查请求是否成功
  if (http_status(response)$category != "Success") {
    stop("令牌刷新失败: ", content(response, "text"))
  }
  
  # 解析并返回新令牌数据
  return(content(response))
}

使用示例

  1. 调用函数刷新令牌:
# 替换为你的应用凭证和已保存的refresh_token
my_client_id <- "你的客户端ID"
my_client_secret <- "你的客户端密钥"
my_refresh_token <- "已获取的刷新令牌"

new_token_data <- refresh_google_access_token(my_client_id, my_client_secret, my_refresh_token)

# 提取关键信息
new_access_token <- new_token_data$access_token
expires_in_seconds <- new_token_data$expires_in
  1. 在循环中自动验证并刷新:
# 初始化令牌及过期时间
current_access_token <- "初始的Access Token"
token_expiry_time <- Sys.time() + 3600  # 初始有效期1小时

while(TRUE) {
  # 提前60秒触发刷新
  if (Sys.time() >= token_expiry_time - 60) {
    cat("令牌即将过期,开始刷新...\n")
    new_token_data <- refresh_google_access_token(my_client_id, my_client_secret, my_refresh_token)
    current_access_token <- new_token_data$access_token
    token_expiry_time <- Sys.time() + new_token_data$expires_in
    cat("刷新完成,新令牌有效期至:", token_expiry_time, "\n")
  }
  
  # 使用当前令牌请求Google Fit步数数据
  fit_response <- GET(
    url = "https://www.googleapis.com/fitness/v1/users/me/dataset:aggregate",
    add_headers(Authorization = paste("Bearer", current_access_token)),
    query = list(
      aggregateBy = '[{"dataTypeName":"com.google.step_count.delta"}]',
      startTimeMillis = as.character(as.integer(Sys.time())*1000 - 86400000),
      endTimeMillis = as.character(as.integer(Sys.time())*1000)
    )
  )
  
  # 处理API响应
  if (http_status(fit_response)$category == "Success") {
    cat("获取步数数据成功\n")
  } else {
    cat("API请求失败:", content(fit_response, "text"), "\n")
  }
  
  # 每分钟轮询一次
  Sys.sleep(60)
}

注意事项

  • 确保你的refresh_token拥有fitness.activity.read权限,否则刷新或API请求会失败。
  • 部分场景下Google会返回新的refresh_token,建议保存该值用于后续刷新。
  • 需处理令牌刷新失败的情况(如refresh_token过期),此时需要引导用户重新授权。

内容的提问来源于stack exchange,提问作者Lev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:13:18