在 python 中没有本地浏览器的 Google Analytics API 访问

Posted

技术标签:

【中文标题】在 python 中没有本地浏览器的 Google Analytics API 访问【英文标题】:Google Analytics API access without local browser in python 【发布时间】:2012-10-08 23:54:06 【问题描述】:

我想使用 Python 查询 Google Analytics API,以定期从我的 Analytics 帐户下载数据并将数据存储在本地数据库中。我基本上遵循basic tutorial 中给出的步骤。我在这个过程中使用Google client API library for Python。

到目前为止,当我在本地开发机器 (Mac) 上运行脚本时,它运行良好。当我启动脚本时,我的浏览器会打开,并提示我授予从应用程序访问我的 Analytics 数据的权限。之后,我可以根据需要运行我的脚本并访问我的数据。

在我的服务器(Ubuntu,只有终端可用)上,w3m 浏览器打开,但我无法从那里访问我的 Google 帐户。我只能退出w3m 并用Ctrl-C 杀死程序。有如下错误信息:

您的浏览器已打开访问:

https://accounts.google.com/o/oauth2/auth?scope=some_long_url&access_type=offline

如果您的浏览器在另一台机器上,请退出并重新运行 带有命令行参数的应用程序

--noauth_local_webserver

但是,当我使用参数 --noauth_local_webserver 运行脚本时,我得到了相同的结果 - w3m 打开并且我无法进行身份验证。

我怎样才能让--noauth_local_webserver 工作?我是否有另一种方法可以在同一台机器上不使用本地浏览器进行身份验证?

【问题讨论】:

我也有类似的问题,但我需要自动化认证过程(我不想每次都“接受”API)。有什么方法可以通过 python 客户端发送登录名/密码,还是我必须破解示例代码并通过 PhantomJS 来完成? phantom js 不是一个坏主意!我也不想每次都接受 API,它破坏了我的自动化。这看起来很有希望:npmjs.com/package/headless-google-auth 【参考方案1】:

我在我的电脑上运行它,得到一个 token.json,然后将令牌复制到服务器上的主文件夹中(想想脚本的工作目录),它就解决了。 如果您使用相同的令牌,则无需身份验证

【讨论】:

【参考方案2】:

我遇到了同样的问题,并设法通过 SSH 连接到我的服务器来解决它。示例:

ssh -L 8080:127.0.0.1:8080 <server-name>

然后我通过 SSH 运行我的脚本。当我看到 URL (https://accounts.google.com/o/oauth2/auth?scope=some_long_url&access_type=offline) 时,我复制并粘贴到我机器上的浏览器中以完成身份验证流程。

【讨论】:

你能解释一下吗...我有同样的问题,我必须把它作为微服务放在 Amazon Lambda 中,所以没有 GUI,我正在考虑通过 SSH 访问服务器和运行 selenium 自动化来打开我们获得的链接,完成身份验证流程......有可能......【参考方案3】:

您也可以使用 GA 即服务 API:https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-py 这工作得很好。只需记住使用 openssl 将 p12 转换为未加密的 PEM 文件 $openssl pkcs12 -in client_secrets.p12 -nodes -nocerts > client_secrets.pem 从谷歌开发者控制台下载P12时会打印出导入密码

【讨论】:

【参考方案4】:

当您使用FLAGS = gflags.FLAGS 时,您实际上需要将命令行参数传递给FLAGS(这也可能会或可能不会绊倒我:))。请参阅here 以获取有关如何执行此操作的以分析为中心的示例(下面的代码,因为链接往往会在一段时间后消失)。一般的想法是将argv 参数传递到FLAGS 变量中,然后该变量可供其他模块使用。

# From samples/analytics/sample_utils.py in the google-api-python-client source

def process_flags(argv):
  """Uses the command-line flags to set the logging level.

  Args:
    argv: List of command line arguments passed to the python script.
  """

  # Let the gflags module process the command-line arguments.
  try:
    argv = FLAGS(argv)
  except gflags.FlagsError, e:
    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
    sys.exit(1)

  # Set the logging according to the command-line flag.
  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))

另外,事实证明我们并不孤单!您可以跟踪 this bug 以查看何时添加文档。

【讨论】:

谢谢,正是我想要的! @j0nes 太棒了,很高兴它有帮助! 你好,我也面临同样的问题,我使用的是Google Sheets API,我没有得到你的解决方案,这个函数在哪里,如何调用它。我从这里查看了 run_flow 的文档,developers.google.com/api-client-library/python/guide/…,并且我正确使用了它。请帮助我了解您的解决方案。 否则是否可以从命令行获取链接,以便我可以使用 seleniumm webdriver 自动完成身份验证流程。

以上是关于在 python 中没有本地浏览器的 Google Analytics API 访问的主要内容,如果未能解决你的问题,请参考以下文章

读取google浏览器本地cookie

Google Maps v3 API密钥不适用于本地测试

google浏览器无法本地测试ajax

Google浏览器如何加载本地文件

在本地测试 Python Google Cloud Functions

谷歌文档查看器不能在本地主机上工作吗?