首页 > 解决方案 > 需要登录时使用 python 从 cloud.google.com 下载公共文件

问题描述

我正在尝试在以下位置下载 twitter 错误信息/选举完整性数据集: https ://storage.cloud.google.com/twitter-election-integrity/hashed/ira/ira_media_file_list_hashed.txt

但它需要登录。我没有使用 Google App Engine,只是在我的笔记本电脑上运行 python 3。我编写了以下代码来下载文件:

for a_url in download_urls:
    filename = os.path.join(data_path, os.path.basename(a_url))

    if not os.path.isfile(filename):
        #urllib.request.urlretrieve(a_url, filename)
        with open(filename, 'wb') as f:
            c = pycurl.Curl()
            c.setopt(c.URL, a_url)
            c.setopt(c.WRITEDATA, f)
            c.setopt(c.CAINFO, certifi.where())
            c.perform()
            c.close()

有没有办法可以下载这些文件,同时避免登录我的谷歌帐户?

或者有没有一种通过python登录的简单方法?

几乎所有在线信息都是如何在 GAE 环境中执行此操作,我并没有尝试连接到存储桶。

标签: pythonpython-3.xgoogle-cloud-platformurllibpycurl

解决方案


提到的 URL 表明文件是从Cloud Storage提供的。由于需要登录,这意味着对象不可公开访问

提供这些文件的应用程序使用以用户为中心的 OAuth 2.0 流程。从身份验证

Cloud Storage 使用OAuth 2.0进行 API 身份验证和授权。身份验证是确定客户端身份的过程。

  • 以用户为中心的流程允许应用程序从最终用户处获取凭据。用户登录以完成身份验证。

Is there a way I can download these files while avoiding having to log in to my google account?

这里的答案应该是否定的。否则这是一个错误 - 您将能够绕过 Google Cloud 安全性;)

我找不到 的详细信息pycurl,但curl它本身并未将 OAuth 2.0 列为受支持。从功能 - curl 可以做什么

HTTP

  • 身份验证:基本、摘要、NTLM (*9) 和协商 (SPNEGO) (*3) 到服务器和代理

所以我认为您将无法使用pycurl. 至少不是直接的(也许通过代理?)。

一种可能的替代方法是在您的脚本中使用Cloud SDKgsutil(作为任何其他外部进程启动)。:

  • 您首先使用gcloud auth login.
  • 然后您将启动您的脚本,其中的gsutil执行将使用先前获得的身份验证令牌

我看到可以gsutil在没有云 SDK 的情况下以独立模式安装和使用,但我没有以这种方式使用它。也许你的案子值得调查。来自gsutil config

gsutil config命令适用于已将 gsutil 作为独立工具安装的用户。

gsutil config命令获取 Google Cloud Storage 的访问凭据,并写入一个 boto/gsutil 配置文件,其中包含获取的凭据以及许多其他配置可控值。


推荐阅读