【问题标题】:How do I extract the HTML content of a Google Doc from C#?如何从 C# 中提取 Google Doc 的 HTML 内容?
【发布时间】:2013-11-06 10:42:02
【问题描述】:

我们有一个内置于 .Net (C#) 的内部网。我们希望我们的 CMS 能够从 Google Doc 中提取 HTML 内容以与其他内容集成。

具体来说,我们希望编辑器能够创建和维护 Google 文档,并将对该文档的引用(通过其 ID)嵌入到我们内部网上的页面中。渲染页面时,CMS 会联系 Google Docs,获取文档的 HTML 内容,并将其渲染为页面的一部分(是的,会涉及到缓存)。

我已经在 GData API 中转了一圈又一圈。这比我想象的要难。

身份验证是通过 OAuth 进行的,所以我们要做的是为我们的 CMS 创建另一个 Google Apps 用户,这样我就可以通过身份验证了。

但是一旦我检索到一个文档,其中就没有 HTML。有多种属性(包括一个叫作“Content.”的属性,它不是),但我看不到文档的实际 HTML 内容。它似乎有关于文档的各种信息,除了内容本身。

谷歌搜索和研究时间告诉我,我可能必须形成导出 URL,然后通过 HTTP 将其下载为 HTML 文件。我可以在浏览器中执行此操作 - 只需粘贴正确的 URL,就可以了。

但我不能从代码中做到这一点。当然,我可以发出 HTTP 请求,但它没有进行我已经通过的身份验证来获取文档对象本身。

那么,两个问题:

  1. 有更简单的方法吗?我一直怀疑我做错了。
  2. 如何在经过身份验证的用户的上下文中向 Google 文档 URL 发出 HTTP 请求?

【问题讨论】:

    标签: c# gdata google-docs-api gdata-api


    【解决方案1】:

    几个指针...

    1. 作为 Gdata 的替代方案,您可能会发现使用更新的 Drive API 和 SDK 会更容易。有关使用 exportLink 检索文件对象的 API 调用,请参阅 https://developers.google.com/drive/v2/reference/files/get。您可以选择是直接使用 REST API 还是使用 Google 提供的 C# 库来使用云端硬盘。
    2. 将 oauth(更具体地说是 oauth2)作为单独的问题处理。一旦您使 oauth2 工作并赢得了访问令牌,然后(并且只有在那时)继续使用该访问令牌进行 Drive。与 Drive 一样,您可以选择直接使用其 URL 或使用 Google 提供的库来驱动 Oauth。如果您更喜欢 DIY 方法,那么您需要知道的一切都在这里 https://developers.google.com/oauthplayground/https://developers.google.com/accounts/docs/OAuth2

    您询问用户交互。到那个...

    好消息是你可以做你想做的事。具体细节很大程度上取决于谁拥有这些文档。 请记住,Oauth 是关于授权(身份验证是一种副产品)。

    因此,您有一个“用户”拥有的 Google 文档文档“文档”。应用程序“App”想要阅读 Doc。所以第一步是用户授权App访问Doc。这就是以用户为中心的东西。如果 App 请求“离线”访问,则 Oauth 会为其提供一个 refresh-token,App 将存储并随时使用该刷新令牌生成访问令牌并读取 Doc。无需任何用户交互即可从刷新令牌生成访问令牌,它只是对 Google URL 的 POST。

    所以在这种情况下,用户交互只发生一次。

    您可以采取的另一种方法是让应用拥有 Doc,并共享给用户。在这种情况下,App 将(可能)是一个服务帐户 (https://developers.google.com/accounts/docs/OAuth2ServiceAccount)。由于App创建并拥有Doc,用户无需授权。

    【讨论】:

    • 一直在努力让它发挥作用。我仍然看到以用户为中心的内容,例如“重定向 URL”,并且他们的示例打开了一个浏览器窗口等。要清楚——我想在服务器端提取此信息,无人值守。此过程将在没有人工交互的情况下发生,因此人类无法获得授权的凭据或任何东西。换句话说,例如,我希望能够在凌晨 3 点或其他时间运行的作业中对此进行编码。有没有办法做到这一点?
    • 我已经用一些附加信息更新了答案。关键是如果人拥有文档,那么人需要授权网络应用访问它,但这只需要做一次。
    • 我想我已经知道如何措辞了:我不想“授权”应用程序做任何事情。相反,我希望应用程序“充当”特定用户。我的想法是,我将为该应用创建一个 Google 帐户,然后将其邀请到文档中,使其具有读取权限。为什么我不能通过代码模拟那个 Google 帐户? IU 本质上希望代码充当该用户,因此完全避免所有“授权”概念。不可能?
    • 为您的应用程序创建一个帐户,然后让用户将他们的文档共享到该帐户肯定会奏效。但是,该帐户仍需要授权该应用程序以允许其访问该帐户的文档。您只需执行一次此操作即可获取您将存储的刷新令牌。此后,刷新令牌可用于获取访问令牌而无需进一步授权。您可以(可能 - 我会为您检查)使用 oauth playground 来获取刷新令牌。
    • 您似乎可以使用 Oauth2 Playground developers.google.com/oauthplayground 来获取您的刷新令牌。这使您不必编写任何以用户为中心的 Oauth2 代码和回调。我会用步骤更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2012-12-10
    • 2021-09-09
    • 2012-09-03
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多