// ==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 // @downloadURL none // ==/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(); } })();