如何在没有gflags的情况下获取Google Analytics凭据 - 使用run_flow()代替?

Joh*_*ell 24 python google-analytics google-analytics-api oauth2client google-api-python-client

这可能需要一秒钟来解释所以请耐心等待:

我正在开展一个工作项目,要求我提供谷歌分析数据.我最初是在这个链接之后做的,所以在安装了API客户端pip install --upgrade google-api-python-client并设置了类似的东西后client_secrets.json,它需要安装gflags才能执行run()语句.(即credentials = run(FLOW, storage))

现在,我收到错误消息安装gflags或更好地使用run_flow()(确切的错误消息是这样):

NotImplementedError:必须安装gflags库才能使用tools.run().请安装gflags或最好切换到使用tools.run_flow().

我最初使用gflags(几个月前),但它与我们的框架(金字塔)不兼容,所以我们将其删除,直到我们弄清楚问题是什么.之所以最好从gflags切换到run_flow()因为gflags已被弃用,所以我不想像我一样使用它.我现在要做的就是切换到使用run_flow()

这个问题是run_flow()需要将命令行参数发送给它,而这不是命令行应用程序.我找到了一些有用的文档,但我仍然坚持为run_flow()函数构建标志.

在展示代码之前还有一件事需要解释.

run_flow()有三个参数(文档在这里).它就像流程和存储一样run(),但它也需要一个标志对象.gflags库构建了一个ArgumentParseroauth2client执行方法中使用的标志对象.

一些有助于构建argumentParser对象的其他链接:

第二个链接非常有助于了解它是如何执行的,所以现在当我尝试做类似的事情时,sys.argv拉入我运行aka的虚拟环境的位置pserve并拉入我的.ini文件(它将我的机器的凭据存储到运行虚拟环境).但这引发了一个错误,因为它期待别的东西,这就是我被困住的地方.

  • 我不知道我需要构建什么标志对象来发送 run_flow()
  • 我不知道我需要传递什么argv参数才能使语句flags = parser.parse_args(argv[1:])检索正确的信息(我不知道应该是什么样的正确信息)

码:

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)
Run Code Online (Sandbox Code Playgroud)

我所说的主要功能通过sys.argv调用initialize_service

def main(self, argv):
    service = self.initialize_service(self, argv)

    try:
        #do a query and stuff here
Run Code Online (Sandbox Code Playgroud)

我知道这不会起作用,因为我的应用程序不是命令行应用程序,而是一个完整的集成服务,但我认为它值得一试.有关如何正确构建标志对象的任何想法?

Joh*_*Mee 16

from oauth2client import tools

flags = tools.argparser.parse_args(args=[])
credentials = tools.run_flow(flow, storage, flags)
Run Code Online (Sandbox Code Playgroud)

采取了一些措施,但爬出了两个陷阱,它让我陷入:

  1. 必须使用工具中提供的argparser
  2. 我必须向args提供一个空列表,以防止它从命令行读取args,这是一个问题,因为我是从unittest内部运行它(所以不同的cmdline args).