【问题标题】:list google drive files with curl使用 curl 列出谷歌驱动器文件
【发布时间】:2019-08-06 11:28:10
【问题描述】:

我正在尝试使用 curl 获取 Google 云端硬盘上的文件列表,但 OAuth 2 对我来说是最好的。

以下是我尝试过的一些事情:

curl -H "Authorization: Bearer $token" https://www.googleapis.com/drive/v2/files

其中 $token 是我使用的 460 个字符的字符串:

https://www.google.com/accounts/ClientLogin

还有这个上传script(效果很好)。这是我收到的错误:

 {
  "error": {
   "errors": [
    {
      "domain": "global",
      "reason": "authError",
      "message": "Invalid Credentials",
      "locationType": "header",
      "location": "Authorization"
    }
   ],
   "code": 401,
   "message": "Invalid Credentials"
  }
 }

也试过了:

curl https://www.googleapis.com/drive/v2/files?key=apiKey

错误:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Login Required"
 }
}

还有:

curl -H "Authorization: GoogleLogin auth=${token}" "https://www.googleapis.com/drive/v2/files"

错误:

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }
}

我在 JavaScript 和 PHP 客户端库上都没有成功,它们似乎都针对用户提供日志/通行证以授权应用程序的情况进行了优化。我需要的是一种每次都列出来自单个帐户的文件的方法。

【问题讨论】:

    标签: curl google-drive-api


    【解决方案1】:

    我自己花了大约 30 分钟来解决这个问题,以便访问联系人 API,并重新执行驱动 API 的步骤并将它们记录下来以供将来参考。有 5 个步骤,前 4 个是一次性设置。

    第 1 步:创建新的 OAuth2 凭据

    记下client IDclient secret

    第 2 步:以驱动器为范围请求授权。

    使用client IDhttps://docs.google.com/feeds 作为scope,构造以下 curl 命令:

    $ curl -d "client_id=413437979384-05efiod756k5hp2eji5tsn2lmlg0qslc.apps.googleusercontent.com&scope=https://docs.google.com/feeds" https://accounts.google.com/o/oauth2/device/code
    {
      "device_code" : "KRYU-NTVW4/qi6ysOpK2AtsmtZz4MB9LAthlYGGgAepxpBnGQLvhqo",
      "user_code" : "KRYU-NTVW",
      "verification_url" : "https://www.google.com/device",
      "expires_in" : 1800,
      "interval" : 5
    }
    

    复制user_code

    第 3 步:授权请求。

    访问验证 URL https://www.google.com/device 并输入复制的代码。

    第四步:获取access_token

    将auth请求得到的device_code添加到client IDclient secret中,构造如下curl命令:

    $ curl -d "client_id=413437979384-05efiod756k5hp2eji5tsn2lmlg0qslc.apps.googleusercontent.com&client_secret=0zWNribRJ4PcYWH-rDkCpCcm&grant_type=http://oauth.net/grant_type/device/1.0&code=KRYU-NTVW4/qi6ysOpK2AtsmtZz4MB9LAthlYGGgAepxpBnGQLvhqo" https://www.googleapis.com/oauth2/v4/token
    {
     "access_token": "ya29.kgKW4Z4IDqK7lCjUQw-u5VT2uAx19MtgdoKeAC9ikKYGwKh7Nh46pY8nQsANQ5lRwA",
     "token_type": "Bearer",
     "expires_in": 3600,
     "refresh_token": "1/qinFVaMPYvhWtUtmjb1qCpnQt48XyvQhB_ILZJ4H1Uw"
    }
    

    我们现在有了所需的access_token,保存它并将其用于所有驱动器 REST API 请求。

    第 5 步:驱动 API 请求。

    $ curl -H 'GData-Version: 3.0' -H 'Authorization: Bearer ya29.kgKW4Z4IDqK7lCjUQw-u5VT2uAx19MtgdoKeAC9ikKYGwKh7Nh46pY8nQsANQ5lRwA' https://www.googleapis.com/drive/v2/files
    {
     "kind": "drive#fileList",
    ...
    

    【讨论】:

    • 但是token已经过期了,不验证浏览器验证码可以续费吗?
    • 很好的答案,谢谢。我能够复制这个过程。但是,我也很好奇如何在 access_tokens 过期时刷新它们。有什么帮助吗?
    • stackoverflow 上的最佳答案之一。
    【解决方案2】:

    对于未来的谷歌员工:

    如果你想为自己节省一个下午的痛苦,忘记谷歌的记录,直接前往here

    它的要点,因为我知道 stackoverflow 更喜欢引用内容而不是链接:

    首先,在 Google Developer Console 中为 OAuth2 获取您的客户端 ID。这将需要填写 OAuth 同意屏幕,并且在测试后,您必须验证您的域。 (Google 将引导您完成此过程...)

    在您的浏览器中:

    https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=1234567890.apps.googleusercontent.com
    

    当然要允许访问,然后复制应该类似于 4/v6xr77ewYqjkslsdUOKwAzu 的代码

    curl -H "Content-Type: application/x-www-form-urlencoded" -d 'code=4/v6xr77ewYqjkslsdUOKwAzu&client_id=1234567890.apps.googleusercontent.com&client_secret=xywzxywzxywzxywzxywz&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code' https://accounts.google.com/o/oauth2/token
    

    你会得到一个像这样的 JSON:

    {
      "access_token" : "ya29.AHES6Zkjhkjhahskjhskkskjh",
      "token_type" : "Bearer",
      "expires_in" : 3600,
      "refresh_token" : "1/HH9E7k5D0jakjhsd7askdjh7899a8sd989"
    }
    

    如果你卷曲:

    curl 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ya29.AHES6Zkjhkjhahskjhskkskjh'
    

    你会得到类似的东西:

    {
     "issued_to": "562211803675.apps.googleusercontent.com",
     "audience": "562211803675.apps.googleusercontent.com",
     "scope": "https://www.googleapis.com/auth/analytics",
     "expires_in": 3556
    }
    

    完成

    curl 'https://www.googleapis.com/analytics/v3/management/accounts?access_token=ya29.AHES6Zkjhkjhahskjhskkskjh
    

    更新令牌

    你必须使用之前收到的“refresh_token”

    curl -d "client_id=562211803675.apps.googleusercontent.com&client_secret=ZQxoOBGbvMGnZOYUrVIDXrgl&refresh_token=1/HH9E7k5D0jakjhsd7askdjh7899a8sd989&grant_type=refresh_token" https://accounts.google.com/o/oauth2/token
    

    你会得到一个新的 access_token。

    【讨论】:

    • 但这是分析...它对 drive.files 的工作方式是否相同?我无法使用此描述获取该范围的访问令牌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多