您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
定时刷新待打款订单请求, 并生成alert窗口
// ==UserScript== // @name RefreshFinRequest // @namespace refreshyckfin // @version 1.0.4 // @description 定时刷新待打款订单请求, 并生成alert窗口 // @author Jack Li // @include http://finance.yinchengku.com/* // @include http://finance01.tst.yinchengku.com/* // @include http://finance01.uat.yinchengku.com/* // @exclude http://*/admin // @exclude http://*/admin/logout // @grant none // ==/UserScript== Array.prototype.unique = function() { var a = this.concat(); for(var i=0; i<a.length; ++i) { for(var j=i+1; j<a.length; ++j) { if(a[i] === a[j]) a.splice(j--, 1); } } return a; }; var NotifyWindow = { domElement: undefined, title: "Notify Window", content: "", isRunWithIFrame: function() { return window.frameElement && window.frameElement.nodeName == "IFRAME"; }, create: function(title, content) { if (this.isRunWithIFrame()) { return; } this.title = title; this.content = content; var notifyEle = document.createElement("div"); notifyEle.id = "notification"; notifyEle.style = "display: none;cursor: pointer;position: fixed;right: .5em;bottom: .5em;overflow: hidden;width: 260px;color: #ddd;border-radius: 5px;background: rgba(35, 40, 45, 0.9);box-shadow: 0 3px 12px rgba(0, 0, 0, 0.6);animation: bottom50 300ms;"; notifyEle.setAttribute("onclick", "window.location.href=\'" + OCRDynData.url + "\'"); var titleEle = document.createElement("div"); titleEle.style = " text-align: center;padding: 3px 10px;font-weight: 600;border-bottom: 1px solid #898C7B;"; titleEle.innerHTML = "<span class=\"icon\"></span>" + this.title; notifyEle.appendChild(titleEle); var bodyEle = document.createElement("div"); bodyEle.style = " font-size: 13px;padding: 8px 12px;word-break: break-all;transition: all .3s ease-in-out"; var msgEle = document.createElement("span"); msgEle.style = "animation: bottom20 500ms;"; msgEle.textContent = this.content; bodyEle.appendChild(msgEle); notifyEle.appendChild(bodyEle); var body = document.getElementsByTagName("body")[0]; body.appendChild(notifyEle); this.domElement = notifyEle; return this; }, update: function(title, content) { var parser = new DOMParser(); var titleIter = document.evaluate( '//*[@id="notification"]/div[1]', this.domElement, null, XPathResult.ANY_TYPE, null ); var titleNode = titleIter.iterateNext(); if (titleNode) { titleNode.textContent = title || this.title; } var contentIter = document.evaluate( '//*[@id="notification"]/div[2]/span', this.domElement, null, XPathResult.ANY_TYPE, null ); var contentNode = contentIter.iterateNext(); if (contentNode) { contentNode.textContent = content || this.content; } }, isVisible: function() { if (!this.domElement) { return false; } if (this.domElement.style && this.domElement.style.display === "none") { return false; } return true; }, remove: function() { if (!!this.domElement) { this.domElement.parentNode.removeChild(this.domElement); } }, show: function(title, content) { if (this.isVisible()) { console.debug("Update Notification wth title: " + title + ", content: " + content); this.update(title, content); } else { console.debug("Create Notification wth title: " + title + ", content: " + content); this.create(title, content); } if (!this.domElement) { console.warn("Cannot display notification due to no node"); console.debug(this.domElement); return; } this.domElement.style.display = "block"; }, hide: function() { this.domElement.style.display = "none"; } }; var OCRDynData = { url: "/outamountCon/payIndex", respContent: undefined, totalNoReplyJsonData: [], version: 0, fetchResponse: function(url, cb) { $.get(url, function(data){ this.data = data; cb(this.data); }); }, notExist: function(key) { var exist = false; for (var i = 0; i < this.origJsonData.length; i++) { var item = this.origJsonData[i]; if (item === key) { return false; } } return true; }, hasNoReply: function(status) { return !status; }, getQuoteStatus(domEle) { var statusStr = domEle.getElementsByTagName("th")[10].textContent.trim(); if (statusStr === "打款成功") { return true; } return false; }, json: function(url, cb) { var that = this; this.fetchResponse(url, function(content) { var diffNoReplyJsonData = []; var parser = new DOMParser(); var doc = parser.parseFromString(content, "text/html"); var iter = document.evaluate( "//th/a", doc, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null ); var item = iter.iterateNext(); while (item) { var id = item.getAttribute('id') ; if (!!id && that.hasNoReply(that.getQuoteStatus(item.parentNode.parentNode))) { diffNoReplyJsonData.push(id); } item = iter.iterateNext(); } if (diffNoReplyJsonData.length > 0) { this.totalNoReplyJsonData = that.totalNoReplyJsonData.concat(diffNoReplyJsonData).unique(); } cb(diffNoReplyJsonData); }); }, fetch5PagesJson(cb) { var page = 5; var curPage = 1; var totalNoReplyJsonData = []; var count = 1; function successfulCallback(data) { if (count < page) { count++; return; } var newNoReplyJsonData = data.filter(key => !OCRDynData.totalNoReplyJsonData.includes(key)); OCRDynData.totalNoReplyJsonData = data; cb(data, newNoReplyJsonData); } for (; curPage <= page; curPage++) { var url = this.url; if (curPage > 1) { url = this.url + "?page=" + curPage; } this.json(url, function(noReplyJsonDataByPage) { totalNoReplyJsonData = totalNoReplyJsonData.concat(noReplyJsonDataByPage).unique(); successfulCallback(totalNoReplyJsonData); }); } } }; var Sound = { srcUrl: "http://img.yinchengku.com/vsftp/audio/microwave_oven.mp3", audioElement: undefined, finish: false, init: function() { this.finish=false; audioElement=document.createElement("audio"); audioElement.id = "notify-sound"; srcElement = document.createElement("source"); srcElement.setAttribute("src", this.srcUrl); srcElement.setAttribute("type", "audio/mp3"); audioElement.appendChild(srcElement); document.body.appendChild(audioElement); this.audioElement = audioElement; }, start: function() { this.audioElement.play(); }, play: function() { if(!this.audioElement) { this.init(); } this.start(); }, remove: function() { document.body.removeChild(this.audioElement); return this; } }; var Storage = { storeTimeWindow: function(timestamep) { if(window.localStorage){ window.localStorage.setItem('RequestOCRRequest.lastTimestamp', timestamep); } }, getCachedTimeWindow: function() { if(window.localStorage){ var timestamp = window.localStorage.getItem('RequestOCRRequest.lastTimestamp'); if (!timestamp) { return undefined; } return window.localStorage.getItem('RequestOCRRequest.lastTimestamp'); } else { return undefined; } } }; (function(doc) { 'use strict'; doc.config = { fetchTimeWindow: 15000, checkTimeWindow: 1000 }; console.log("银承库 提现"); console.debug("Start to fetch OCR No-Reply Data of 5 page"); doc.cache = { lastFetch: undefined }; function withInSpecifyTimewindow() { var lastTimestamp = Storage.getCachedTimeWindow(); if (!lastTimestamp) { return false; } var curDate = new Date(); if (curDate.getTime() - lastTimestamp < doc.config.fetchTimeWindow) { return true; } return false; } function newRoundNotify(cb) { if (doc.st) { clearTimeout(doc.st); } doc.st = setTimeout(cb, doc.config.checkTimeWindow); } function notifyWithNewOCRData() { if (withInSpecifyTimewindow() ) { return newRoundNotify(notifyWithNewOCRData); } console.debug("Start to fetch OCR No-Reply Data of 5 page"); OCRDynData.fetch5PagesJson(function(totalNoReplyList, newNoReplyList) { Storage.storeTimeWindow(new Date().getTime()); if (!totalNoReplyList || totalNoReplyList.length === 0) { console.debug("No Data Found"); } else { console.debug(">>>>> Total No Reply List <<<<<<"); console.debug(totalNoReplyList); NotifyWindow.show("[新] 待打款", "您有(" + totalNoReplyList.length + ")条未打款(" + (newNoReplyList.length || 0) + "条新增), 点击查看"); Sound.play(); } newRoundNotify(notifyWithNewOCRData); }); } notifyWithNewOCRData(); })(document);