#python-3.x #google-api #google-oauth #google-calendar-api
#python-3.x #google-api #google-oauth #google-calendar-api
Вопрос:
Я получаю эту ошибку при попытке получить доступ к API календаря Google
ошибка:
Ошибка 400: redirect_uri_mismatch перенаправление URI в запросе, http://localhost:37461 /, не соответствует тем, которые авторизованы для клиента OAuth. Чтобы обновить авторизованные URI перенаправления, посетите: https://console.developers.google.com/apis/credentials/oauthclient/${your_client_id}?project=${your_project_number}
этот порт, упомянутый выше http://localhost:37461/
, всегда меняется.
И вот как я установил свой credentials.json
{
"web": {
"client_id": "<id>.apps.googleusercontent.com",
"project_id": "stunning-surge-291419",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_secret": "***",
"redirect_uris": ["http://localhost:3000/create"],
"javascript_origins": ["http://localhost:3000"]
}
}
И это python
я использую для перечисления событий в:
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar']
CREDENTIALS_FILE = "credentials.json"
def get_calendar_service():
creds = None
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_FILE, 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)
return service
from createevent import get_calendar_service
def main():
service = get_calendar_service()
# Call the Calendar API
print('Getting list of calendars')
calendars_result = service.calendarList().list().execute()
calendars = calendars_result.get('items', [])
if not calendars:
print('No calendars found.')
for calendar in calendars:
summary = calendar['summary']
id = calendar['id']
primary = "Primary" if calendar.get('primary') else ""
print("%st%st%s" % (summary, id, primary))
if __name__ == '__main__':
main()
И я также установил URL-адреса перенаправления в консоли:
Может кто-нибудь, пожалуйста, помогите мне?
Комментарии:
1. В вашем случае, как насчет изменения URL перенаправления с
http://localhost:3000/create
наhttp://localhost:3000
, и сценарий будет изменен сcreds = flow.run_local_server(port=0)
наcreds = flow.run_local_server(port=3000)
. Кстати, из вашегоcredentials.json
и изображения кажется, чтоhttp://localhost
это не сохраняется. Поэтому, когда вы изменили URL перенаправления, пожалуйста, нажмите кнопку Сохранить. Пожалуйста, будьте осторожны с этим. Если этот комментарий не был полезен для вашей ситуации, я прошу прощения.2. Сработало ли предложение @Tanaike для вашей проблемы?
Ответ №1:
на самом деле вы можете указать порт для исправления uri перенаправления, чтобы вы были перенаправлены на правильный URL, в вашем случае вы были перенаправлены на http://localhost:37461 / :37461
это число рандомизируется, если вы не указываете конкретный порт, поскольку @Tanaike упоминает, что вам нужно будет исправить порт на 3000как показано на вашем скриншоте. creds = flow.run_local_server(port=3000)