API Google Таблиц v4 получает ответы HTTP 401 для общедоступных каналов
Мне не повезло получить ответ от v4 API Google Таблиц при работе с общедоступной (т.е. "Публикацией в Интернете" и с общей таблицей "Любой в Интернете" ).
В соответствующей документации указано:
"Если для запроса не требуется авторизация (, например запрос общедоступных данных), то приложение должно предоставить либо ключ API, либо токен OAuth 2.0, либо оба варианта - наиболее удобный для вас."
И для предоставления ключа API в документации указано:
"После того, как у вас есть ключ API, ваше приложение может добавить ключ запроса query = yourAPIKey ко всем URL-адресам запроса."
Итак, я должен получить ответ, перечисляющий листы в общедоступной электронной таблице по следующему URL-адресу:
https://sheets.googleapis.com/v4/spreadsheets/ {spreadsheetId}? key = {myAPIkey}
(с, очевидно, идентификатором и ключом, указанным в строке пути и запроса)
Однако, когда я это делаю, я получаю ответ HTTP 401:
{
error: {
code: 401,
message: "The request does not have valid authentication credentials.",
status: "UNAUTHENTICATED"
}
}
Кто-нибудь может заставить это работать против общедоступной книги? Если нет, может ли кто-либо отслеживать этот поток со стороны Google либо комментировать, либо предоставлять рабочий образец?
Ответы
Ответ 1
Мне это удалось. Даже сначала я был разочарован. И это не ошибка. Вот как я это сделал:
- Сначала включите их в своем GDC, чтобы избавиться от ошибок проверки подлинности.
-Google Apps Script API выполнения
-Google Sheets API
Примечание. Убедитесь, что учетная запись Google, которую вы использовали в GDC, должна быть той же учетной записью, которую вы используете в проекте Spreadsheet, иначе вы можете получить сообщение об ошибке "The API Key and the authentication credential are from different projects"
.
- Перейдите в https://developers.google.com/oauthplayground, где вы приобретете токены авторизации.
- На шаге 1 выберите Google Таблицы API v4 и выберите область
https://www.googleapis.com/auth/spreadsheets
, чтобы у вас были права на чтение и запись ботов.
- Нажмите кнопку Authorize APIs. Разрешите аутентификацию, и вы перейдете к этапу 2.
- На шаге 2 нажмите Код авторизации Exchange для кнопки токенов. После этого перейдите к шагу 3.
- На шаге 3 время для вставки URL-запроса. Поскольку по умолчанию используется метод GET, нажмите кнопку Отправить кнопку запроса.
Примечание. Убедитесь, что ваши URL-адреса указаны в Документах по электронной почте.
Здесь мой пример URL-запроса:
https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?includeGridData=false
Я получил HTTP/1.1 200 OK
, и он отобразил мои запрошенные данные. Это касается всех серверных процессов Spreadsheetv4.
Надеюсь, что это поможет.
Ответ 2
Мы недавно исправили это, и теперь он должен работать. Извините за проблемы, повторите попытку.
Документ должен быть общим для "Любой, у кого есть ссылка" или "Публикация в Интернете". (Примечание: параметры публикации из "Файл → Опубликовать в Интернете" не имеют значения, в отличие от API v3.)
Ответ 3
Это не решение проблемы, но я думаю, что это хороший способ достичь цели. На сайте http://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/ Я нашел, как обновлять таблицу с помощью Google Apps Script. Это пример метода GET. Я попытаюсь показать вам метод POST в формате JSON.
Как создать POST: создать электронную таблицу Google, в закладке Инструменты> Редактор сценариев вставьте следующий скрипт. Измените сценарий, введя соответствующие идентификаторы таблиц и имя вкладки листа (строки 27 и 28 в скрипте).
function doPost(e)
{
var success = false;
if (e != null)
{
var JSON_RawContent = e.postData.contents;
var PersonalData = JSON.parse(JSON_RawContent);
success = SaveData(
PersonalData.Name,
PersonalData.Age,
PersonalData.Phone
);
}
// Return plain text Output
return ContentService.createTextOutput("Data saved: " + success);
}
function SaveData(Name, Age, Phone)
{
try
{
var dateTime = new Date();
// Paste the URL of the Google Sheets starting from https thru /edit
// For e.g.: https://docs.google.com/---YOUR SPREADSHEET ID---/edit
var MyPersonalMatrix = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/---YOUR SPREADSHEET ID---/edit");
var MyBasicPersonalData = MyPersonalMatrix.getSheetByName("BasicPersonalData");
// Get last edited row
var row = MyBasicPersonalData.getLastRow() + 1;
MyBasicPersonalData.getRange("A" + row).setValue(Name);
MyBasicPersonalData.getRange("B" + row).setValue(Age);
MyBasicPersonalData.getRange("C" + row).setValue(Phone);
return true;
}
catch(error)
{
return false;
}
}
Сохраните сценарий и перейдите на вкладку " Опубликовать"> "Развернуть как веб-приложение".
Выполните приложение как: Me [email protected],
Кто имеет доступ к приложению: любой, даже анонимный
Затем, чтобы проверить, вы можете использовать приложение Postman. ![enter image description here]()
Или используя UWP:
private async void Button_Click(object sender, RoutedEventArgs e)
{
using (HttpClient httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(@"https://script.google.com/");
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("utf-8"));
string endpoint = @"/macros/s/---YOUR SCRIPT ID---/exec";
try
{
PersonalData personalData = new PersonalData();
personalData.Name = "Jarek";
personalData.Age = "34";
personalData.Phone = "111 222 333";
HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(personalData), Encoding.UTF8, "application/json");
HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(endpoint, httpContent);
if (httpResponseMessage.IsSuccessStatusCode)
{
string jsonResponse = await httpResponseMessage.Content.ReadAsStringAsync();
//do something with json response here
}
}
catch (Exception ex)
{
}
}
}
public class PersonalData
{
public string Name;
public string Age;
public string Phone;
}
Для вышеуказанного кода требуется NuGet Newtonsoft.Json.
Результат: ![enter image description here]()