当前位置: 首页 > 知识库问答 >
问题:

我正在尝试使用Google Drive API获取一个文件的直接下载链接

陈高寒
2023-03-14
{'error': {'errors': [{'domain': 'global', 'reason': 'notFound', 'message': 'File not found: 10k0Qogwcz7k0u86m7W2HK-LO7bk8xAF8.', 'locationType': 'parameter', 'location': 'fileId'}], 'code': 404, 'message': 'File not found: 10kfdsfjDHJ38-UHJ34D82.'}}

在做了一些谷歌搜索后,我发现了一个关于堆栈溢出的帖子,说我需要用我的访问令牌添加一个请求头,但这不起作用,应用程序只是挂起了

以下是完整的代码:

### SETTING UP GOOGLE API
scopes = 'https://www.googleapis.com/auth/drive'
store = file.Storage('storage.json')
credentials = store.get()
if not credentials or credentials.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', scopes)
    credentials = tools.run_flow(flow, store)
accessToken = credentials.access_token
refreshToken = credentials.refresh_token
drive = build('drive', 'v3', credentials=credentials)


### SENDING REQUEST
    req_url = "https://www.googleapis.com/drive/v3/files/"+file_id+"?alt=media&supportsAllDrives=True&includeItemsFromAllDrives=True&key="+GOOGLE_API_KEY
    headers={'Authorization': 'Bearer %s' % accessToken}
    request_content = json.loads((requests.get(req_url)).content)
    print(request_content)

-----------编辑:---------------------

当我在浏览器上访问该url时,我会得到以下消息:

We're sorry...
... but your computer or network may be sending automated queries. To protect our users, we can't process your request right now.

我觉得这很困惑,因为如果删除alt=media,我就可以调用该请求,并获得关于该文件的一些元数据

共有1个答案

万俟渝
2023-03-14
    null
    null
file_id = '###'  # Please set the file ID.
req_url = "https://www.googleapis.com/drive/v3/files/" + file_id + "?supportsAllDrives=true&fields=webContentLink"
headers = {'Authorization': 'Bearer %s' % accessToken}
res = requests.get(req_url, headers=headers)
obj = res.json()
print(obj.get('webContentLink'))
file_id = '###'  # Please set the file ID.
drive = build('drive', 'v3', credentials=credentials)
request = drive.files().get(fileId=file_id, supportsAllDrives=True, fields='webContentLink').execute()
print(request.get('webContentLink'))
    null
    null
    null
    null

在这个示例脚本中,使用了API密钥。

  • 使用要下载的API密钥和文件ID请求Web应用程序。
  • 在Web应用程序中,运行以下功能。
    • 接收的文件ID的文件权限被更改。并开始公开共享该文件。
    • 安装时间驱动触发器。在这种情况下,触发器在1分钟后运行。
      • 当函数由时间驱动触发器运行时,文件的权限会发生变化。并停止共享文件。这样,就可以实现一分钟的文件共享。
      • 获得endpoint后,请在1分钟内使用endpoint下载文件。因为该文件只共享了一分钟。
      function deletePermission() {
        const forTrigger = "deletePermission";
        const id = CacheService.getScriptCache().get("id");
        const triggers = ScriptApp.getProjectTriggers();
        triggers.forEach(function(e) {
          if (e.getHandlerFunction() == forTrigger) ScriptApp.deleteTrigger(e);
        });
        const file = DriveApp.getFileById(id);
        file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.NONE);
      }
      
      function checkTrigger(forTrigger) {
        const triggers = ScriptApp.getProjectTriggers();
        for (var i = 0; i < triggers.length; i++) {
          if (triggers[i].getHandlerFunction() == forTrigger) {
            return false;
          }
        }
        return true;
      }
      
      function doGet(e) {
        const key = "###"; // <--- API key. This is also used for checking the user.
        
        const forTrigger = "deletePermission";
        var res = "";
        if (checkTrigger(forTrigger)) {
          if ("id" in e.parameter && e.parameter.key == key) {
            const id = e.parameter.id;
            CacheService.getScriptCache().put("id", id, 180);
            const file = DriveApp.getFileById(id);
            file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
            var d = new Date();
            d.setMinutes(d.getMinutes() + 1);
            ScriptApp.newTrigger(forTrigger).timeBased().at(d).create();
            res = "https://www.googleapis.com/drive/v3/files/" + id + "?alt=media&key=" + e.parameter.key;
          } else {
            res = "unavailable";
          }
        } else {
          res = "unavailable";
        }
        return ContentService.createTextOutput(res);
      }
      
        null
        null

      这是Python的示例脚本。在进行测试之前,请确认上述脚本是作为Web应用程序部署的。并且请设置Web应用程序的URL、文件ID和API密钥。

      import requests
      url1 = "https://script.google.com/macros/s/###/exec"
      url1 += "?id=###fileId###&key=###your API key###"
      res1 = requests.get(url1)
      url2 = res1.text
      res2 = requests.get(url2)
      with open("###sampleFilename###", "wb") as f:
          f.write(res2.content)
      
      • 在这个示例脚本中,首先,它使用文件ID和API密钥向Web应用程序请求,文件在1分钟内被公开共享。然后,文件就可以下载了。1分钟后,文件不公开共享。但是可以保留文件的下载。
      • 修改Web应用程序脚本时,请将Web应用程序重新部署为新版本。这样,最新的脚本就会反映到Web应用程序中。请小心这个。
        null

 类似资料:
  • cmf_get_file_download_url($file, $expires = 3600) 功能 获取文件下载链接 参数 $file: string 文件路径,数据库里保存的相对路径 $expires: int 过期时间,单位 s 返回 string 文件链接

  • X2.2.0新增 sp_get_file_download_url($file,$expires=3600) 功能: 获取文件下载链接 参数: $file: 数据库保存的文件路径 $expires:文件过期时间(七牛) 返回: 类型string,文件下载链接 使用: $url = sp_get_file_download_url('portal/23232.png');

  • cmf_get_file_download_url($file, $expires = 3600) 功能 获取文件下载链接 参数 $file: string 文件路径,数据库里保存的相对路径 $expires: int 过期时间,单位 s 返回 string 文件链接

  • 我正在尝试使用Selenium WebDriver自动执行文件下载功能。我正在使用谷歌浏览器,要下载的文件类型是PDF格式。当 WebDriver 单击下载(或打印)链接时,浏览器将显示 pdf 文件的预览,而不是直接下载。如何使chrome驱动程序直接下载pdf文件?我尝试了下面的代码,但没有运气 我知道这个问题已经在StackOverflow上问过了,包括这个,但这些解决方案都不适合我。 我正

  • 我正在尝试制作一个简单的表单,显示服务器上的数据库列表,允许用户选择一个数据库点击ok,然后开始下载一个.sql文件,该文件可以用于恢复数据库 我遇到的问题是只有一个空白。sql文件已创建。如果我更改它,只使用mysqldump命令,为转储指定一个文件位置,我会在文件中获得更多信息,但只是其中的一部分: --主机:localhost数据库: -- 服务器版本 5.5.35-0ubuntu0.12.

  • 在我实现了一个Android应用程序的解决方案后,发布到web服务器并验证Google Order,然后发布一个下载链接。现在,我正在尝试编写一个应用程序的代码,以读取thankyou.php页面中的链接 该文件是一个“.dat”扩展名,来自某个链接。应用程序应该检索一个新页面中的链接,并让客户下载文件。