Allen's Magic

Allen's magic casting to internet

当前为 2020-05-25 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Allen's Magic
// @namespace    https://tampermonkey.net/
// @version      4.0.3
// @description  Allen's magic casting to internet
// @author       @Amormaid
// @run-at       document-end
// @match        http://*/*
// @include      http://*
// @include      https://*
// @exclude      http://localhost*
// @license      MIT License
// @grant        none
// ==/UserScript==




function main() {
    // console.log('document.cookie', document.cookie)
    // document.cookie = document.cookie + 'hhhhhhhhhhhhhhhhhhhhhhh';
    // console.log('document.cookie after', document.cookie)
  // var root = document.body;
//   var hostname = /\d+\.\d+\.\d+\.\d+/.test(window.location.hostname) ? "ip": window.location.hostname;
  var hostname = window.location.hostname;

  if (exclude_check(hostname)) {
    return
  }

  // console.clear();

  try {
    console.time("allen_web_time_count");

    // customer change
    let rule = customer_rule(hostname)
    rule && rule.action()

    // content_purge(main_ele)

    console.timeEnd("allen_web_time_count");
  } catch(err) {
    //console.log(err.name,' ',err.message);
    console.log(err.message);
  }
}

//  white list check
function exclude_check(hostname_param) {
  // 不执行脚本的网站白名单
  let exclude_list = [
      "www.youtube.com",
      "demo.mycodes.net",
      "kiwivm.64clouds.com",
      "www.instagram.com",
      "www.h-ui.net",
      "www.layui.com",
      "www.kixeye.com",
      "pan.baidu.com",
      "www.rishiqing.com",
      "wx.qq.com",
      "mail.126.com",
      "twitter.com",
      "reactjs.org",
      "codepen.io",
      "free.modao.cc",
      "lanhuapp.com",
      "developers.weixin.qq.com",
      // "jira.vankeservice.com",
      "www.tapd.cn",
      "modao.cc",
      "element-cn.eleme.io",
      "github.com",
      ""
  ]
  return exclude_list.includes(hostname_param)
}

