这是我之前的问题的延续。我正在使用以下脚本来获取可公开访问的文件链接:
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 }
任何指导将不胜感激。
幸运的是我在以下函数中发现了问题:
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;
}