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

如何获取gspread创建的全局服务实例的更新后过期时间?

解决gspread全局客户端无法获取更新后过期时间的问题

问题核心

gspread基于google-auth库实现认证,token过期时会自动刷新,但直接打印client_gspread.auth.expiry可能无法实时获取更新后的过期时间——本质是google-auth的Credentials对象自动刷新后,部分场景下属性同步存在延迟,需要用正确方式访问最新值。

实用解决方案

1. 强制刷新后获取最新expiry

在操作前手动检查token有效性,触发刷新后再打印,确保拿到最新的过期时间:

import gspread
from google.auth.transport.requests import Request

client_gspread = None
def send_sheet(id_sheet, page_sheet, sheet_data):
    global client_gspread
    if not client_gspread:
        client_gspread = gspread.service_account(filename='client_secret.json')

    # 手动检查token有效性,无效则触发刷新
    if not client_gspread.auth.valid:
        client_gspread.auth.refresh(Request())

    sheet = client_gspread.open_by_key(id_sheet).worksheet(page_sheet)
    sheet.clear()
    sheet.update([sheet_data.columns.values.tolist()] + sheet_data.values.tolist())
    # 此时打印的expiry为最新值
    print(client_gspread.auth.expiry)

2. 通过钩子监听token刷新事件

利用google-auth的before_request钩子,在每次token刷新时主动记录最新过期时间:

import gspread
from google.auth.transport.requests import Request

def record_new_expiry(credentials, request):
    # token刷新时触发,直接打印最新过期时间
    print(f"已刷新token,新过期时间:{credentials.expiry}")

client_gspread = None
def send_sheet(id_sheet, page_sheet, sheet_data):
    global client_gspread
    if not client_gspread:
        client_gspread = gspread.service_account(filename='client_secret.json')
        # 绑定刷新钩子
        client_gspread.auth.before_request = record_new_expiry

    sheet = client_gspread.open_by_key(id_sheet).worksheet(page_sheet)
    sheet.clear()
    sheet.update([sheet_data.columns.values.tolist()] + sheet_data.values.tolist())
    print(client_gspread.auth.expiry)

3. 自定义客户端刷新逻辑

如果需要完全掌控过期处理,可以封装客户端获取函数,每次调用前检查有效性:

import gspread
from google.auth.transport.requests import Request

client_gspread = None
def get_valid_gspread_client():
    global client_gspread
    # 客户端不存在或token无效时,重新创建/刷新
    if not client_gspread or not client_gspread.auth.valid:
        if client_gspread:
            client_gspread.auth.refresh(Request())
        else:
            client_gspread = gspread.service_account(filename='client_secret.json')
    return client_gspread

def send_sheet(id_sheet, page_sheet, sheet_data):
    client = get_valid_gspread_client()
    sheet = client.open_by_key(id_sheet).worksheet(page_sheet)
    sheet.clear()
    sheet.update([sheet_data.columns.values.tolist()] + sheet_data.values.tolist())
    print(client.auth.expiry)

关键提示

  • gspread默认会自动处理token刷新,无需手动干预;若需监控过期时间,client_gspread.auth.valid是判断token是否有效的可靠依据。
  • 上述方法均基于google-auth和gspread的原生逻辑,无需额外依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:01:12