// 自定义样式调整
function customer_rule(hostname) {
  let rules = [
    {
      rule: "default",
      hostname: "ip",
      regexp: "",
      action: () => {}
    },
    {
      rule: "default",
      hostname: "ikkedu.com",
      regexp: "",
      action: async () => {
        // if (!parseQuery()['download']) {
        //     return
        // }
        const TYPE = parseQuery()['type'] || 'default'
        // // use MutationObserver instead of waiting react-based-rending elments complete
        const MO = new MutationObserverClass({window: window})
		
		if (['RA'].includes(TYPE)) {
			const RA_HOT = []

			MO.start({
			  // element: document.getElementById('app'),
			  selector: '.essayText.dictionary-word',
			  fn: async function (){
				await sleep(500)
				const title = _$('#topinfosTitle').innerText
				const id = _$('.tip-span.tip0').innerText
				const text = _$('.essayText.dictionary-word').innerText
				console.table({title, id, text})
				if (title && id && text) {
					RA_HOT.push({title, id, text})
				} else {
					alert(id)
				}
				const next_button = Array.from(document.querySelectorAll('.v-tooltip.v-tooltip--top button')).find(ele => ele.innerText == '下一题')

				if (next_button) {
					next_button.click()
				} else {
					const handler = (acc, cur) => {
						return `${acc}\r\n\r\n${cur.id } ${cur.title}\r\n${cur.text}`
					}
					window.RA_HOT = RA_HOT
					// var a = window.RA_HOT.reduce(handler, '')
					MO.stop();
				}
			  }
			});
		}

		if (['RL', 'SST'].includes(TYPE)) {
			MO.start({
			  // element: document.getElementById('app'),
			  selector: '.tip-span.tip0',
			  fn: async function (ele){
				console.log('control_btn ele', ele)
				// const control_btn = document.querySelector('.control-btn')
				// console.log('control_btn ', control_btn)
				// control_btn && control_btn.click()
				await sleep(1000)
				const play_icon = document.querySelector('.play-ctr-btn .material-icons')
				console.log('play_icon ', play_icon)
				play_icon && play_icon.click()
			  }
			});
			MO.start({
			  // element: document.getElementById('app'),
			  selector: '.v-snack__content',
			  fn: async function (ele){
				console.log('v-snack__content ele', ele)
				const next_button = Array.from(document.querySelectorAll('.v-tooltip.v-tooltip--top button')).find(ele => ele.innerText == '下一题')
				ele && next_button && next_button.click()
			  }
			});
			MO.start({
			  // element: document.getElementById('app'),
			  selector: '.waveform audio',
			  fn: async function (){
				const audio_mp3 = document.querySelector('.waveform audio')
				console.log('audio_mp3', audio_mp3)
				if (audio_mp3) {
					audio_mp3.preload = 'none'
					// console.log('audio_mp3', audio_mp3)
					const RS_mp3_id = document.querySelector('.tip-span.tip0').innerText
					// console.log('RS_mp3_id', RS_mp3_id)
					const src = audio_mp3.src
					downloadFile({ filePath: src, fileName: RS_mp3_id})
					await sleep(4 * 1000)
				}
				const next_button = Array.from(document.querySelectorAll('.v-tooltip.v-tooltip--top button')).find(ele => ele.innerText == '下一题')
				// next_button && next_button.click()
				if (next_button) {
					next_button.click()
				} else {
					MO.stop();
				}
			  }
			});
		}

        (['RS', 'ASQ'].includes(TYPE)) && MO.start({
            // element: document.getElementById('app'),
            selector: '.waveform audio',
            fn: async function (){
              const audio_mp3 = document.querySelector('.waveform audio')
              console.log('audio_mp3', audio_mp3)
              if (audio_mp3) {
                  audio_mp3.preload = 'none'
                  // console.log('audio_mp3', audio_mp3)
                  const RS_mp3_id = document.querySelector('.tip-span.tip0').innerText
                  // console.log('RS_mp3_id', RS_mp3_id)
                  const src = audio_mp3.src
                  downloadFile({ filePath: src, fileName: RS_mp3_id})
                  await sleep(1000)
              }
              const next_button = Array.from(document.querySelectorAll('.v-tooltip.v-tooltip--top button')).find(ele => ele.innerText == '下一题')
              // next_button && next_button.click()
				if (next_button) {
					next_button.click()
				} else {
					MO.stop();
				}
          }
        });

        let interval_id = setInterval(() => {
            if (window.frames.length) {
                // window.frames[0].style.display = 'none'
                document.getElementsByTagName('iframe')[0].style.display = 'none'
                // clearInterval(interval_id)
            }
        }, 500)
      }
    },
    {
      rule: "default",
      hostname: "jira.vankeservice.com",
      regexp: "",
      action: () => {
		if (window.location.href !== 'http://jira.vankeservice.com/browse/COST-677') {
        // if (window.location.href !== 'http://jira.vankeservice.com/browse/COST-863') {
			console.log('不是项目页,不能填工时')
			return
		}
		// await sleep(3000)
		console.clear()
		async function log_time() {
			try {
				const workInfoRes = await getData('http://jira.vankeservice.com/rest/tempo-time-activities/1/issue/42572/?page=1&size=5&activityType=all&currentUser=true')
				console.log('getData res', workInfoRes)
				const {activities = []} = workInfoRes || {}
				const time_list = activities.map(e => e.dateTime.slice(0, 10))
				const now = new Date()
				const time_now_string = `${now.getFullYear()}-${('0' + (now.getMonth() + 1)).slice(-2)}-${now.getDate()}`
				const today_not_log = !time_list.includes(time_now_string)
				const today_should_log = isWorkDay()
				const can_log_work_time = today_should_log && today_not_log
				if (can_log_work_time){
					const begin_time = `${getFormatDate(Date.now())}T09:00:27.792`
					const data = {
						attributes: {},
						billableSeconds: '',
						worker: 'xiecy08',
						comment: '修复客户端新增施工项目的UI及交互问题',
						started: begin_time,
						timeSpentSeconds: 28800,
						originTaskId: '42572',
						remainingEstimate: 0,
						endDate: null,
						includeNonWorkingDays: false
					}
					postData('http://jira.vankeservice.com/rest/tempo-timesheets/4/worklogs/', data)
					setTimeout(() => {
						window.location.href = window.location.href
					}, 3 * 1000)
					/*
					console.log('button', _$_('[name=logTimeBtn]', "return_one"))
					const begin_time = `${getFormatDate(Date.now())}T09:00:27.792`
					const end_time = `${getFormatDate(Date.now())}T11:00:27.792`
					const data = {
						"attributes":{},
						"billableSeconds":"",
						"worker":"xiecy08",
						"comment":"编写代码",
						"started":begin_time,
						"timeSpentSeconds":28800,
						"originTaskId":"43581",
						"remainingEstimate":0,
						"endDate":end_time
					}
					*/
					return true
				}
				return false
			} catch (e) {
				window.location.href = window.location.href
			}
		}
		log_time()
		window.intervalId = setInterval(log_time, 1 * 3600 * 1000)
      }
    },
    {
      rule: "default",
      hostname: "wc-kx-vip.sjc.kixeye.com",
      regexp: "",
      action: () => {
        _$_('#above-game-message', 'remove_one');
        _$_('#kxp-footer-bar', 'remove_one');
        _$_('#topnavbar_back', 'remove_one');
      }
    },
    {
      rule: "default",
      hostname: ["www.baidu.com", "zhidao.baidu.com"],
      regexp: "",
      action: () => {
        let interval_id = setInterval( () => {
          const right_list_length = 5
          _$_("#content_right", 'remove_all');
          var zhidao_body = _$_("#body", "return_one");
          var container = _$_("#container", "return_one");
          var head = _$_("#head", "return_one");
          var pad = _$_("#s_tab", "return_one");
          _$_("#rs", "remove_all")
          var u = _$_("#u", "return_one");
          container.style.cssText = "display:block;width:100%;position:relative;"
          head && (() =>  {
            head.style.position = 'relative';
            head.style.width = window.innerWidth - 100 + 'px';
            head.style['min-width'] = 0;
          })();
          pad && (() =>  {
            pad.style.padding = '0 0 0 121px'
          })();
          u && (() =>  {
            u.style.display = 'none'
          })();
          zhidao_body && (() =>  {
            zhidao_body.style.left = "50px"
          })();

          let origin_length = document.getElementById("content_left").children.length

          if (origin_length > 6) {
            // console.log(content_list)
            let right_list = Array.prototype.slice.call(_$_(".result", "return_all"),-1 - right_list_length, -1)
            let container_r = document.createElement("div")
            container_r.style.cssText += "display:block;position:absolute;top:40px;left:740px;width:600px;"
            // let str = Array.prototype.reduce.call(right_list, (html_str, item ,index , right_list) => (item.innerHTML + html_str), '')
            Array.prototype.forEach.call(right_list, item => {
              item.style.cssText += "padding:10px 0;"
              container_r.appendChild(item)
            })
            let container_r_dom = container.appendChild(container_r)
            let page_indic = _$_("#page", "return_one")
            page_indic.style.cssText = "position:absolute;top:0px;left:660px;margin:-60px 0 0 0;z-index:300"
          }

        },300)
      }
    },
    {
      rule: "default",
      hostname: ["i.taobao.com", "trade.taobao.com", "rate.taobao.com", "buyertrade.taobao.com"],
      regexp: "",
      action: () => {
        _$_(".m-guess-you-like", "remove_one");
        _$_(".m-someone-like-you", 'remove_one');
        _$_("#p4p_ad", 'remove_one');
        _$_(".J_guess-you-like", 'remove_one');
      }
    },
    {
      rule: "default",
      hostname: "login.m.taobao.com",
      regexp: "",
      action: () => {
			setInterval(() => {
				document.querySelector('button[type=submit]').click()
			}, 1 * 1000)
      }
    },
	{
      rule: "default",
      hostname: "main.m.taobao.com",
      regexp: "",
      action: () => {
		autoRefresh(5)
      }
    },
    {
      rule: "default",
      hostname: "h5.m.taobao.com",
      regexp: "",
      action: () => {
		console.log(1)
        const path = window.location.pathname
		if (path === "/trip/rx-flight-onsale/listing/index.html") {
			setTimeout(() => {
				window.location.href = window.location.href
			}, 5 * 60 * 60 * 1000)
			setTimeout(() => {
				var btn = Array.from(_$_('span','return_all')).filter(e => e.innerText == '搜索')[0].parentNode;
				console.log('btn', btn)
				var event = document.createEvent('Events');
				event.initEvent('tap', true, true);
				btn.dispatchEvent(event);
			}, 1000)
		}
      }
    },
    {
      rule: "default",
      hostname: "m.ctrip.com",
      regexp: "",
      action: () => {

			window.setIntervalId = setInterval(() => {
				let Iknow = document.querySelector('.pop-button-ghost')
				if (Iknow) {
					Iknow.click()
					clearInterval(window.setIntervalId)
				}
			}, 1 * 1000)
      }
    },
	{
      rule: "default",
      hostname: "iot.asmiot.com",
      regexp: "",
      action: () => {
		autoRefresh(5)
		window.clickIntervalId = setInterval(() => {
			let btn = _$_('#znjc')[0]
			console.log(btn)
			if (btn) {
				btn.click()
				clearInterval(window.clickIntervalId)
			}
		},5000)
      }
    },
	{
      rule: "default",
      hostname: "mail.126.com",
      regexp: "",
      action: () => {
		autoRefresh(5)
      }
    },
    {
      rule: "default",
      hostname: ["www.cnblogs.com", "blog.csdn.net"],
      regexp: "",
      action: () => {
        _$_('.btn-close', 'return_one').click();
        _$_('#btn-readmore', 'return_one').click();
        _$_('.recommend-box', 'remove_one')
        let main = _$_('main', 'return_one')
        document.body.style.backgroundImage = 'none';
        document.body.style.color = '#fff'
        document.body.innerHTML = ''
        // document.body.style.cssText = 'background-image: "none" ;'
        document.body.appendChild(main)
        main.style.cssText = 'width: 900px; float: left; margin: 0 auto 0 120px;'

        console.log('dasdasda is ', _$_('p', 'return_all'))
        Array.from(_$_('p', 'return_all')).forEach(e => e.style.color = '#fff')

        /*
        setTimeout(() => {
          _$_('aside', 'remove_one')
          _$_(".adblock", "remove_one");
        },2000)

        var content = _$_("#content", "return_one");
        _$_("#sidebar", "remove_one");
        _$_("#side", 'remove_one');

        content && (() =>  {
          content.style["margin-right"] = "10";
          content.style.width = window.innerWidth - 100 + 'px';
        })();

        let article = _$_("#article_content", "return_one");
        article && (() => {
          article.style.height = "100%";
          article.style.overflow = "visible";
        })()
        _$_(".recommend-item-box", "remove_all");
        _$_(".hide-article-box", "remove_one");
        _$_("aside", "remove_one");
        let main = _$_("main", "return_one")
        if (main) main.style.float = "left";
        setTimeout(() => {
          _$_(".adblock", "remove_one");
        },
        3000)
        _$_(".pulllog-box", "remove_one");
        */
      }
    },
    {
      rule: "default",
      hostname: "www.xyzssr.xyz",
      regexp: "",
      action: () => {
		setTimeout(() => {
			let check = document.getElementById('checkin')
			console.log('check', check)
			if (check) {
				check.click()
				window.open('https://www.google.com')
			}
			// window.open("about:blank","_self").close()

		}, 3000)


      }
    },
    {
      rule: "default",
      hostname: "www.w3school.com.cn",
      regexp: "",
      action: () => {
        _$_("#navsecond", 'hide_one');
      }
    },
    {
      rule: "default",
      hostname: "wallstreetcn.com",
      regexp: "",
      action: () => {
        setInterval(() =>  {
          _$_('.news-item__cover', 'remove_all');
          _$_('.qn-img', 'remove_all');
          //  console.log(new Date() - 0)
          change_style();
        },
        500);

        let main = _$_('main', 'return_one');
        document.body.innerHTML = '';
        document.body.appendChild(main);

        _$_('.left-bar', 'remove_one');
      }
    },
    {
      rule: "default",
      hostname: "www.merriam-webster.com",
      regexp: "",
      action: () => {
        _$_(".right-rail", 'hide_one');
        _$_("#recirc-bar-footer", 'hide_one');
        _$_(".wgt-related-to.jc-card-box.clearfix", 'hide_one');
      }
    },
    {
      rule: "default",
      hostname: "blog.sina.com.cn",
      regexp: "",
      action: () => {
        _$_("#column_1", 'hide_one');
      }
    },
    {
      rule: "default",
      hostname: ["blog.jobbole.com", "web.jobbole.com"],
      regexp: "",
      action: () => {
        _$_("#sidebar", 'hide_one');
        var grid = _$_(".grid-8", 'return_one');
        grid && (() =>  {
          grid.style.width = "100%"
        })();
      }
    },
    {
      rule: "default",
      hostname: "juejin.im",
      regexp: "",
      action: () => {
        var interval_id = setInterval(() =>  {
          var a = _$_(".show-full", 'return_one');
          var b = _$_(".show-full-block", 'return_one');
          _$_(".show-full-btn", 'remove_one');
          _$_('.columen-view-aside', 'hide_one');

          if (a) a.style.height = "auto";
          a && a.setAttribute('style', 'height:auto')
          if (b) {
            clearInterval(interval_id);
            b.setAttribute('style', 'height:auto')
          }
        },
        100);
        setInterval(change_style, 300)
      }
    },
    {
      rule: "default",
      hostname: "www.cnblogs.com",
      regexp: "",
      action: () => {
        _$_("#sideBar", 'hide_one');
        _$_("#vid", 'hide_one');
        _$_("#left", 'hide_one');
        _$_("#right_content", 'hide_one');
        _$_("#leftcontent", 'hide_one');
        var a = _$_("#centercontent", 'return_one');
        if (a) {
          a.style['padding-left'] = 0;
        }
      }
    },
    {
      rule: "default",
      hostname: "github.com",
      regexp: "",
      action: () => {
        document.body.style.minWidth = '100px';
        var github_pad = document.querySelector('.column.three-fourths.codesearch-results.pr-6');
        if (github_pad) {
          github_pad.style.padding = '10px 0 10px 30px';
        }
      }
    },
    {
      rule: "default",
      hostname: "wiki.jikexueyuan.com",
      regexp: "",
      action: () => {
        _$_(".detail-left", 'hide_one');
        var a = _$_(".detail-main", 'no_option', 'one');
        a.style['margin-left'] = '0px';
        a.style.width = document.body.clientWidth + 'px';
      }
    },
    {
      rule: "default",
      hostname: "www.cssmoban.com",
      regexp: "",
      action: () => {
        var a = _$_(".wide-main.col-media-main.clearfix", 'return_one');
        a.style.width = document.body.clientWidth + 'px';
      }
    },
    {
      rule: "default",
      hostname: "www.kancloud.cn",
      regexp: "",
      action: () => {
        var interval_id = setInterval(() =>  {
          var a = _$_(".sidebar", 'return_one');
          if (a) {
            _$_(".workspace", 'return_one').style.left = "180px";
            a.style.width = '180px';
            change_style(a);
            clearInterval(interval_id);
          }
        },
        100);
      }
    },
    {
      rule: "default",
      hostname: "php.net",
      regexp: "",
      action: () => {
        _$_('.layout-menu', 'remove_one');
        if (_$_(".sect1", 'return_one')) _$_(".sect1", 'return_one').style.width = document.body.clientWidth - 50 + "px";
        if (_$_("#usernotes", 'return_one')) _$_("#usernotes", 'return_one').style.width = document.body.clientWidth - 50 + "px";
      }
    },
    {
      rule: "default",
      hostname: "www.zhihu.com",
      regexp: "",
      action: () => {
        _$_('.Question-sideColumn.Question-sideColumn--sticky', 'remove_one');
        _$_('.AdblockBanner-inner', 'remove_one');
        _$_('.QuestionHeader-side', 'remove_all');
        _$_('.AppHeader-userInfo', 'remove_all');

        var browser_width = document.body.clientWidth - 50 + "px";
        _$_('.QuestionHeader-content', 'return_one').style.width = browser_width;

        setInterval(() =>  {
          _$_('.HitQrcode', 'remove_one');
        },
        100);
      }
    },
    {
      rule: "default",
      hostname: "www.letscorp.net",
      regexp: "",
      action: () => {
        _$_('#commentlist', 'remove_one');
        _$_('#sidebar', 'remove_one');
        _$_('#header', 'remove_one');

        var browser_width = document.body.clientWidth - 50 + "px";
        _$_('#container', 'return_one').style.width = browser_width;
        _$_('#main', 'return_one').style.height = "auto";
        var p_ele = _$_('p', 'return_all');
        Array.prototype.forEach.call(p_ele,
        function(e) {
          e.style["font-size"] = "16px";
        });
      }
    },
    {
      rule: "default",
      hostname: "segmentfault.com",
      regexp: "",
      action: () => {
        _$_("#loginBanner", "remove_one");
      }
    },
    {
      rule: "default",
      hostname: "huziketang.mangojuice.top",
      regexp: "",
      action: () => {
        for (var i = 0; i < 10000; i++) {
          clearInterval(i);
        }-
        _$_("div", "return_all").forEach(function(ele) {
          if (ele.id && ele.id !== "wrapper" && ele.id !== "uyan_frame" && ele.id !== "donate-mask") {
            ele.parentNode.removeChild(ele);
          }
        });
      }
    },
    {
      rule: "default",
      hostname: "jandan.net",
      regexp: "",
      action: () => {
          // html 调色
          let _html = _$_('html', 'return_one')
          let _body = _$_('body', 'return_one')
          _html.style.backgroundColor = '#333'
          _body.style.backgroundColor = '#333'
          // 去掉某些ID的发图
          let title_list = document.querySelectorAll("[title^=防伪码]")
          let block_user_list = ["42c968079f1cc3495692a053f432e105142a3142"]
          Array.prototype.forEach.call(title_list, (titleDOM) => {
              let author_id = titleDOM.title.replace(/[\u4e00-\u9fa5]{3}:/, '') // 装B正则
              if (block_user_list.includes(author_id)) {
                  let remove_div = titleDOM.parentNode.parentNode.parentNode.parentNode
                  remove_div.parentNode.removeChild(remove_div)
              }
          })
      }
    },
    {
      rule: "default",
      hostname: "www.sogou.com",
      regexp: "",
      action: () => {
          // html 调色
          console.log('sdasdasda')
          let id;
          id = setInterval(() => {
            let right = _$_("#right", "return_one");
              if (right) {
                  _$_("#right", "remove_one");
                  clearInterval(id)
              }
          }, 300);
      }
    },
    {
      rule: "default",
      hostname: "10.0.74.227",
      regexp: "",
      action: () => {
          setTimeout( _ => {
              let title_list = document.querySelectorAll(".opblock-tag")
              Array.prototype.forEach.call(title_list, (titleDOM) => {
                  titleDOM.click()
              })
          }, 10 * 1000)
      }
    },
  ]


  let matched_rule = rules.filter( rule_item => rule_item.hostname instanceof Array
    ? rule_item.hostname.includes(hostname)
    : rule_item.hostname === hostname
  )[0]

  return matched_rule
}



