使用现有 Google Apps 脚本获取 Dropbox 文件 (mp4) 链接时出错

问题描述 投票:0回答:1

这是我之前的问题的延续。我正在使用以下脚本来获取可公开访问的文件链接:

function listDropBoxFiles() {

  const accessToken = "sl.BpQiX-y5a6GhuZ9_QmHnCeT3u6OMoVRiKrPDOe_YzOVtDUCUUlEYrMd92faMVlJQr28d3md5YKvN4au1B6HIdEeRug0LdL66Qo1UGlXmNx3RiMNZDcZqPVZvWLbJEroQxurJye23YxjGFCvMPnJUbFI";
  var subfolderName = "";
 
  const path = "/Master Folder";

  let url = "https://api.dropboxapi.com/2/files/list_folder";
  let has_more = false;
  var count = 0;
  const option = {
    method: "post",
    headers: { authorization: "Bearer " + accessToken },
    contentType: "application/json",
    payload: JSON.stringify({ path, limit: 2000, recursive: true })
  };
  let values = [];
  var fileDetails = [];
  do {
    const res = UrlFetchApp.fetch(url, option);
    let obj = JSON.parse(res.getContentText());

    values = [...values, ...obj.entries];
    has_more = obj.has_more;

    if (has_more) {
      url = "https://api.dropboxapi.com/2/files/list_folder/continue";
      option.payload = JSON.stringify({ cursor: obj.cursor });
    }
  } while (has_more);
  
   for (var i = 0; i < values.length; i++) {
    
      var entry = values[i];
      
    if (entry['.tag'] === 'file') {
      
       var match = entry.path_display.split('/');
       subfolderName = match[match.length - 2];   
      
       var fileUrl = getFileUrl(accessToken,entry.id)

       fileDetails.push([subfolderName,entry.name,fileUrl,Utilities.formatDate(new Date(entry.client_modified), Session.getScriptTimeZone(), 'dd/MM/yyyy hh:mm a'),Utilities.formatDate(new Date(entry.server_modified), Session.getScriptTimeZone(), 'dd/MM/yyyy hh:mm a')])
     
    }
  }
    
      if(fileDetails.length>0){
         detailSheet.getRange(detailSheet.getLastRow()+1,1,fileDetails.length,fileDetails[0].length).setValues(fileDetails);
      }
}



function getFileUrl(accessToken, fileId) {
  const url1 = "https://api.dropboxapi.com/2/sharing/list_shared_links";
  const res1 = UrlFetchApp.fetch(url1, {
    method: "post",
    headers: { authorization: "Bearer " + accessToken },
    contentType: "application/json",
    payload: JSON.stringify({ path: fileId })
  });
  const obj1 = JSON.parse(res1.getContentText());
  if (obj1.links.length > 0) {
    return obj1.links[0].url;
  }
  const url2 = "https://api.dropboxapi.com/2/sharing/create_shared_link_with_settings";
  const res2 = UrlFetchApp.fetch(url2, {
    method: "post",
    headers: { authorization: "Bearer " + accessToken },
    contentType: "application/json",
    payload: JSON.stringify({ path: fileId, settings: { access: "viewer", allow_download: true, audience: "public", requested_visibility: "public" } })
  });
  const obj2 = JSON.parse(res2.getContentText());
  const sharedLink = obj2.url;
  return sharedLink;
}

但是,有时它有效,有时则无效,问题是它提供了文件的文件夹链接,而不是文件的实际链接。我的意思是它提供了保存这些文件的文件夹/子文件夹链接,而不是文件的链接。例如,在我的 Master 文件夹中,有 3 个文件,脚本给出 以下输出:

1. Live Video.mp4   
https://www.dropbox.com/scl/fo/mhiwyb9u7kjrhtw05rsdr/h?rlkey=6mj30yhcyahu9ypjddx2uz962&dl=0

2. Custom Data Entry Form.jpg   
https://www.dropbox.com/scl/fo/mhiwyb9u7kjrhtw05rsdr/h?rlkey=6mj30yhcyahu9ypjddx2uz962&dl=0

3.Format Number.txt 
https://www.dropbox.com/scl/fo/io1xsqja0y44n7wilphp0/h?rlkey=jhuvdusw204k71nnl9axhbtnr&dl=0

在这里您可以看到,当您单击这些链接时,它们会打开包含这些文件的文件夹,而不是打开这些文件。名为

1. Live Video.mp4
的文件的数据如下所示:

{ '.tag': 'file',
  name: 'Live Video.mp4',
  path_lower: '/master folder/live video.mp4',
  path_display: '/Master Folder/Live Video.mp4',
  id: 'id:c0kbDV6PiUcAAAAAAAAAGw',
  client_modified: '2023-11-05T07:25:40Z',
  server_modified: '2023-11-05T07:31:28Z',
  rev: '0160962b9c6509b00000002277bc0d0',
  size: 348179266,
  is_downloadable: true,
  content_hash: '41247114de3e285fb84fefd961801a73a7072cba9d043bd123e0e73ea5707271' }

如果您将上述响应中的

'id:c0kbDV6PiUcAAAAAAAAAGw'
插入到
getFileUrl()
中,它将获取文件夹链接而不是文件链接,下面是响应
(obj1/obj2)
:

{ links: 
   [ { '.tag': 'folder',
       url: 'https://www.dropbox.com/scl/fo/mhiwyb9u7kjrhtw05rsdr/h?rlkey=6mj30yhcyahu9ypjddx2uz962&dl=0',
       id: 'id:c0kbDV6PiUcAAAAAAAAAGg',
       name: 'Master Folder',
       path_lower: '/master folder',
       link_permissions: [Object] } ],
  has_more: false }

任何指导将不胜感激。

google-apps-script google-sheets dropbox
1个回答
0
投票

幸运的是我在以下函数中发现了问题:

function getFileUrl(accessToken, fileId) {
  const url1 = "https://api.dropboxapi.com/2/sharing/list_shared_links";
  const res1 = UrlFetchApp.fetch(url1, {
    method: "post",
    headers: { authorization: "Bearer " + accessToken },
    contentType: "application/json",
    payload: JSON.stringify({ path: fileId })
  });
  const obj1 = JSON.parse(res1.getContentText());
  if (obj1.links.length > 0) {
    return obj1.links[0].url;
  }
  const url2 = "https://api.dropboxapi.com/2/sharing/create_shared_link_with_settings";
  const res2 = UrlFetchApp.fetch(url2, {
    method: "post",
    headers: { authorization: "Bearer " + accessToken },
    contentType: "application/json",
    payload: JSON.stringify({ path: fileId, settings: { access: "viewer", allow_download: true, audience: "public", requested_visibility: "public" } })
  });
  const obj2 = JSON.parse(res2.getContentText());
  const sharedLink = obj2.url;
  return sharedLink;
}

在上面的函数中,

if
条件检查是否已经有任何链接,但问题是它还考虑了子文件夹的链接,如果有子文件夹,它不会查找文件链接,它只获取子文件夹链接并且条件被认为是正确的。

所以从改变这个开始:

 if (obj1.links.length > 0) {
        return obj1.links[0].url;
      }

至此解决了问题

 if (obj1.links[0]['.tag'] === 'file') {
    return obj1.links[0].url;
  }
© www.soinside.com 2019 - 2024. All rights reserved.