Как использовать google.auth вместо oauth2client в Python, чтобы получить доступ к моему Календарю Google - PullRequest
0 голосов
/ 29 августа 2018

Несколько лет назад я создал небольшую программу на Python, которая могла поддерживать мой календарь с помощью oauth2client, который теперь устарел и заменен на google.auth - но я не могу найти какую-либо полезную документацию, и моя программа перестала работать с жалобой на _module KeyError, которая кажется, никто не решил, кроме как путем обновления.

Я не могу понять, как заменить oauth2client на google.auth:

import datetime
import httplib2
import os

from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools

...

credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build('calendar', 'v3', http=http)

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Согласно примечаниям по устареванию oauth2client замена для управления учетными данными пользователя Google - google-auth-oauthlib . Ниже приведен фрагмент кода, работающий на моем ПК (python 3.6).

Как видно из документации, новая библиотека не сохраняет учетные данные, поэтому я использую pickle для их сохранения. Возможно, в зависимости от требований вашего приложения, вы хотите иметь более надежное решение (например, базу данных).

import os
import pickle

from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

SCOPES = ['https://www.googleapis.com/auth/calendar.readonly', ]


# we check if the file to store the credentials exists
if not os.path.exists('credentials.dat'):

    flow = InstalledAppFlow.from_client_secrets_file('client_id.json', SCOPES)
    credentials = flow.run_local_server()

    with open('credentials.dat', 'wb') as credentials_dat:
        pickle.dump(credentials, credentials_dat)
else:
    with open('credentials.dat', 'rb') as credentials_dat:
        credentials = pickle.load(credentials_dat)

if credentials.expired:
    credentials.refresh(Request())

calendar_sdk = build('calendar', 'v3', credentials=credentials)

calendars_get_params = {
        'calendarId': 'primary',
    }

test = calendar_sdk.calendars().get(**calendars_get_params).execute()
print(test)
0 голосов
/ 30 августа 2018

Я не проверял это тщательно, но он работает для тестирования фрагментов с моей личной учетной записью. Я уверен, что есть изменения, которые могут и / или должны быть внесены в него для корпоративных приложений, например, передача экземпляров auth'd Http(), обнаружение изменений в области и т. Д.

Вы можете просмотреть полный код на моем репозитории GitHub :

Требования:

  • Google-Апи-питон-клиент
  • Google-аутентификации
  • Google-AUTH-oauthlib
  • что бы ни делало выше, потяните в

Я использую класс InstalledAppFlow и в целом следовал инструкциям Руководства по аутентификации Google Python .

Код (Python 3.6)

# Google API imports
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow

SCOPES = ['your scopes', 'here']

def get_saved_credentials(filename='creds.json'):
    '''Read in any saved OAuth data/tokens
    '''
    fileData = {}
    try:
        with open(filename, 'r') as file:
            fileData: dict = json.load(file)
    except FileNotFoundError:
        return None
    if fileData and 'refresh_token' in fileData and 'client_id' in fileData and 'client_secret' in fileData:
        return Credentials(**fileData)
    return None

def store_creds(credentials, filename='creds.json'):
    if not isinstance(credentials, Credentials):
        return
    fileData = {'refresh_token': credentials.refresh_token,
                'token': credentials.token,
                'client_id': credentials.client_id,
                'client_secret': credentials.client_secret,
                'token_uri': credentials.token_uri}
    with open(filename, 'w') as file:
        json.dump(fileData, file)
    print(f'Credentials serialized to {filename}.')

def get_credentials_via_oauth(filename='client_secret.json', scopes=SCOPES, saveData=True) -> Credentials:
    '''Use data in the given filename to get oauth data
    '''
    iaflow: InstalledAppFlow = InstalledAppFlow.from_client_secrets_file(filename, scopes)
    iaflow.run_local_server()
    if saveData:
        store_creds(iaflow.credentials)
    return iaflow.credentials

def get_service(credentials, service='sheets', version='v4'):
    return build(service, version, credentials=credentials)

Использование тогда:

creds = get_saved_credentials()
if not creds:
    creds = get_credentials_via_oauth()
sheets = get_service(creds)
...