Greasy Fork is available in English.
便于 Aria2 等等下载工具进行下载。打开页面后将会把链接输出在网页控制台。使用Tampemonkey Beta可以获取Cookie,否则需要手动操作。
当前为
// ==UserScript==
// @name 提取 OneDrive 分享文件下载地址
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 便于 Aria2 等等下载工具进行下载。打开页面后将会把链接输出在网页控制台。使用Tampemonkey Beta可以获取Cookie,否则需要手动操作。
// @author You
// @match https://*.sharepoint.com/personal/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant GM_cookie
// ==/UserScript==
(async function() {
'use strict';
let fileList = [];
// 解析路径参数
let url = document.location;
let host = url.host;
let param = new URLSearchParams(url.search);
let loc = param.get('id');
// 请求文件列表
let response = await fetch(`https://${host}${loc}`, {
method: 'PROPFIND',
credentials: 'include'
});
if (!response.ok) {
// 失败
if (response.status !== 404) {
throw new Error(`无法解析OneDrive文件列表: ${response.status}`);
}
// 单个文件
fileList.push(encodeURI(`https://${host}${loc}`));
} else {
// 成功:多个文件
// 解析返回
let xmlRaw = await response.text();
let parser = new DOMParser();
let xmlDoc = parser.parseFromString(xmlRaw, "text/xml");
let fileEls = xmlDoc.getElementsByTagName('D:response');
for (const el of fileEls) {
let isFolderEl = el.getElementsByTagName('D:isFolder');
// 当前不支持递归查找,所以跳过文件夹
if (isFolderEl.length >= 1 && isFolderEl[0].textContent === 't') {
continue;
}
// 获得文件 URL
let hrefEl = el.getElementsByTagName('D:href');
if (hrefEl.length >= 1) {
fileList.push(hrefEl[0].textContent);
}
}
}
// 输出
console.log('当前页面的文件下载地址:');
console.log(fileList.join('\n'));
// 获得 Cookie
const promptNoGmCookie = () => {
console.log('由于您没有使用Tampermonkey Beta,因此无法自动获得Cookie。' +
'请在开发者选项-Application-Cookie中,复制FedAuth对应的值。' +
'然后在AriaNG的“自定义请求头”填写:%c Cookie: FedAuth=复制的值', 'color: grey');
};
try {
GM_cookie.list({ name: 'FedAuth' }, (cookie, error) => {
if (error) {
promptNoGmCookie();
return;
}
let token = cookie[0].value;
console.log('下载时在AriaNG的“自定义请求头”填写:');
console.log("%c%s", 'color: grey', `Cookie: FedAuth=${token}`);
});
} catch {
promptNoGmCookie();
}
})();