// --------------------- DOM function --------------------------------
//寻找页面的主要内容
function main_ele_searcher() {
  let article = document.getElementsByTagName('article')
  let main = document.getElementsByTagName('main')
  let content = (article.length && article[0]) || (main.length && main[0]) || false
  if (content) {
    return {
      main_ele: content,
      body_width: content.style.width,
      body_height: content.style.height
    };
  }

  var ele = document.querySelectorAll("*");
  var arr = [];
  //var  arr_index = [];
  var w, h;

  var body_width = document.body.clientWidth;
  var body_height = document.body.clientHeight;

  if (!body_height) {
      var max_width = 0, max_height = 0;
      document.documentElement.style.height = '100%';
      document.body.style.height = '100%';

      for (let i = 0, ele_length = ele.length; i < ele_length; i++) {
          w = ele[i].clientWidth;
          h = ele[i].clientHeight;
          if (w > max_width) { max_width = w; }
          if (h > max_height) { max_height = h; }
          w = null;
          h = null;
      }
      body_width = max_width;
      body_height = max_height;
  }


  for (let i = 0, ele_length = ele.length; i < ele_length; i++) {
      w = ele[i].clientWidth;
      h = ele[i].clientHeight;
      //console.log(h);

      if (w && h && w > body_width / 2 && h > body_height / 5 && w < body_width && h < body_height) {
          arr[w * h] = ele[i];
          //console.log(ele[i]);
          //arr_index.push(w * h);
      }
      w = null;
      h = null;
  }
  var main_ele = arr[arr.length - 1] || document.body;
  return {
      main_ele,
      body_width,
      body_height
  };
}

