- Для процесса авторизации вы хотите показать только URL. Вы не хотите автоматически открывать браузер.
- Вы хотите добиться этого, используя googleapis с python.
Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.
В этом случае, пожалуйста, используйте Flow.from_client_secrets_file
вместо InstalledAppFlow.from_client_secrets_file
.
Модифицированный скрипт:
Когда ваш Сценарий изменен, пожалуйста, измените его следующим образом.
С:
from google_auth_oauthlib.flow import InstalledAppFlow
С:
from google_auth_oauthlib.flow import Flow
и
С:
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(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('calendar', 'v3', credentials=creds)
Кому:
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:
# Create the flow using the client secrets file from the Google API
# Console.
flow = Flow.from_client_secrets_file('client_secret.json', SCOPES, redirect_uri='urn:ietf:wg:oauth:2.0:oob')
# Tell the user to go to the authorization URL.
auth_url, _ = flow.authorization_url(prompt='consent')
print('Please go to this URL: {}'.format(auth_url))
# The user will get an authorization code. This code is used to get the
# access token.
code = input('Enter the authorization code: ')
flow.fetch_token(code=code)
creds = flow.credentials
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('calendar', 'v3', credentials=creds)
- В этом случае при запуске сценария под
token.pickle
не существует, URL для авторизации отображается на консоли. Браузер не открывается. Поэтому, пожалуйста, получите доступ к URL, открыв браузер и авторизовав области. Затем скопируйте код авторизации в консоль и введите клавишу ввода. Таким образом извлекается токен доступа и создается файл token.pickle
.
Примечание:
- Если возникает ошибка, связанная с URI перенаправления, измените
http://localhost
и протестировать снова.
Ссылка:
Если Я неправильно понял ваш вопрос, и это было не то направление, которое вы хотите, извиняюсь.
Добавлено:
- С
I want to print a link instead that the user can click to authenticate
в вашем вопросе я предложил приведенный выше пример сценария. - Начиная с
some way not to manually confirm authorization codes
в вашем ответе, я думаю, что приведенный выше пример сценария не подходит.
В этом случае, как насчет использования учетной записи службы? При использовании учетной записи службы код авторизации не требуется. Сценарий использования учетной записи службы выглядит следующим образом.
Пример сценария:
from google.oauth2 import service_account
from googleapiclient.discovery import build
SERVICE_ACCOUNT_FILE = 'service-account-credentials.json' # Here, please set the creadential file of the service account.
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('calendar', 'v3', credentials=creds)
Примечание:
- Для доступа к календарю Google с помощью Сервисная учетная запись, сначала, пожалуйста, поделитесь календарем Google с адресом электронной почты сервисной учетной записи. Пожалуйста, будьте осторожны.
Ссылка: