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

如何使用OAuth2凭据对Google Docs HTML导出请求进行身份验证以获取目标文档

如何使用OAuth2凭据对Google Docs HTML导出请求进行身份验证以获取目标文档

看起来你已经搞定了OAuth2客户端的基础配置,但问题出在直接调用fetch的时候没带上身份验证信息——Google的文档导出端点必须要有效的访问令牌才能返回你要的文档,不然就会自动跳转到登录页面。我来给你说说怎么修复,顺便把代码调整得更稳妥:

核心问题&修复思路

你已经用refresh_token配置好了oauth2Client,但这个客户端的凭据不会自动附加到你手动发起的fetch请求里。我们需要先从oauth2Client获取一个有效的访问令牌,然后把这个令牌放到请求的Authorization头里,这样Google就能识别你的身份了。

修改后的完整代码

import "dotenv/config";
import express from "express";
import { google } from "googleapis";
import * as fs from "fs";

const app = express();
const port = 3000;

// 初始化OAuth2客户端(这部分你原来的代码没问题)
const oauth2Client = new google.auth.OAuth2(
  process.env.CLIENT_ID,
  process.env.CLIENT_SECRET,
  process.env.REDIRECT_URL
);
oauth2Client.setCredentials({ refresh_token: process.env.REFRESH_TOKEN });

// 把文档导出逻辑封装成异步函数,避免顶层await的问题
async function exportGoogleDocToHtml() {
  try {
    // 从OAuth2客户端获取有效访问令牌(refresh_token会自动帮你刷新过期的token)
    const { token } = await oauth2Client.getAccessToken();
    
    // 发起请求时带上Authorization头
    const response = await fetch(
      `https://docs.google.com/feeds/download/documents/export/Export?id=${process.env.DOCUMENT_ID}&exportFormat=html`,
      {
        headers: {
          Authorization: `Bearer ${token}`
        }
      }
    );

    // 检查请求是否成功
    if (!response.ok) {
      throw new Error(`请求失败:${response.status} ${response.statusText}`);
    }

    // 获取HTML文本并写入文件(注意不要用JSON.stringify,不然会把HTML转成JSON字符串)
    const htmlContent = await response.text();
    fs.writeFileSync("file_readable.html", htmlContent);
    console.log("文档HTML已成功导出到file_readable.html");
  } catch (err) {
    console.error("导出文档时出错:", err.message);
  }
}

// 可以通过访问根路由触发导出,或者在服务器启动时自动执行
app.get("/", async (req, res) => {
  await exportGoogleDocToHtml();
  res.send("文档导出任务已执行!");
});

app.listen(port, () => {
  console.log(`服务器运行在 http://localhost:${port}`);
});

关键修改点说明

  1. 添加访问令牌到请求头:通过oauth2Client.getAccessToken()拿到有效令牌后,在fetch的headers里加入Authorization: Bearer ${token},这是让Google认可你身份的关键步骤。
  2. 封装异步逻辑:把导出代码放到异步函数里,避免了顶层await可能带来的问题(Node.js模块顶层await需要特定配置,封装成函数更通用)。
  3. 修复文件写入问题:你原来的代码用了JSON.stringify(fileData),这会把HTML文本转成JSON字符串,导致导出的文件内容异常,直接写入原始HTML文本就好。
  4. 增加错误处理:添加了请求状态检查和try-catch,方便排查权限不足、文档不存在之类的问题。

额外注意事项

  • 确保你的OAuth2凭据(refresh_token)拥有https://www.googleapis.com/auth/documents或者https://www.googleapis.com/auth/drive的权限,不然会返回权限不足的错误。
  • 如果是第一次获取refresh_token,授权时一定要勾选对应的权限范围,不然后续请求会失败。

备注:内容来源于stack exchange,提问作者Karan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:08:13