function content_purge() {
  let article = document.getElementsByTagName('article')
  let main = document.getElementsByTagName('main')
  let content = (article.length && article[0]) || (main.length && main[0]) || false;
  if (content) {
    main.style.cssText = 'width: 900px;margin: 40px 0 0 120px;float: left; ';
    document.body.innerHTML = '';
    document.body.appendChild(main);
  }

  // main.parentNode.removeChild(main)
  // Array.from(document.body.children)
  // document.body.insertBefore(main, document.body.firstChild);

}

//去除侧边栏这样“狭长”的内容
function ele_remover(obj) {
    var w, h;
    var { main_ele, body_width, body_height } = obj;
    var ele = document.querySelectorAll("*");
    //console.log(main_ele,body_width, body_height )
    for (let i = 0, ele_length = ele.length; i < ele_length; i++) {
        w = ele[i].clientWidth;
        h = ele[i].clientHeight;
        //  main_ele.parentNode.children
        if (!ele[i].contains(main_ele) && !main_ele.contains(ele[i]) && (ele[i] !== main_ele) && w * 1.4 < h && w < body_width / 2 && w > body_width / 10) {
            //content_adjust(ele[i]);
            console.log("---------element   removed ------------");
            console.log(ele[i]);
            console.log("---------element   removed ------------");

            ele[i].parentNode.removeChild(ele[i]);
        }
        w = null;
        h = null;
    }
}

