Greasy Fork

Greasy Fork is available in English.

提取 OneDrive 分享文件下载地址

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

当前为 2021-09-14 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

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

})();