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

Node.js Discord Bot:Google Sheets API服务账号适配失败求助

解决Google Sheets API令牌自动过期问题(改用服务账号)

核心修改思路

服务账号(Service Account)无需手动刷新令牌,通过JWT认证即可实现长期稳定访问Google Sheets API。以下是针对你现有代码的完整修改方案:

步骤1:准备服务账号密钥

  • 在Google Cloud控制台创建服务账号,下载对应的JSON密钥文件(命名为service-account-key.json)并放到项目根目录
  • 打开目标Google Sheets表格,右上角点击「共享」,输入密钥文件中client_email字段的邮箱地址,赋予编辑权限

步骤2:替换授权代码

删除原有的loadSavedCredentialsIfExist、saveCredentials和authorize函数,替换为以下代码:

const fs = require("fs");
const path = require("path");
const { google } = require('googleapis');
const { sheet } = require("../config.json")
const app = require('../app.js')

const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
const SERVICE_ACCOUNT_KEY_PATH = path.join(process.cwd(), 'service-account-key.json');

let gclient = undefined
exports.initialize = authorize

async function authorize() {
  // 加载服务账号密钥文件
  const keyFileContent = fs.readFileSync(SERVICE_ACCOUNT_KEY_PATH);
  const credentials = JSON.parse(keyFileContent);

  // 初始化JWT认证客户端
  gclient = new google.auth.JWT(
    credentials.client_email,
    null,
    credentials.private_key,
    SCOPES
  );

  // 完成认证
  await gclient.authorize();
  console.log("使用服务账号认证成功!");
}

关键说明

  • 移除了原token.json相关逻辑:服务账号无需保存刷新令牌,每次启动都会通过密钥自动完成认证
  • google.auth.JWT是服务账号专属认证方式,直接使用密钥文件中的client_email和private_key即可完成身份验证
  • 必须确保服务账号拥有目标表格的访问权限,否则会抛出权限错误

验证方法

启动Discord Bot后,检查控制台是否输出「使用服务账号认证成功!」,并测试Bot对Google Sheets的读写操作是否正常,此时令牌不会再每7天过期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:22:36