V2EX Solana Token Checker

在 V2EX 用户首页显示 $V2EX 代币持仓量

当前为 2025-07-27 提交的版本,查看 最新版本

// ==UserScript==
// @name         V2EX Solana Token Checker
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  在 V2EX 用户首页显示 $V2EX 代币持仓量
// @match        https://www.v2ex.com/member/*
// @grant        none
// @run-at       document-end
// @license      MIT
// ==/UserScript==

(async function () {
    'use strict';

    const TOKEN_MINT = "9raUVuzeWUk53co63M4WXLWPWE4Xc6Lpn7RS9dnkpump";

    const scripts = Array.from(document.querySelectorAll('script'));
    let address = null;

    for (const script of scripts) {
        const text = script.textContent.trim();
        const match = text.match(/const\s+address\s*=\s*"([^"]+)"/);
        if (match) {
            address = match[1];
            break;
        }
    }

    if (!address) {
        return;
    }

    async function getTokenBalance(owner, mint) {
        const url = "https://solana-rpc.publicnode.com";
        const payload = {
            "jsonrpc": "2.0",
            "id": 1,
            "method": "getTokenAccountsByOwner",
            "params": [
                owner,
                { "mint": mint },
                { "encoding": "jsonParsed" }
            ]
        };

        const res = await fetch(url, {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(payload)
        });

        const data = await res.json();

        try {
            const value = data.result.value;
            if (value.length === 0) return 0;

            const amount = value[0].account.data.parsed.info.tokenAmount.uiAmount;
            return amount;
        } catch (e) {
            return null;
        }
    }

    const balance = await getTokenBalance(address, TOKEN_MINT);

    if (balance === null) {
        return;
    }

    const targetElement = document.querySelector('a[href="/top/dau"]');
    if (!targetElement) {
        return;
    }

    const newHtml = `
        <div class="sep5"></div>
        <div class="flex-one-row" style="display: inline-flex; gap: 5px;">
            <div class="badges">
                <div class="badge" style="background-color: #000; color: #fff;">$V2EX</div>
            </div>
            <span>持有 ${balance}</span>
        </div>
    `;

    targetElement.insertAdjacentHTML('afterend', newHtml);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址