Greasy Fork

Greasy Fork is available in English.

安服小助手

安服必备

当前为 2023-08-28 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @license      MIT
// @name         安服小助手
// @namespace    http://key08.com/
// @version      0.1
// @description  安服必备
// @author       huoji
// @match        *://*/*
// @grant        GM_setClipboard
// @grant        GM_xmlhttpRequest
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

(function() {
    'use strict';
    // 创建自定义的右键菜单
    var customContextMenu = document.createElement('div');
    customContextMenu.id = 'custom-context-menu';
    customContextMenu.style.display = 'none';
    customContextMenu.style.position = 'fixed';
    customContextMenu.style.zIndex = '10000';
    customContextMenu.style.backgroundColor = '#fff';
    customContextMenu.style.border = '1px solid #000';
    customContextMenu.innerHTML = '<div><button id="send-to-tip-button">进行KSN云查</button></div>' +
                                  '<div><button id="copy-button">复制到剪切板</button></div>' +
                                  '<div><button id="vt-search-button">发送到VirusTotal</button></div>' +
                                  '<div><button id="wb-search-button">发送到微步</button></div>' +
                                  '<div><button id="change-ksn-key-button">修改KSN密钥</button></div>';
    document.body.appendChild(customContextMenu);

    // 创建气泡提示
    var bubble = document.createElement('div');
    bubble.id = 'huoji_tip_bubble';
    bubble.style.display = 'none';
    bubble.style.position = 'fixed';
    bubble.style.zIndex = '10001';
    bubble.style.padding = '10px';
    bubble.style.borderRadius = '5px';
    bubble.style.color = '#fff';
    document.body.appendChild(bubble);

    // 创建加载动画
    var loader = document.createElement('div');
    loader.id = 'huoji_tip_loader';
    loader.style.display = 'none';
    loader.style.borderRadius = '50%';
    loader.style.animation = 'spin 2s linear infinite';
    loader.style.border = '8px solid #f3f3f3';  // 减小边框大小
    loader.style.borderTop = '8px solid #3498db';  // 顶部边框保持颜色,但大小减半
    loader.style.width = '60px';  // 宽度减半
    loader.style.height = '60px';  // 高度减半

    document.body.appendChild(loader);

    // 添加CSS动画
    var style = document.createElement('style');
    style.innerHTML = `
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
    `;
    document.head.appendChild(style);

    // 当用户右击页面时,如果选中的是MD5或SHA1哈希值,则显示自定义的右键菜单
    document.oncontextmenu = function(e) {

        var text = window.getSelection().toString();
        var md5Pattern = /^[a-f0-9]{32}$/i;
        var sha1Pattern = /^[a-f0-9]{40}$/i;
        var ipPattern = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/;
        var domainPattern = /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}$/i;

        if (md5Pattern.test(text) || sha1Pattern.test(text) || ipPattern.test(text) || domainPattern.test(text)) {
            e.preventDefault();

            customContextMenu.style.left = e.pageX + 'px';
            customContextMenu.style.top = e.pageY + 'px';
            customContextMenu.style.display = 'block';

            document.getElementById('send-to-tip-button').onclick = function () {
                if (md5Pattern.test(text) == false && sha1Pattern.test(text) == false) {
                    alert('请输入正确的MD5或SHA1哈希值');
                    return;
                }
                var apiKey = GM_getValue('apiKey');
                if (!apiKey) {
                    apiKey = prompt("第一次使用需要填KSN密钥, 请输入您的KSN API密钥:", "");
                    GM_setValue('apiKey', apiKey);
                }
                // 显示加载动画
                loader.style.position = 'fixed';
                loader.style.left = e.clientX + 'px';  // 使用鼠标点击时的坐标
                loader.style.top = e.clientY + 'px';
                loader.style.display = 'block';
                loader.style.zIndex = '9999';
                GM_xmlhttpRequest({
                    method: "GET",
                    url: "https://opentip.kaspersky.com/api/v1/search/hash?request=" + text,
                    headers: {
                        "x-api-key": apiKey
                    },
                    onload: function (response) {
                        loader.style.display = 'none';

                        if (response.status === 404) {
                            showBubble(e.pageX, e.pageY, '找不到hash', '#888');
                        } else if (response.status === 200) {
                            var result = JSON.parse(response.responseText);
                            switch (result.Zone) {
                                case 'Green':
                                    showBubble(e.pageX, e.pageY, '白文件', '#888');
                                    break;
                                case 'Yellow':
                                    showBubble(e.pageX, e.pageY, '广告文件', '#888');
                                    break;
                                case 'Grey':
                                    showBubble(e.pageX, e.pageY, '未知文件', '#888');
                                    break;
                                case 'Red':
                                    showBubble(e.pageX, e.pageY, '病毒文件', '#f00');
                                    break;
                            }
                        } else if (response.status === 401) {
                            var userChoice = confirm("KSN API密钥错误,你想更换密钥吗?");
                            if (userChoice == true) {
                                apiKey = prompt("重新输入密钥:", "");
                                GM_setValue('apiKey', apiKey);
                            }
                        } else if (response.status === 403) {
                            var userChoice = confirm("密钥超过一天配额,换密钥或者明天再用,你想更换密钥吗?");
                            if (userChoice == true) {
                                apiKey = prompt("重新输入密钥:", "");
                                GM_setValue('apiKey', apiKey);
                            }
                        } else if (response.status === 400) {
                            alert('!MD5或者sha1不正确!');
                        }
                    }
                });

                customContextMenu.style.display = 'none';  // 关闭菜单
            };

            document.getElementById('copy-button').onclick = function() {
                GM_setClipboard(text);
                customContextMenu.style.display = 'none';  // 关闭菜单
            };
            document.getElementById('vt-search-button').onclick = function () {
                if (md5Pattern.test(text) == false && sha1Pattern.test(text) == false) {
                    alert('请输入正确的MD5或SHA1哈希值');
                    return;
                }
                window.open('https://www.virustotal.com/gui/file/' + text, '_blank');
                customContextMenu.style.display = 'none';  // 关闭菜单
            };
            document.getElementById('change-ksn-key-button').onclick = function () {
                apiKey = prompt("重新输入密钥:", "");
                GM_setValue('apiKey', apiKey);
            };
            document.getElementById('wb-search-button').onclick = function () {
                if (md5Pattern.test(text) || sha1Pattern.test(text)) {
                    alert('请输入域名或者IP地址');
                    return;
                } else if (ipPattern.test(text)) {
                    window.open('https://x.threatbook.com/v5/ip/' + text, '_blank');
                } else if (domainPattern.test(text)) {
                    window.open('https://x.threatbook.com/v5/domain/' + text, '_blank');
                }
                customContextMenu.style.display = 'none';  // 关闭菜单
            };
        }
    };

    // 点击其他地方关闭菜单和气泡提示
    document.onclick = function(e) {
        if (e.target.id !== 'send-to-tip-button' && e.target.id !== 'copy-button' && e.target.id !== 'vt-search-button' && e.target.id !== 'wb-search-button') {
            customContextMenu.style.display = 'none';
            bubble.style.display = 'none';
        }
    };

    // 显示气泡提示
    function showBubble(x, y, message, color) {
        bubble.style.left = x + 'px';
        bubble.style.top = y + 'px';
        bubble.style.backgroundColor = color;
        bubble.textContent = message;
        bubble.style.display = 'block';
    }
})();