//去除被移除元素的兄弟元素的padding  margin
function content_adjust(ele) {
    var siblings = ele.parentNode.children;
    ele.parentNode.style.position = "relative";
    // console.log(ele);
    for (let i = 0, ele_length = siblings.length; i < ele_length; i++) {
        //console.log(siblings[i]);
        siblings[i].setAttribute('style', 'position:relative;padding:20px;margin:0px;overflow:visible;');
    }
}

//调整主要内容的样式
function main_content_adjust(main_ele) {
    //var a = [{x,y,top,right,bottom,left,width}]=main_ele.getClientRects();
    main_ele.parentNode.style.position = "relative";
    main_ele.style.cssText = "position:absolute; top:0;right:0; bottom:0;left:0;"
    // main_ele.setAttribute('style','position:relative;padding:20px 20px 20px 40px;margin:auto;clear:both;overflow:visible;');
    var ratio = 0.9 * (window.innerWidth) / main_ele.clientWidth;
    var ele = main_ele.querySelectorAll('*');
    // console.log(ele);
    for (let i = 0, ele_length = ele.length; i < ele_length; i++) {
        ele[i].style.width = ele[i].clientWidth * ratio + "px";
        ele[i].style.overflow = 'visible';
        //console.log(i);
    }

}

// body 全屏
function full_body() {
  let root = document.body
  root.style.cssText = "position:absolute; top:0;right:0; bottom:0;left:0;"

}

