5

Estoy trabajando en mi primera aplicación para utilizar Google Api para Calendar. He leído los ejemplos de Google en: https://developers.google.com/google-apps/calendar/instantiateGoogle Api Auth Http Module Error

La primera vez que ejecuté el programa a continuación fue exitoso. Permití que mi aplicación accediera a mi cuenta de Google y la aplicación creó un archivo calendar.dat con la información de autenticación en mi directorio de aplicaciones. Después de renombrar el archivo, el código estaba en la autenticación y dejó de funcionar. Ya borré el archivo por completo y lo recreé desde el principio, pero el error persiste.

Todavía obtengo la página de autenticación de Google y aún puedo confirmar el acceso, después de lo cual recibo un mensaje de que se completó el flujo de autenticación.

Este es el código (estándar ejemplo Google, que me llene con mis detalles de la aplicación):

import gflags 
import httplib2 

from apiclient.discovery import build 
from oauth2client.file import Storage 
from oauth2client.client import OAuth2WebServerFlow 
from oauth2client.tools import run 

FLAGS = gflags.FLAGS 

# Set up a Flow object to be used if we need to authenticate. This 
# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with 
# the information it needs to authenticate. Note that it is called 
# the Web Server Flow, but it can also handle the flow for native 
# applications 
# The client_id and client_secret are copied from the API Access tab on 
# the Google APIs Console 
FLOW = OAuth2WebServerFlow(
    client_id='YOUR_CLIENT_ID', 
    client_secret='YOUR_CLIENT_SECRET', 
    scope='https://www.googleapis.com/auth/calendar', 
    user_agent='YOUR_APPLICATION_NAME/YOUR_APPLICATION_VERSION') 

# To disable the local server feature, uncomment the following line: 
# FLAGS.auth_local_webserver = False 

# If the Credentials don't exist or are invalid, run through the native client 
# flow. The Storage object will ensure that if successful the good 
# Credentials will get written back to a file. 
storage = Storage('calendar.dat') 
credentials = storage.get() 
if credentials is None or credentials.invalid == True: 
    credentials = run(FLOW, storage) 

# Create an httplib2.Http object to handle our HTTP requests and authorize it 
# with our good Credentials. 
http = httplib2.Http() 
http = credentials.authorize(http) 

# Build a service object for interacting with the API. Visit 
# the Google APIs Console 
# to get a developerKey for your own application. 
service = build(serviceName='calendar', version='v3', http=http, 
     developerKey='YOUR_DEVELOPER_KEY') 

Y esta es la salida:

Your browser has been opened to visit: 

    https://accounts.google.com/o/oauth2/auth? (auth url shortened) 

If your browser is on a different machine then exit and re-run this 
application with the command-line parameter 

    --noauth_local_webserver 

Traceback (most recent call last): 
    File "C:\Users\Desktop\Google Drive\Code\Python\Rooster\calendar.py", line 2, in <module> 
    import httplib2 
    File "C:\Python27\lib\site-packages\httplib2-0.7.6-py2.7.egg\httplib2\__init__.py", line 42, in <module> 
    import calendar 
    File "C:\Users\Desktop\Google Drive\Code\Python\Rooster\calendar.py", line 33, in <module> 
    credentials = run(FLOW, storage) 
    File "C:\Python27\lib\site-packages\google_api_python_client-1.0-py2.7.egg\oauth2client\util.py", line 120, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\google_api_python_client-1.0-py2.7.egg\oauth2client\tools.py", line 169, in run 
    credential = flow.step2_exchange(code, http=http) 
    File "C:\Python27\lib\site-packages\google_api_python_client-1.0-py2.7.egg\oauth2client\util.py", line 120, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\google_api_python_client-1.0-py2.7.egg\oauth2client\client.py", line 1128, in step2_exchange 
    http = httplib2.Http() 
AttributeError: 'module' object has no attribute 'Http' 

Respuesta

4

El problema es que en el directorio de ejecución usted tiene el archivo llamado calendar.py. Cuando el httplib2 de Google quiere importar un módulo de calendario estándar, obtiene el local en su lugar. En el local lo ejecuta para realizar la importación. Pero como httplib2 todavía no se ha importado por completo, el código de calendar.py no funciona correctamente. Simplemente cambie el nombre de calendar.py a algo como myCalendar.py.

+0

Muchas gracias, ya lo había intentado, ya que sospechaba que ese era el problema, sin embargo, no funcionaría. Estoy codificando en Aptana3 y renombré el archivo en el programa. Sin embargo, después de leer su comentario y consultar el directorio, parece que Aptana también genera archivos python compilados, por lo que aún había un calendario.py adicional en el directorio. – Difusio

+1

Eso no es Aptana sino la pitón, supongo. El intérprete de Python crea las versiones compiladas de forma predeterminada. –

Cuestiones relacionadas