Greasy Fork

一之题库搜索

搜索一之题库的答案,支持划词搜索、拖拽和自定义token(加密显示)

目前为 2024-10-12 提交的版本。查看 最新版本

// ==UserScript==
// @name         一之题库搜索
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  搜索一之题库的答案,支持划词搜索、拖拽和自定义token(加密显示)
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @connect      q.icodef.com
// @license MIT
// @author      有问题联系q: 2430486030
// ==/UserScript==

(function() {
    'use strict';

    // 创建搜索框和结果显示区域
    const container = document.createElement('div');
    container.style.cssText = `
        position: fixed;
        top: 10px;
        right: 10px;
        z-index: 9999;
        background-color: #f0f0f0;
        border-radius: 5px;
        padding: 10px;
        box-shadow: 0 0 10px rgba(0,0,0,0.1);
        font-family: Arial, sans-serif;
        cursor: move;
    `;

    const searchBox = document.createElement('input');
    searchBox.type = 'text';
    searchBox.placeholder = '输入问题搜索答案';
    searchBox.style.cssText = `
        width: 200px;
        padding: 5px;
        border: 1px solid #ccc;
        border-radius: 3px;
        font-size: 14px;
        cursor: text;
        margin-bottom: 5px;
    `;

    const tokenInput = document.createElement('input');
    tokenInput.type = 'password';
    tokenInput.placeholder = '输入你的token';
    tokenInput.style.cssText = `
        width: 170px;
        padding: 5px;
        border: 1px solid #ccc;
        border-radius: 3px 0 0 3px;
        font-size: 14px;
        cursor: text;
        margin-bottom: 5px;
    `;

    const toggleTokenVisibility = document.createElement('button');
    toggleTokenVisibility.textContent = '👁️';
    toggleTokenVisibility.style.cssText = `
        width: 30px;
        padding: 5px;
        border: 1px solid #ccc;
        border-left: none;
        border-radius: 0 3px 3px 0;
        font-size: 14px;
        cursor: pointer;
        background-color: #f0f0f0;
    `;

    const tokenInputWrapper = document.createElement('div');
    tokenInputWrapper.style.cssText = `
        display: flex;
        margin-bottom: 5px;
    `;
    tokenInputWrapper.appendChild(tokenInput);
    tokenInputWrapper.appendChild(toggleTokenVisibility);

    const saveTokenButton = document.createElement('button');
    saveTokenButton.textContent = '保存Token';
    saveTokenButton.style.cssText = `
        padding: 5px;
        margin-left: 5px;
        cursor: pointer;
    `;

    const resultDiv = document.createElement('div');
    resultDiv.style.cssText = `
        margin-top: 10px;
        max-width: 300px;
        max-height: 200px;
        overflow-y: auto;
        background-color: white;
        padding: 10px;
        border-radius: 3px;
        font-size: 14px;
        line-height: 1.4;
        cursor: default;
    `;

    container.appendChild(tokenInputWrapper);
    container.appendChild(saveTokenButton);
    container.appendChild(searchBox);
    container.appendChild(resultDiv);
    document.body.appendChild(container);

    // 读取保存的token
    let token = GM_getValue('oneTokenValue', '');
    tokenInput.value = token;

    // 切换token可见性
    toggleTokenVisibility.addEventListener('click', function() {
        if (tokenInput.type === 'password') {
            tokenInput.type = 'text';
            toggleTokenVisibility.textContent = '🔒';
        } else {
            tokenInput.type = 'password';
            toggleTokenVisibility.textContent = '👁️';
        }
    });

    // 保存token
    saveTokenButton.addEventListener('click', function() {
        token = tokenInput.value.trim();
        GM_setValue('oneTokenValue', token);
        alert('Token已保存');
    });

    // 添加拖拽功能
    let isDragging = false;
    let dragOffsetX, dragOffsetY;

    container.addEventListener('mousedown', function(e) {
        if (e.target === container) {
            isDragging = true;
            dragOffsetX = e.clientX - container.offsetLeft;
            dragOffsetY = e.clientY - container.offsetTop;
        }
    });

    document.addEventListener('mousemove', function(e) {
        if (isDragging) {
            container.style.left = (e.clientX - dragOffsetX) + 'px';
            container.style.top = (e.clientY - dragOffsetY) + 'px';
            container.style.right = 'auto';
        }
    });

    document.addEventListener('mouseup', function() {
        isDragging = false;
    });

    // 添加事件监听器
    searchBox.addEventListener('keypress', function(e) {
        if (e.key === 'Enter') {
            searchAnswer(this.value);
        }
    });

    // 添加划词搜索功能
    let selectionTimeout;
    document.addEventListener('selectionchange', function() {
        clearTimeout(selectionTimeout);
        selectionTimeout = setTimeout(() => {
            const selectedText = window.getSelection().toString().trim();
            if (selectedText) {
                searchBox.value = selectedText;
                searchAnswer(selectedText);
            }
        }, 2000); // 2秒延迟
    });

    // 搜索答案的函数
    function searchAnswer(question) {
        if (!token) {
            resultDiv.textContent = '请先设置你的Token';
            return;
        }

        const simple = "true";
        const split = "%23";
        const url = `https://q.icodef.com/api/v1/q/${encodeURIComponent(question)}?simple=${simple}&token=${token}&split=${split}`;

        resultDiv.textContent = '搜索中...';

        GM_xmlhttpRequest({
            method: "GET",
            url: url,
            onload: function(response) {
                console.log(response);
                if (response.status === 200) {
                    const result = JSON.parse(response.response);
                    if (result.data) {
                        resultDiv.textContent = `搜索结果:${result.data}`;
                    } else {
                        resultDiv.textContent = '未找到相关答案';
                    }
                } else {
                    const result = JSON.parse(response.response);
                    resultDiv.textContent = result.msg || '搜索失败,请稍后再试';
                }
            },
            onerror: function(error) {
                console.error('搜索出错:', error);
                resultDiv.textContent = '搜索出错,请检查网络连接';
            }
        });
    }
})();