7

Quiero acceder a la API de Google Calendar para insertar entradas con Python. Creé una cuenta de servicio en la consola de la API de Google, agregué una clave privada y la descargué.Google Calendar API - Acceda al propio calendario a través de la cuenta de servicio

Pero cuando trato de modificar cualquiera de mi calendario, está en la misma cuenta, aparece el siguiente mensaje de error. La lectura funciona

Código es

import httplib2 

from oauth2client.client import SignedJwtAssertionCredentials 
from apiclient.discovery import build 

event = { 
     'summary' : 'Appointment', 
     'location' : 'Somewhere', 
     'start' : { 
        'dateTime' : '2012-09-03T10:00:00.000-07:00' 
        }, 
     'end' : { 
       'dateTime' : '2012-09-03T10:25:00.000-07:00' 
        } 
} 


f = file("key.p12", "rb") 
key = f.read() 
f.close() 

credentials = SignedJwtAssertionCredentials(
               service_account_name='[email protected]', 
               private_key=key, 

               scope='https://www.googleapis.com/auth/calendar'            
              ) 

http = httplib2.Http() 
http = credentials.authorize(http) 

service = build('calendar', 'v3', http=http) 
request = service.events().insert(calendarId='[email protected]', body=event) 

response = request.execute() 

print(response) 

mensaje de error es:

apiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/[email protected]/events?alt=json returned "Forbidden"> 

yo habría pensado que puedo acceder a mis datos con esta cuenta de servicio, pero parece no ser.

Google afirma que

Después de la cuenta de servicio ha sido creado, también tendrá acceso a el ID de cliente asociado con la clave privada. Necesitará ambos al codificar su aplicación. - https://developers.google.com/accounts/docs/OAuth2?hl=de#scenarios

I Googled alrededor de 2 horas, pero parece estar muy mal documentado. ¿Hay alguna manera de insertar nuevos eventos a través de la API de Google Calendar sin interacción del usuario (también conocido como OAuth de 3 patas) o hay alguna forma de solucionarlo?

Acabo de encontrar obsoleto ClientLoging. ¿Por qué Google lo hace tan difícil?

Saludos cordiales

Respuesta

1

me di cuenta de que el 3 intensificación de OAuth funciona si uno vertederos de las credenciales resultantes a JSON y los lee en cada vez que los necesite.

De modo que el flujo es: Añadir su client_secrets.json como se indica en Google API en la misma carpeta que este script. Agarra la clave de la url dada en el aviso. Introdúzcalo bajo petición al aviso. Fiesta! 11. Espero que estas credenciales duren para siempre.

from oauth2client.client import flow_from_clientsecrets 

flow = flow_from_clientsecrets('client_secrets.json', 
           scope='https://www.googleapis.com/auth/calendar', 
           redirect_uri='urn:ietf:wg:oauth:2.0:oob') 

auth_uri = flow.step1_get_authorize_url() 
print('Visit this site!') 
print(auth_uri) 
code = raw_input('Insert the given code!') 
credentials = flow.step2_exchange(code) 
print(credentials) 

with open('credentials', 'wr') as f: 
    f.write(credentials.to_json()) 

Ahora, en la propia aplicación:

def __create_service(): 
    with open('credentials', 'rw') as f: 
     credentials = Credentials.new_from_json(f.read()) 

    http = httplib2.Http() 
    http = credentials.authorize(http) 

    return build('calendar', 'v3', http=http) 

para obtener un objeto de servicio, ahora se puede llamar

service = __create_service() 

y utilizar la API en él.

+0

he seguido su solución y mis credenciales no están en el archivo. ¿Puedes decirme cómo puedo cargar esos archivos y luego usar 'credentials.authorize()'. – user26

+0

Escribí un ejemplo hace mucho tiempo, puedes encontrarlo en https://github.com/Rentier/ReindeerIkenga – reindeer

Cuestiones relacionadas