Создание программы на Python, которая хочет получить доступ к пользовательским страницам Google через gspread. Однако каждый раз, когда программа запускается, она запрашивает у пользователя разрешение на доступ к своей учетной записи Google.
Я хочу знать, возможно ли, и если да, то как сохранить токен, который получает программа, чтобы в будущем использование программы не запрашивало их снова каждый раз.
Я несколько часов копался в поиске решения этой проблемы, которое использует идентификатор клиента, а не служебную учетную запись (поэтому программа всегда получает доступ к учетной записи Google пользователя, а не к общедоступной) и может подключиться к безуспешно.
Я предполагаю, что то, что я хочу, возможно, поскольку руководство по быстрому запуску API листов Google для python работает именно так, как мне нужно, за исключением того, что я не знаю, как подключить его к gspread, который является необходимой библиотекой для этого проекта.
Что у меня сейчас есть и работает:
#Import libraries
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run_flow, argparser
from oauth2client.file import Storage
from oauth2client.client import AccessTokenCredentials
import requests
import gspread, ast
#Setup Oauth2
CLIENT_ID = '<Client ID>'
CLIENT_SECRET = '<Client Secret>'
flow = OAuth2WebServerFlow(client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
scope='https://spreadsheets.google.com/feeds',
redirect_uri='http://localhost:8080/')
storage = Storage('mycredentials.data')
credentials = run_flow(flow, storage, argparser.parse_args([]))
#Attempt login
data = {
'refresh_token' : credentials.refresh_token,
'client_id' : credentials.client_id,
'client_secret' : credentials.client_secret,
'grant_type' : 'refresh_token',
}
r = requests.post('https://accounts.google.com/o/oauth2/token', data = data)
credentials.access_token = ast.literal_eval(r.text)['access_token']
gc = gspread.authorize(credentials)
Однако, как указано выше, пользователь будет запрашивать разрешение каждый раз, когда он запускается, я бы хотел, чтобы он "сохранил" это разрешение, чтобы избежать его при запуске в будущем.