#python #google-sheets #authorization #google-sheets-api #google-api-python-client
#python #google-sheets #авторизация #google-sheets-api #google-api-python-client
Вопрос:
Я пытаюсь запросить Google Sheets через их API с использованием Python и немного запутался при настройке. Используя их руководство по документации, я аутентифицировался сам и получил JSON-файл с идентификатором клиента OAuth 2.0, который я загрузил, и одобрил доступ к моему приложению, что соответствует моему скрипту, верно?
Однако каждый раз, когда я запускаю свой скрипт, мне продолжают предлагать авторизовать мое приложение. Я запускаю скрипт, и он автоматически открывает страницу в моем браузере на странице, похожей на страницу входа в Google, где он спрашивает, хочу ли я, чтобы Quickstart получил доступ к вашей учетной записи Google
Я скопировал часть авторизации непосредственно с этой страницы, но не знаю, что изменить или сделать на их странице API и сервисов, чтобы это работало без проблем
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
if os.path.exists("token.pickle"):
with open("token.pickle", 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file("googlesheetscreds.json",
SCOPES)
creds = flow.run_local_server()
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
Нужно ли мне изменять области?
Комментарии:
1. Какие виды учетных данных вы запросили? Если они не предоставляют автономный доступ, то вы не сможете выполнить без перепрошивки. (т. Е. вы проверили удаленные
creds
, чтобы увидеть, разрешают ли они обновление?)2. А, понятно. Если вы говорите о типе учетных данных, который указан на странице API и служб, он указан как просто
Other
тип. Если я пытаюсь поместить данные в электронную таблицу, получаю ли я доступ к данным приложения или пользовательским данным?3. Хм, итак, первым набором учетных данных был идентификатор клиента OAuth 2.0, и я прошел через мастер, чтобы создать другой набор, который в итоге стал ключом учетной записи службы, который не работает. Теперь я получаю эту ошибку:
ValueError: Client secrets must be for a web or installed app.
4.@simplycoding При
googlesheetscreds.json
изменении файла учетной записи службы ваш скрипт должен быть изменен для использования учетной записи службы, подобнойcredentials = service_account.Credentials.from_service_account_file("### JSON file of Service Account ###", scopes=SCOPES)
service = build(serviceName='sheets', version='v4', credentials=credentials)
. Я разместил в качестве комментария, потому что я не уверен, хотите ли вы использовать учетную запись службы. Если я неправильно понял вашу ситуацию, я приношу извинения.5. Вы можете запросить автономный доступ и сохранить учетные данные с помощью токена обновления или использовать учетную запись службы для олицетворения пользователя. Взгляните на библиотеку, которую я создал и использую каждый раз для аутентификации в Google APIs easygoogle . Любые мысли приветствуются.
Ответ №1:
Похоже, вы хотите использовать учетную запись службы, вам следует вернуться в свою облачную консоль Google, настроить ее и загрузить новый файл JSON.
Документация Google о типах учетных данных и о том, как их настроить, здесь
Затем вы должны изменить свой код, чтобы он загружался и запускался с учетными записями служб вместо обычного oauth, проблема в «InstalledAppFlow», вот полный код:
import os.path
import pickle
from google.auth.transport.requests import Request
from google.oauth2 import service_account
from googleapiclient.discovery import build
def create_credential():
if os.path.exists("token.pickle"):
with open("token.pickle", 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
# flow = InstalledAppFlow.from_client_secrets_file("googlesheetscreds.json", SCOPES)
# creds = flow.run_local_server()
creds = service_account.Credentials.from_service_account_file('googlesheetscreds.json')
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('sheets', 'v4', credentials=creds)
# Tip: return the spreadsheet already created and re-use it along with your code,
# if you create a new one in every request it will leak around 30MB each time
return service.spreadsheets()