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
相关产品推荐
相关产品推荐