//背景调色
function change_style(DOM_node = document.body) {
    return
    //  执行速度 :  for 循环 > forEach > 尾递归 >递归 (迭代)
    let background_base_color = 50;
    let background_offset = 20;
    let font_base_color = 230;
    let font_offset = 20;
    var all = (DOM_node  || document).querySelectorAll('*');
    for (let i = 0, ele_length = all.length; i < ele_length; i++) {
        let item = all[i]
        let item_style = item.style
        let tag_exclude_check = !('script,style,img').includes(item.nodeName.toLowerCase())
        if(tag_exclude_check && !item_style.backgroundColor){
            item_style.backgroundColor =  random_color(background_base_color,background_offset);
            item_style.color =  random_color(font_base_color,font_offset);
        }
    }
}

function random_color(base_color, offset, ratio=1){
    base_color = (base_color & 255) === (~~base_color) ? ~~base_color : 255;
    offset = ~~offset
    offset = (base_color+offset > 0 && base_color+offset < 256)? offset : 0
    return `rgba(${(base_color + offset*Math.random())&255},${(base_color + offset*Math.random())&255},${(base_color + offset*Math.random())&255},0.8)`;
}

function ele_hide(e) {
    // if (document.body.hasChildNodes(e)) e.style.display = "none";
    document.body.hasChildNodes(e) && e.length !== 0 && e.style.setAttribute('display', "none");
}
function ele_hide_all(all) {
    Array.prototype.forEach.call(all, function (e) { e.style.display = "none"; });
}
function ele_remove(e) {
    // if (document.body.hasChildNodes(e)) e.parentNode.removeChild(e);
    e = e.length ? e[0] : e
    document.body.hasChildNodes(e) && e.length !== 0 && e.parentNode.removeChild(e);
}
function ele_remove_all(all) {
    if (all) {
        all = Array.from(all)
    }
    if (!all.length) {
        return
    }
    Array.prototype.forEach.call(all, function (e) {
        e instanceof Object && e.parentNode.removeChild(e);
    });
}

