显示实时价格 (v0.9 - 币安API版)

使用币安API显示价格,可拖动/记忆位置,且不在币安网站上运行。

// ==UserScript==
// @name         显示实时价格 (v0.9 - 币安API版)
// @namespace    http://tampermonkey.net/
// @version      0.9
// @description  使用币安API显示价格,可拖动/记忆位置,且不在币安网站上运行。
// @author       You & AI Assistant
// @match        *://*/*
// @exclude      *://*.binance.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // 用于存储位置的键名
    const POS_STORAGE_KEY_X = 'price-div-pos-x';
    const POS_STORAGE_KEY_Y = 'price-div-pos-y';

    // --- 修改:加密货币配置列表以适应币安API ---
    // 'name' 用于显示, 'symbol' 用于API查询
    const cryptoConfig = [
        { name: 'BTC', symbol: 'BTCUSDT' },
        { name: 'ETH', symbol: 'ETHUSDT' },
        { name: 'SOL', symbol: 'SOLUSDT' }
    ];

    // 创建价格显示容器
    const priceDiv = document.createElement('div');
    // ... (所有样式和拖动功能的代码保持不变)
    priceDiv.style.position = 'fixed';
    priceDiv.style.zIndex = '999999';
    const savedX = GM_getValue(POS_STORAGE_KEY_X, null);
    const savedY = GM_getValue(POS_STORAGE_KEY_Y, null);
    if (savedX !== null && savedY !== null) {
        priceDiv.style.left = savedX;
        priceDiv.style.top = savedY;
    } else {
        priceDiv.style.top = '30px';
        priceDiv.style.right = '10px';
    }
    priceDiv.style.pointerEvents = 'none';
    priceDiv.style.backgroundColor = 'rgba(255, 255, 255, 0.85)';
    priceDiv.style.color = '#000000';
    priceDiv.style.padding = '5px 10px';
    priceDiv.style.border = '1px solid #ccc';
    priceDiv.style.borderRadius = '5px';
    priceDiv.style.fontSize = '14px';
    priceDiv.style.fontFamily = 'monospace';
    priceDiv.style.lineHeight = '1.5';
    priceDiv.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
    priceDiv.style.textAlign = 'right';
    document.body.appendChild(priceDiv);
    let isDragging = false;
    let dragStartX, dragStartY, initialLeft, initialTop;
    document.addEventListener('keydown', e => { if (e.key === 'Alt' && !isDragging) { priceDiv.style.pointerEvents = 'auto'; priceDiv.style.cursor = 'move'; } });
    document.addEventListener('keyup', e => { if (e.key === 'Alt' && !isDragging) { priceDiv.style.pointerEvents = 'none'; priceDiv.style.cursor = 'default'; } });
    priceDiv.addEventListener('mousedown', e => { if (e.altKey) { isDragging = true; if(priceDiv.style.right) { priceDiv.style.left = priceDiv.offsetLeft + 'px'; priceDiv.style.right = ''; } dragStartX = e.clientX; dragStartY = e.clientY; initialLeft = priceDiv.offsetLeft; initialTop = priceDiv.offsetTop; e.preventDefault(); } });
    document.addEventListener('mousemove', e => { if (isDragging) { const dx = e.clientX - dragStartX; const dy = e.clientY - dragStartY; priceDiv.style.left = `${initialLeft + dx}px`; priceDiv.style.top = `${initialTop + dy}px`; } });
    document.addEventListener('mouseup', e => { if (isDragging) { isDragging = false; if (!e.altKey) { priceDiv.style.pointerEvents = 'none'; priceDiv.style.cursor = 'default'; } GM_setValue(POS_STORAGE_KEY_X, priceDiv.style.left); GM_setValue(POS_STORAGE_KEY_Y, priceDiv.style.top); } });


    // --- 重写:更新价格函数以使用币安API ---
    function updatePrices() {
        // 币安API可以一次性获取所有交易对的价格
        fetch('https://api.binance.com/api/v3/ticker/price')
            .then(response => {
                if (!response.ok) throw new Error('Binance API request failed');
                return response.json();
            })
            .then(allPrices => {
                // 为了高效查找,将返回的数组转换成一个Map对象
                const priceMap = new Map(allPrices.map(item => [item.symbol, item.price]));

                // 根据我们的配置列表,从Map中查找价格并生成HTML
                const priceHTML = cryptoConfig.map(crypto => {
                    const price = parseFloat(priceMap.get(crypto.symbol) || 0); // 从Map中获取价格
                    const formattedPrice = price.toLocaleString('en-US', {
                        minimumFractionDigits: 2,
                        maximumFractionDigits: 2
                    });
                    return `<div>${crypto.name}: $${formattedPrice}</div>`;
                }).join('');

                const tipHTML = `<div style="font-size: 10px; color: #888; border-top: 1px solid #eee; margin-top: 4px; padding-top: 4px;">按住ALT键可拖动</div>`;

                priceDiv.innerHTML = priceHTML + tipHTML;
            })
            .catch(error => {
                console.error('获取价格失败:', error);
                priceDiv.innerHTML = '价格加载失败';
            });
    }

    // 立即执行一次,然后每5秒更新
    updatePrices();
    setInterval(updatePrices, 5000);
})();