Magnet URI 到 qBittorrent Web UI

攔截磁力連結點擊並發送到 qBittorrent Web UI

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Magnet URI 到 qBittorrent Web UI
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  攔截磁力連結點擊並發送到 qBittorrent Web UI
// @author       您的名字
// @match        *://**/*
// @grant        GM_xmlhttpRequest
// @connect      *
// ==/UserScript==

(function() {
    'use strict';

    // 配置 - 請修改為您的 qBittorrent Web UI 設定
    const QBITTORRENT_URL = 'http://您的qbittorrent主機:端口';
    const USERNAME = '您的用戶名';
    const PASSWORD = '您的密碼';

    // 驗證狀態追蹤變數
    let isAuthenticated = false;
    let authTimer = null;

    // 添加設定按鈕到頁面
    function addSettingsButton() {
        const button = document.createElement('div');
        button.innerHTML = '⚙️ qBT';
        button.style.position = 'fixed';
        button.style.bottom = '20px';
        button.style.right = '20px';
        button.style.backgroundColor = '#2980b9';
        button.style.color = 'white';
        button.style.padding = '5px 10px';
        button.style.borderRadius = '5px';
        button.style.cursor = 'pointer';
        button.style.zIndex = '9999';
        button.style.fontSize = '14px';

        button.addEventListener('click', function() {
            const newUrl = prompt('請輸入您的 qBittorrent Web UI URL:', localStorage.getItem('qbt_url') || QBITTORRENT_URL);
            if (newUrl) localStorage.setItem('qbt_url', newUrl);

            const newUsername = prompt('請輸入您的用戶名:', localStorage.getItem('qbt_username') || USERNAME);
            if (newUsername) localStorage.setItem('qbt_username', newUsername);

            const newPassword = prompt('請輸入您的密碼:', localStorage.getItem('qbt_password') || PASSWORD);
            if (newPassword) localStorage.setItem('qbt_password', newPassword);

            // 重置驗證狀態
            isAuthenticated = false;
            alert('設定已更新!');
        });

        document.body.appendChild(button);
    }

    // 獲取當前設定值
    function getConfig(key, defaultValue) {
        return localStorage.getItem('qbt_' + key) || defaultValue;
    }

    // 顯示通知
    function showNotification(message, isSuccess = true) {
        const notification = document.createElement('div');
        notification.textContent = message;
        notification.style.position = 'fixed';
        notification.style.bottom = '70px';
        notification.style.right = '20px';
        notification.style.backgroundColor = isSuccess ? '#27ae60' : '#e74c3c';
        notification.style.color = 'white';
        notification.style.padding = '10px 15px';
        notification.style.borderRadius = '5px';
        notification.style.zIndex = '10000';
        notification.style.boxShadow = '0 2px 10px rgba(0,0,0,0.2)';
        notification.style.fontWeight = 'bold';
        notification.style.fontSize = '14px';
        notification.style.opacity = '0';
        notification.style.transition = 'opacity 0.3s';

        document.body.appendChild(notification);

        // 淡入效果
        setTimeout(() => {
            notification.style.opacity = '1';
        }, 10);

        // 3秒後自動移除通知
        setTimeout(() => {
            notification.style.opacity = '0';
            notification.style.transition = 'opacity 0.5s';
            setTimeout(() => document.body.removeChild(notification), 500);
        }, 3000);
    }

    // 與 qBittorrent Web UI 進行驗證
    function authenticate(callback) {
        const qbtUrl = getConfig('url', QBITTORRENT_URL);
        const username = getConfig('username', USERNAME);
        const password = getConfig('password', PASSWORD);

        GM_xmlhttpRequest({
            method: 'POST',
            url: qbtUrl + '/api/v2/auth/login',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            data: `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`,
            withCredentials: true,
            onload: function(response) {
                if (response.responseText === 'Ok.') {
                    isAuthenticated = true;
                    // 設定計時器,每50分鐘重新驗證(qBittorrent 會話1小時後過期)
                    if (authTimer) clearTimeout(authTimer);
                    authTimer = setTimeout(function() {
                        isAuthenticated = false;
                    }, 50 * 60 * 1000);

                    if (callback) callback();
                } else {
                    console.error('qBittorrent 驗證失敗', response.status, response.responseText);
                    showNotification('qBittorrent 驗證失敗,請檢查您的憑證', false);
                }
            },
            onerror: function(error) {
                console.error('連接到 qBittorrent Web UI 時出錯', error);
                showNotification('無法連接到 qBittorrent Web UI,請檢查它是否運行並可訪問', false);
            }
        });
    }

    // 將磁力連結添加到 qBittorrent
    function addMagnetToQBittorrent(magnetURI) {
        const qbtUrl = getConfig('url', QBITTORRENT_URL);

        const addTorrentFunction = function() {
            GM_xmlhttpRequest({
                method: 'POST',
                url: qbtUrl + '/api/v2/torrents/add',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                },
                data: `urls=${encodeURIComponent(magnetURI)}`,
                withCredentials: true,
                onload: function(response) {
                    if (response.status === 200) {
                        console.log('磁力連結成功添加到 qBittorrent');
                        showNotification('磁力連結成功添加到 qBittorrent');
                    } else {
                        console.error('無法將磁力連結添加到 qBittorrent', response.status, response.responseText);
                        showNotification('無法將磁力連結添加到 qBittorrent', false);
                    }
                },
                onerror: function(error) {
                    console.error('連接到 qBittorrent Web UI 時出錯', error);
                    showNotification('無法連接到 qBittorrent Web UI', false);
                }
            });
        };

        if (!isAuthenticated) {
            authenticate(addTorrentFunction);
        } else {
            addTorrentFunction();
        }
    }

    // 初始化腳本
    function init() {
        // 添加設定按鈕
        if (window.top === window.self) {  // 只在主框架執行
            addSettingsButton();
        }

        // 攔截磁力連結點擊
        document.addEventListener('click', function(event) {
            let target = event.target;

            // 檢查點擊的元素是否為錨點或有錨點父元素
            while (target && target.tagName !== 'A') {
                target = target.parentNode;
                if (!target || target === document) return;
            }

            // 檢查連結是否為磁力URI
            if (target && target.href && target.href.startsWith('magnet:')) {
                event.preventDefault(); // 阻止默認操作
                addMagnetToQBittorrent(target.href);
            }
        }, true);
    }

    // 等待頁面加載完成
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();