function _$_(selector, operation_code) {
    // operation_code  : return_one return_all remove_one remove_all hide_one hide_all
    function get(selector) {
        if((/^#[^.#]+$/).test(selector)) {
           return [document.getElementById(selector.slice(1, selector.length))]
        }
        if((/^\.[^.#]+$/).test(selector)) {
           return document.getElementsByClassName(selector.slice(1, selector.length))
        }
        if((/^[^.#\[\]=]+$/).test(selector)) {
           return document.getElementsByTagName(selector)
        }
		return document.querySelectorAll(selector)
    }
    switch (operation_code) {
        case 'return_one': //return_one
            // return document.querySelector(selector);
            return get(selector)[0];
        case 'return_all':// return_all
            // return document.querySelectorAll(selector);
            return get(selector);
        case 'remove_one':  //remove_one
            // ele_remove(document.querySelector(selector));
            ele_remove(get(selector));
            break;
        case 'remove_all': //remove_all
            // ele_remove_all(document.querySelectorAll(selector));
            ele_remove_all(get(selector));
            break;
        case 'hide_one': //hide_one
            // ele_hide(document.querySelector(selector));
            ele_hide(get(selector));
            break;
        case 'hide_all':// hide_all
            // ele_hide_all(document.querySelectorAll(selector));
            ele_hide_all(get(selector));
            break;

        default:
            // JQuery like
            var result = get(selector);
            result.remove = function(){ele_remove(this)} // ele_remove() only delete one or the first of the list
            return result
            // return result.length > 1 ? result : result[0];
    }
}

function _$() {
	return document.querySelector.apply(document, arguments)
}
function _$$() {
	return document.querySelectorAll.apply(document, arguments)
}

function _CSS(DOM_ele, pseudo_class) {
   return pseudo_class ? window.getComputedStyle(DOM_ele, pseudo_class) : window.getComputedStyle(DOM_ele)
}

function revert_color(color) {
  const [red, blue, green, alpha] = color.match(/\d{1,3}/g);
  return Number(alpha) ? `rgba(${255 - red}, ${255 - blue}, ${255 - green}, ${alpha})` : `rgb(${255 - red}, ${255 - blue}, ${255 - green})`;
}

function remove_div_padding_margin(ele) {
    if (ele) {
        ele.setAttribute('style', 'overflow:visible;position:relative;padding:0px;margin:0px;left:0px;');
    }
    if (ele && ele.children.length > 0) {
        Array.prototype.forEach.call(ele.children, (function (e) {
            remove_div_padding_margin(e);
        }));
    }
}

// -----------------------  utils  -------------------------------
function sleep(ms = 1500) {
	return new Promise(resolve => setTimeout(_ => resolve(), ~~ms))
}

function autoRefresh(minute = 5) {
	let time = parseFloat(minute) || 5
	window.setTimeOutId = ''
	window.addEventListener('offline', function(e) { clearTimeout(window.setTimeOutId); });
	window.addEventListener('online', function(e) {
		window.location.href = window.location.href;
	});
	window.setTimeOutId = setTimeout(() => {
		if (window.navigator.onLine) {
			window.location.href = window.location.href
		}
	}, time * 60 * 1000)
}

function getFormatDate(date) {
  let year = new Date(date).getFullYear()
  let month = new Date(date).getMonth() + 1
  let day = new Date(date).getDate()
  month = month < 10 ? '0' + month : month
  day = day < 10 ? '0' + day : day
  return [year, month, day].join('-')
}

function isWorkDay(){
	// should update national_holiday  national_workday every year after official notice
	const national_holiday = [
		'2020-04-04',
		'2020-04-05',
		'2020-04-06',
		'2020-05-01',
		'2020-05-02',
		'2020-05-03',
		'2020-05-04',
		'2020-05-05',
		'2020-06-25',
		'2020-06-26',
		'2020-06-27',
		'2020-10-01',
		'2020-10-02',
		'2020-10-03',
		'2020-10-04',
		'2020-10-05',
		'2020-10-06',
		'2020-10-07',
		'2020-10-08'
	]
	const national_workday = [
		'2020-04-26',
		'2020-05-09',
		'2020-06-28',
		'2020-09-27',
		'2020-10-10'
	]
	if (national_holiday.includes(getFormatDate(Date.now()))) {
		return false
	}
	if (national_workday.includes(getFormatDate(Date.now()))) {
		return true
	}
	const day_week = new Date(Date.now()).getDay()
	if (day_week === 0 || day_week === 6) {
		return false
	} else {
		return true
	}
}

function postData(url, data) {
	const opts = {
	  method: 'POST', // 请求方法
	  body: JSON.stringify(data), // 请求体
	  headers: {
		accept: 'application/json',
		'content-type': 'application/json'
	  },
	  mode: 'cors'
	}
	return fetch(url, opts)
	  .then(response => {
		return response.json()
	  })
	  .then(resp => {
		return resp
		// return Promise.reject(resp)
	  })
}

function getData(url) {
	const opts = {
	  method: 'GET', // 请求方法
	  mode: 'cors'
	}
	return fetch(url, opts)
	  .then(response => {
		return response.json()
	  })
	  .then(resp => {
		return resp
		// return Promise.reject(resp)
	  })
}

function content_get() {
    var ajax = new XMLHttpRequest();
    ajax.open('get', '/');
    ajax.send();
    ajax.onreadystatechange = function () {
        if (ajax.readyState == 4 && ajax.status == 200) {
            content_new = ajax.responseText;
            //console.log(content_new);
            content_old = content_old || content_new;
            if (content_new !== content_old) {
                location.reload();
            }
        }
    };

    setTimeout(content_get, 1000);
}

function downloadFile(paramObj){
    let {filePath, fileName} = paramObj instanceof Object ? paramObj : {}
    if (!filePath) return;
    const randomName = Math.random().toString(32).slice(2);
    const matchArr = filePath.match(/[^./?]+\.[a-zA-Z0-9]+(?=$|\?.*)/g) || []
    const defaultName = matchArr[0]
    fetch(filePath).then(res => res.blob()).then(blob => {
      const a = document.createElement('a');
      document.body.appendChild(a)
      a.style.display = 'none'
      // 使用获取到的blob对象创建的url
      const url = window.URL.createObjectURL(blob);
      a.href = url;
      // 指定下载的文件名
      a.download = fileName || defaultName || randomName;
      a.click();
      document.body.removeChild(a)
      // 移除blob对象的url
      window.URL.revokeObjectURL(url);
    });
}
function parseQuery () {
  const hastPare = window.location.hash.match(/[^?&=]+\=[^?&=]+/g) || []
  return hastPare.reduce((acc, ele) => {
    const [key, val] = ele.split('=')
    acc[key] = val
    return acc
  }, {})
}

function openConsole () {
	var event = document.createEvent('Events');
	event.keyCode = 100;
	event.initEvent('keypress', true, true);
	$0.dispatchEvent(event);
}

class MutationObserverClass {
    constructor({window}) {
        this.window = window
        this.listeners = [];
        this.observer = undefined
    }

    start({element, selector, fn}) {
      // 储存选择器和回调函数
      this.listeners.push({
        element,
        selector,
        fn
      });
      if(!this.observer){
        // 监听document变化
        let MutationObserver = this.window.MutationObserver || this.window.WebKitMutationObserver;
        let check = this.check.bind(this)
        this.observer = new MutationObserver(check);
        this.observer.observe(this.window.document.documentElement, {
          childList: true,
          subtree: true
        });
      }
      // 检查该节点是否已经在DOM中
      this.check();
    }

	stop() {
		this.observer.disconnect()
	}
	
    check(){
      //   console.log('check this', this)
      // 检查是否匹配已储存的节点
      this.listeners.forEach(listener => {
        // 检查指定节点是否有匹配
        let element = listener.element || this.window.document.querySelector(listener.selector)
        let isSelf = element instanceof HTMLElement && element === this.window.document.querySelector(listener.selector)
        console.log('isSelf', isSelf)
        // console.log('element', element)
        // console.log('this.window.document.querySelector(listener.selector)', this.window.document.querySelector(listener.selector))
        if (isSelf) {
          const called = ele => ele.called = true
          element instanceof HTMLElement && !element.called && called(element) && listener.fn.call(element, element);
        } else {
          element instanceof HTMLElement && called(element) && listener.fn.call(element, element);
        }

      })
    //   for(let i = 0; i < this.listeners.length; i++){

    //     // let listener = this.listeners[i];
    //     // // 检查指定节点是否有匹配
    //     // let element = listener.element || this.window.document.querySelector(listener.selector)
    //     // if (!element) {
    //     //     return
    //     // }
    //     // element instanceof HTMLDivElement && listener.fn.call(element, element);
    //     // console.log('elements', elements)
    //     // for(let j = 0; j < elements.length; j++){
    //     //     let element = elements[j];
    //     //     console.log('element', element)
    //     //   // 确保回调函数只会对该元素调用一次
    //     //   if(!element.ready){
    //     //     element.ready = true;
    //     //     // 对该节点调用回调函数
    //     //     listener.fn.call(element, element);
    //     //   }
    //     // }
    //   }
    }
}




//  ---------------------------------- main  -------------------------------------

main()