提取 OneDrive 分享文件下载地址

便于 Aria2 等等下载工具进行下载。打开页面后将会把链接输出在网页控制台。使用Tampemonkey Beta可以获取Cookie,否则需要手动操作。

Version vom 14.09.2021. Aktuellste Version

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

})();