天天基金数据抽取

用以快捷显示累计净值,任期回报,平均回报,一年前累计净值,月高点,月低点

目前為 2021-12-13 提交的版本,檢視 最新版本

// ==UserScript==
// @name         天天基金数据抽取
// @namespace    http://tampermonkey.net/
// @version      1.5.0
// @description  用以快捷显示累计净值,任期回报,平均回报,一年前累计净值,月高点,月低点
// @author       aotmd
// @match        http://fund.eastmoney.com/*
// @match        http://*.eastmoney.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @noframes
// @license MIT 
// ==/UserScript==
const setting = {
    是否查看近一年净值: true,//批量查看时防止卡顿,建议关闭
    自动关闭不满5年基金: false,//自动关闭基金经理任期低于5年的基金,选指数基金时关闭
    自动关闭平均回报过低基金: false,//自动关闭业绩不好的基金
    指数基金年化代替为成立以来年化: false,//用来选指数基金
    指数用成立时间不满5年则关闭:false,//用来选指数基金
    满五年日期常量:"2016-12-31",
    回报率常量:19,
};
(function() {
    addLoadEvent(() => {
        var url = window.location.href;
        //主页面
        var str = /fund\.eastmoney\.com\/.+/i;
        //净值页面
        var str2 = /.+eastmoney\.com.+/i;

        if (str.test(url)) {
            window.setTimeout(() => {
                //做好显示面板
                let divElement1 = document.createElement('div');
                divElement1.className = "gs1";
                document.body.appendChild(divElement1);
                divElement1.style = "top: calc( 15% - 42px );;font-size: 16px;";

                let divElement2 = document.createElement('div');
                divElement2.className = "gs1";
                document.body.appendChild(divElement2);

                let divElement3 = document.createElement('div');
                divElement3.className = "gs1";
                document.body.appendChild(divElement3);
                divElement3.style = "top: calc( 15% + 190px );";


                //显示基金名称
                var 基金名称 = document.querySelector("#body > div:nth-child(8) > div > div > a:nth-child(7)").innerText;
                divElement1.innerHTML = 基金名称;


                var 任期回报 = (document.querySelector("tr.noBorder > td.td04.bold").innerText.replace("%", "") / 100).toFixed(4);
                var 任职时间 = document.querySelector("tr.noBorder > td.td01").innerText.replace("~至今", "");
                var 累计净值 = document.querySelector("dl.dataItem03 > dd.dataNums > span").innerText;
                var 净值时间 = document.querySelector("dl.dataItem02 > dt > p").innerText.split('(')[1].replace(')', '');
                //取得指定股票代码
                var 股票代码 = window.location.pathname.replace("/", "").replace(".html", "");
                var 净值网址 = document.querySelector("#Div2 > div.item_title.hd > div.item_more > a").href;
                var 平均回报率 = ((Math.pow(Number(任期回报) + 1, 1 / (GetNumberOfDays(new Date(), 任职时间) / 365)) - 1) * 100).toFixed(2);
                var 成立时间 = document.querySelector("div.infoOfFund > table > tbody > tr:nth-child(2) > td:nth-child(1)").innerText.replace("成 立 日:", "");

                //指数基金年化代替,平均回报计算为成立以来年化
                if (setting.指数基金年化代替为成立以来年化) {
                    平均回报率 = ((Math.pow(累计净值, 1 / (GetNumberOfDays(new Date(), 成立时间) / 365)) - 1) * 100).toFixed(2);
                }
                //指数成立时间不满5年则关闭
                if(setting.指数用成立时间不满5年则关闭&&成立时间 > setting.满五年日期常量){
                    window.close();
                    return;
                }
                //不满五年判断
                if (setting.自动关闭不满5年基金 && 任职时间 > setting.满五年日期常量) {
                    window.close();
                    return;
                }
                //回报率判断
                if (setting.自动关闭平均回报过低基金 && 平均回报率 < setting.回报率常量) {
                    window.close();
                    return;
                }
                //打开新窗口,获取净值
                if (setting.是否查看近一年净值) {
                    window.open(净值网址 + "?ref=" + 股票代码, '_blank',
                        "height=100,width=100,top=" + window.screen.height + ",left=" + window.screen.width + ",location=0,menubar=0,status=0,titlebar=0,toolbar=0");
                }
                //持续监听变化
                var flag = "";
                window.setInterval(() => {
                    //显示基本信息
                    var 一年前的时间 = GM_getValue(股票代码 + "时间");
                    var 一年前累计净值 = GM_getValue(股票代码 + "净值");
                    if (flag === 一年前累计净值) return;
                    flag = 一年前累计净值;
                    var 近一年 = ((累计净值 / 一年前累计净值 - 1) * 100).toFixed(2) + "%";
                    divElement2.innerHTML =
                        "近一年:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + 近一年 +
                        "<br>净值时间:                        " + 净值时间 +
                        "<br>累计净值:&nbsp;&nbsp;&nbsp;&nbsp;" + 累计净值 +
                        "<br>取值时间:                        " + 一年前的时间 +
                        "<br>累计净值:&nbsp;&nbsp;&nbsp;&nbsp;" + 一年前累计净值 +
                        "<br>任职时间:                        " + 任职时间 +
                        "<br>任期回报:&nbsp;&nbsp;&nbsp;&nbsp;" + 任期回报 +
                        "<br>平均回报:&nbsp;&nbsp;&nbsp;&nbsp;" + 平均回报率 + "%";
                }, 100);

                var flag2, flag3,flag4;
                window.setInterval(() => {
                    var 当前估值 = parseFloat((document.querySelector("#gz_gszzl").innerText.replace("%", "") / 100).toFixed(4));
                    //---最大值
                    var 近一个月最大累计净值时间 = GM_getValue(股票代码 + "近一个月最大累计净值时间");
                    var 近一个月最大累计净值 = GM_getValue(股票代码 + "近一个月最大累计净值");
                    var 与月高点的差距 = 1 - 累计净值 * (1 + (当前估值)) / 近一个月最大累计净值;
                    //---最小值
                    var 近一个月最小累计净值时间 = GM_getValue(股票代码 + "近一个月最小累计净值时间");
                    var 近一个月最小累计净值 = GM_getValue(股票代码 + "近一个月最小累计净值");
                    var 与月低点的差距 = 累计净值 * (1 + (当前估值)) / 近一个月最小累计净值 -1;

                    //---值检测
                    if (flag2 === 近一个月最大累计净值时间 && flag3 === 当前估值&& flag4===近一个月最小累计净值时间) return;
                    flag2 = 近一个月最大累计净值时间;
                    flag3 = 当前估值;
                    flag4 = 近一个月最小累计净值时间;

                    与月高点的差距 = (与月高点的差距 * 100).toFixed(2) + "%";
                    与月低点的差距 = (与月低点的差距 * 100).toFixed(2) + "%";
                    divElement3.innerHTML = "当前估值:&nbsp;&nbsp;&nbsp;&nbsp;" + (当前估值 * 100).toFixed(2) + "%" +
                        "<br>近一个月最大累计净值:<br>取值时间:" + 近一个月最大累计净值时间 +
                        "<br>累计净值:&nbsp;&nbsp;&nbsp;&nbsp;" + 近一个月最大累计净值 +
                        "<br>与月高点的差距:" + 与月高点的差距+
                        "<br>近一个月最小累计净值:<br>取值时间:"+ 近一个月最小累计净值时间+
                        "<br>累计净值:&nbsp;&nbsp;&nbsp;&nbsp;" + 近一个月最小累计净值 +
                        "<br>与月低点的差距:" + 与月低点的差距;
                }, 100);

            }, 0);
        } else if (str2.test(url) && getQueryString("ref") != null) {
            var ref = getQueryString("ref");
            window.setTimeout(() => {
                //找到近20个交易日累计净值的最大值
                var 近20个交易日时间 = document.querySelectorAll("#jztable > table > tbody > tr > td:nth-child(1)");
                var 近20个交易日累计净值 = document.querySelectorAll("#jztable > table > tbody > tr > td:nth-child(3)");
                var maximumIndex = 0;
                var minimumIndex=0;
                for (let key in 近20个交易日累计净值) {
                    if (近20个交易日累计净值[key].innerText > 近20个交易日累计净值[maximumIndex].innerText) {
                        maximumIndex = key;
                    }
                    if (近20个交易日累计净值[key].innerText < 近20个交易日累计净值[minimumIndex].innerText) {
                        minimumIndex = key;
                    }
                }
                GM_setValue(ref + "近一个月最大累计净值时间", 近20个交易日时间[maximumIndex].innerText);
                GM_setValue(ref + "近一个月最大累计净值", 近20个交易日累计净值[maximumIndex].innerText);
                GM_setValue(ref + "近一个月最小累计净值时间", 近20个交易日时间[minimumIndex].innerText);
                GM_setValue(ref + "近一个月最小累计净值", 近20个交易日累计净值[minimumIndex].innerText);

                //找一年前的累计净值
                document.querySelector("#pagebar > div.pagebtns > input.pnum").value = 13;
                document.querySelector("#pagebar > div.pagebtns > input.pgo").click();
                window.setTimeout(() => {
                    var 时间 = document.querySelectorAll("#jztable > table > tbody > tr > td:nth-child(1)");
                    var 净值 = document.querySelectorAll("#jztable > table > tbody > tr > td:nth-child(3)");
                    GM_setValue(ref + "时间", 时间[2].innerText);
                    GM_setValue(ref + "净值", 净值[2].innerText);
                    window.close();
                }, 500);
            }, 0);
        }
    });

    addStyle(`
    .gs1 {
        padding: 5px 5px;
        font-size: 14px;
        color: snow;
        position: fixed;
        text-align: left;
        cursor: copy;
        border-radius: 10px;
        background-color: rgba(135, 134, 241, 0.84);
        right: 5px;
        top: 15%;
        z-index: 999999;
        //box-shadow: 0 0 7px 0 rgba(18, 80, 18,0.4), 0 0 0 1px rgba(0,0,0,0.3);
        min-width: 144px;
    }`);

    /**
     * 添加浏览器执行事件
     * @param func 无参匿名函数
     */
    function addLoadEvent(func) {
        let oldOnload = window.onload;
        if (typeof window.onload != 'function') {
            window.onload = func;
        } else {
            window.onload = function() {
                try {
                    oldOnload();
                } catch (e) {
                    console.log(e);
                } finally {
                    func();
                }
            }
        }
    }

    /**
     * 获取网页参数
     * @param name 参数名称
     * @returns {string|null}
     */
    function getQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = decodeURI(window.location.search).substr(1).match(reg);
        if (r != null) return (r[2]);
        return null;
    }

    //添加css样式
    function addStyle(rules) {
        let styleElement = document.createElement('style');
        styleElement["type"] = 'text/css';
        document.getElementsByTagName('head')[0].appendChild(styleElement);
        styleElement.appendChild(document.createTextNode(rules));
    }

    /**
     * 对象排序方法
     * @param obj1
     * @param obj2
     * @returns {number}
     */
    var compare = function(obj1, obj2) {
        var val1 = obj1.innerText;
        var val2 = obj2.innerText;
        if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }
    };

    /**
     * 两个时间相减,返回天数
     * @param date1 较大的日期
     * @param date2 较小的日期
     * @returns {number}
     * @constructor
     */
    function GetNumberOfDays(date1, date2) { //获得天数
        //date1:开始日期,date2结束日期
        var a1 = Date.parse(new Date(date1));
        var a2 = Date.parse(new Date(date2));
        var day = parseInt((a1 - a2) / (1000 * 60 * 60 * 24)); //核心:时间戳相减,然后除以天数
        return day
    }
})();