tutorial google example python google-analytics google-analytics-api google-api-python-client oauth2client

example - google api python client tutorial



¿Cómo obtener las credenciales de Google Analytics sin gflags-usando run_flow() en su lugar? (3)

Este fragmento de código me funciona para la API de Gmail.

(También este enlace ayudó. Herramientas de línea de comandos )

import argparse import httplib2 from oauth2client.tools import run_flow from oauth2client.tools import argparser from oauth2client.file import Storage CLIENT_SECRETS_FILE = "your_file.json" OAUTH_SCOPE = ''https://www.googleapis.com/auth/gmail.readonly'' STORAGE = Storage("storage") flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, scope=OAUTH_SCOPE) http = httplib2.Http() credentials = STORAGE.get() if credentials is None or credentials.invalid: #magic parser = argparse.ArgumentParser(parents=[argparser]) flags = parser.parse_args() credentials = run_flow(flow, STORAGE, flags, http=http) http = credentials.authorize(http) gmApi = build(''gmail'', ''v1'', http=http) # ...

Esto puede tardar un segundo en explicarse, así que por favor tengan paciencia conmigo:

Estoy trabajando en un proyecto de trabajo que me exige obtener datos de Google Analytics. Originalmente hice esto siguiendo este link , así que después de instalar el cliente de API, pip install --upgrade google-api-python-client y configuré las cosas como client_secrets.json , quería que se instalara gflags para ejecutar la run() declaración. (es decir, credentials = run(FLOW, storage) )

Ahora, estaba recibiendo el mensaje de error para instalar gflags o mejor para usar run_flow() (el mensaje de error exacto era este):

NotImplementedError: la biblioteca gflags debe estar instalada para usar tools.run (). Instale gflags o preferiblemente cambie a usar tools.run_flow ().

Originalmente usé gflags (hace unos meses), pero no era compatible con nuestro marco (pirámide), por lo que lo eliminamos hasta que pudimos averiguar cuál era el problema. Y la razón por la que es preferible cambiar de gflags a run_flow() es porque gflags ha quedado en desuso , por lo que no quiero usarlo como lo había hecho. Lo que estoy tratando de hacer ahora es cambiar a usar run_flow()

El problema con esto es que run_flow() espera que se le run_flow() un argumento de línea de comando y esto no es una aplicación de línea de comando. Encontré algo de documentación que fue útil, pero estoy atascado en la creación de indicadores para la función run_flow() .

Antes de mostrar el código una cosa más para explicar.

run_flow() toma tres argumentos (documentación aquí) . Toma el flujo y el almacenamiento como lo hace run() , pero también toma un objeto flags. la biblioteca gflags creó un objeto ArgumentParser banderas que se usó en el método de ejecución oauth2client .

algunos otros enlaces que fueron útiles para construir el objeto argumentParser :

El segundo enlace es muy útil para ver cómo se ejecutaría, así que ahora, cuando intento hacer algo similar, sys.argv extrae la ubicación de mi entorno virtual que se ejecuta también como pserve y también extrae mi archivo .ini (que almacena las credenciales de mi máquina para ejecutar el entorno virtual). Pero eso produce un error porque está esperando algo más, y aquí es donde estoy atascado.

  • No sé qué indicador de objetos necesito compilar para enviar a través de run_flow()
  • No sé qué argumentos argv necesito pasar para que la instrucción flags = parser.parse_args(argv[1:]) para recuperar la información correcta (no sé cuál se supone que es la información correcta)

Código:

CLIENT_SECRETS = client_file.uri MISSING_CLIENT_SECRETS_MESSAGE = ''%s is missing'' % CLIENT_SECRETS FLOW = flow_from_clientsecrets( CLIENT_SECRETS, scope=''https://www.googleapis.com/auth/analytics.readonly'', message=MISSING_CLIENT_SECRETS_MESSAGE ) TOKEN_FILE_NAME = ''analytics.dat'' def prepare_credentials(self, argv): storage = Storage(self.TOKEN_FILE_NAME) credentials = storage.get() if credentials is None or credentials.invalid: parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, parents=[tools.argparser]) flags = parser.parse_args(argv[1:]) # i could also do just argv, both error credentials = run_flow(self.FLOW, storage, flags) return credentials def initialize_service(self, argv): http = httplib2.Http() credentials = self.prepare_credentials(self, argv) http = credentials.authorize(http) return build(''analytics'', ''v3'', http=http)

Llamo a una función principal pasando sys.argv que llama a initialize_service

def main(self, argv): service = self.initialize_service(self, argv) try: #do a query and stuff here

Sabía que esto no funcionaría porque mi aplicación no es una aplicación de línea de comandos sino un servicio totalmente integrado, pero pensé que valía la pena intentarlo. ¿Alguna idea sobre cómo construir el objeto banderas correctamente?


Las banderas que se pueden pasar se pueden encontrar https://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.tools-module.html y son:

--auth_host_name: Host name to use when running a local web server to handle redirects during OAuth authorization. (default: ''localhost'') --auth_host_port: Port to use when running a local web server to handle redirects during OAuth authorization.; repeat this option to specify a list of values (default: ''[8080, 8090]'') (an integer) --[no]auth_local_webserver: Run a local web server to handle redirects during OAuth authorization. (default: ''true'')

Todavía tengo que averiguar cómo analizarlos exactamente. He intentado pasar por varios valores diferentes para cada una de estas tres banderas, pero nada funciona para mí. Tengo una pregunta generosa here que puede serle de utilidad cuando la responda.


from oauth2client import tools flags = tools.argparser.parse_args(args=[]) credentials = tools.run_flow(flow, storage, flags)

Tomé un poco de cuidado, pero salí por las dos trampas en las que me arrojó:

  1. Hay que usar el argparser proporcionado en herramientas.
  2. Tuve que alimentar args una lista vacía para evitar que la lectura de args fuera de la línea de comandos, lo cual fue un problema porque lo estoy ejecutando desde una prueba de unidad (por lo tanto, args de cmdline diferentes).