使用API​​密钥(C#)将数据写入Google电子表格

时间:2017-02-03 01:07:40

标签: c# google-spreadsheet-api

我有一个应用程序,允许我使用API​​密钥从Google电子表格中读取数据。我只是对这个地址进行HTTP GET并获得数据响应。

https://sheets.googleapis.com/v4/spreadsheets/18soCZy9H4ZGuu**********BeHlNY1lD8at-Pbjmf8c/values/Sheet1!A1?key=AIzaSyAYJ***********pB-4iKZjYf4y0vhXP8OM

但是当我尝试使用HTTP PUT写入数据来执行相同的操作

https://sheets.googleapis.com/v4/spreadsheets/18soCZy9H4ZGuu**********BeHlNY1lD8at-Pbjmf8c/values/Sheet1!A4?valueInputOption=RAW?key=AIzaSyAYJ***********pB-4iKZjYf4y0vhXP8OM

它给我401错误。 用于发出PUT请求的代码:

 using (WebClient wc = new WebClient())
 {
     byte[] res = wc.UploadData(link, "PUT", Encoding.ASCII.GetBytes(textBox1.Text));
     MessageBox.Show(Encoding.Default.GetString(res));
 }

此外,电子表格完全公开,任何人都可以在没有身份验证的情况下进行读写操作。我的猜测是我无法使用API​​密钥将数据写入电子表格,只有这样才能使用OAuth。

更新 所以我刚刚尝试使用Google.Apis.Sheets.v4来编写值,现在我几乎100%确定API Key无法用于将数据写入Google Spreadsheet。那么,我将使用OAuth 2.0。

3 个答案:

答案 0 :(得分:3)

好吧,也许你是对的,这里的问题是API_KEY本身。

如果您查看Sheets API documentation,则说明您的应用程序发送到Google表格API的每个请求都需要向Google标识您的应用程序。有两种方法可以识别您的应用:使用OAuth 2.0 token(也授权请求)和/或使用应用程序API key。以下是如何确定使用哪些选项:

  • 如果请求需要授权(例如请求个人的私人数据),则应用程序必须为请求提供OAuth 2.0令牌。应用程序还可以提供API密钥,但它不必提供。

  • 如果请求不需要授权(例如公共数据请求),则应用程序必须提供API密钥或OAuth 2.0令牌,或两者兼而有之 - 无论哪种选项最方便你。

因此意味着OAuth 2.0 token或API密钥在您的情况下将起作用,因为该文件是公共的。但问题出在你正在做的PUT请求中,我们可以假设API密钥没有使用它。但是,我们有替代方案,那就是OAuth。

我在这里也找到了一个相关的SO question可能对你有帮助。

答案 1 :(得分:1)

对于仍然希望得到一个简单答案的人来说,似乎不会有一个 - 任何写入工作表,无论工作表权限如何,都需要OAuth2:

'这是故意行为。虽然公开表是匿名可读的,但由于各种原因目前不支持匿名编辑。

在此背景下,“任何人”==拥有Google帐户的任何人。 HERE

答案 2 :(得分:0)

此处未提及的一种选择是改为使用服务帐户。服务帐户就像用户,但不隶属于任何人。而是将它们附加到项目中。

服务帐户具有电子邮件地址和私钥。两者都可用于创建JWTClientAuth,并且可用于在实例化API时对其进行身份验证或对每个请求进行身份验证。

服务帐户的优点是它的工作方式类似于API KEY-无需要求用户将URL复制到浏览器,然后再将代码复制回应用程序-但因为它可以充当经过身份验证的用户,可以将服务帐户的电子邮件地址作为编辑者添加到Google表格中。有了此功能,应用程序就可以对工作表具有完全的写访问权,而不必处理授权码,刷新令牌和复制/粘贴。

您可以看到一个Python示例Python With Google Sheets Service Account Step By Step和一个Node.js示例Accessing Google APIs Using Service Account in Node.js。我按照以下示例进行设置。

由于您使用的是C#,因此您可能会发现Writing to Google Sheets API Using .NET and a Service Account会有所帮助。

此方法从JSON文件读取服务帐户凭据,然后实例化SheetsService:

private void ConnectToGoogle() {
    GoogleCredential credential;

    // Put your credentials json file in the root of the solution and make sure copy to output dir property is set to always copy 
    using (var stream = new FileStream(Path.Combine(HttpRuntime.BinDirectory, "credentials.json"), 
        FileMode.Open, FileAccess.Read)) {
            credential = GoogleCredential.FromStream(stream).CreateScoped(_scopes);
    }

    // Create Google Sheets API service.
    _sheetsService = new SheetsService(new BaseClientService.Initializer() { 
        HttpClientInitializer = credential, ApplicationName = _applicationName 
    });
}

然后,您可以使用Google Sheets .NET Client Library写入数据。