// ==UserScript==
// @name 网购省钱小助手:自动查询京东、淘宝、聚划算、天猫等隐藏的优惠券;自动历史价格查询;界面优化等;低侵入、持续维护更新😈
// @name:zh 网购省钱小助手:自动查询京东、淘宝、聚划算、天猫等隐藏的优惠券;自动历史价格查询;界面优化等;低侵入、持续维护更新😈
// @name:zh-TW 網購省錢小助手:自動查詢京東、淘寶、聚划算、天貓等隱藏的優惠券;自動曆史價格查詢;界面優化等;低侵入、持續維護更新😈
// @namespace coupon_honghonghuohuo_namespace_20230625
// @version 2.2.1
// @description 用电脑端访问淘宝、天猫、京东等不会主动领取优惠券,此脚本可以把只有APP端能看到的或本来就隐藏的大额优惠券给查询出来,有券不领非好汉~ 脚本采用低侵入形式,不会破坏网页结构,大家可以放心使用
// @description:zh 用电脑端访问淘宝、天猫、京东等不会主动领取优惠券,此脚本可以把只有APP端能看到的或本来就隐藏的大额优惠券给查询出来,有券不领非好汉~ 脚本采用低侵入形式,不会破坏网页结构,大家可以放心使用
// @description:zh-TW 用電腦端訪問淘寶、天貓、京東等不會主動領取優惠券,此指令碼或直譯式程式可以把只有APP端能看到的或本來就隱藏的大額優惠券給查詢出來,有券不領非好漢~ 指令碼或直譯式程式採用低侵入形式,不會破壞網頁結構,大家可以放心使用
// @author 红红火火
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFxklEQVR4Xu2be6gUVRzHv799nLEHJfYivTtrj+vMerMXUvaCrCA0KCuSpAdaiYUaWCEVQkpkYA9CeyGG0oOSoCcZGKhoUmYWBrfdVbG7s1cTLEgCc8/cnV/M3gfX6+7OnN3x7syt+ff8zvl9f5/5nXN2zvkt4T/+UH/8OV0sBjALwOV1mHQRaKNhleaNFG4VAFk9uZJAC/0GxcCyjCWX+rUPsx1lx48aT47zm6pIjsUuyHQd61LtFzZ72ptOXlFm+klZGGOGWZSfK/cLWQf6cSxOPT2e7ALROSramPjVTMF+UqVPGG0ra0A+pS1yA1IUuNO05FWKfUJnPrALdLYlr45TbC7gXHScSqIba6keCevAAIBqQebHC5Md/AxgVLV2hzFrYlF+FLrXqiCoLoDe6SG+Y8KU6mPya6ZlL1LwFzpTTwA5XXsL4EerKSfG90ZRXhO6qBQEeQLI68kHGPSuwphhNf0LwDbTkrcPFugJYP8Fp50ny/ahsEalqouATsOSl/T38wTgGubSYjcYl6o6C6094X6zID9w9fkDkEpuRp3tMLSB1hA2+FvGH4C0uA+M96MWaM3fL4M+5nwB6GzDmERM7GfgzBEBgfkhs2iv9T0FKutASmwAYdpIAFB2qL2ju7RPDUBaLAHj+REA4KBpyXFKu0DvTjBqKtjZFHUABKw3LHmvMoDNQOJ8PXkAoHOjDIGIFhiF0hvKAPp+D3wKxowoAygTX9lRsN0PvMrjaxfoN86mtaeI+aUIAzhiWnL0YP2KABLXEse2RxjAl8rfAkODzaVFAQw9khCIFpuF0nEZrJQBbtDZtPiQGAOraJRAsONMzXT3bGl4ClQA6NpCAq+MUuB9Wu0zeuTosQdxtDkAbWISxfBL9ADwJtOybx6qW3kKVLZDXewB0B4pCIQXzIJcEgiAvC7WMjA7UgBqXOQ0lgHp5MNgWhMlAA4lxk4sHP09kAxo9D6xVcCIsMMoyKon2w1lQN864C6Ek1oVlIpfZn49U7Sr3n43AUB7G+BI1AkQ+EHDst+rBq0JAGImgPUqb6JVthRDxuiSuUABZMfhLIqLP1oVlG+/zFvMoj21ln3DGdC3DuwEMNm3mNYYzjQt+fFJAZBPJV9mopDWCNB2MFaYxdIX9bg3lQH5tDaNmTfUcLDLtGTYs0PtQGRooJ0dEPG/xbFaBysMnpyx7F2tyXx/XpvKgN51QNsK8A3V3DF4XsayV/uT0hqrpgHkdfEcA1VL5gi0Ouw1hQEASFzPiG2L6jrQNIC+7dA9ZDilNUl8nFe3BmAr4KwwrR5fZ5dBAfgKwPQQABiQUHZ4Ske3vcNLUyAA8intCSZ+xcvZsLYzvWMWS494+QwEQMPVpl7qmmknfGYW5J1eQwQCoFJtmhDux0bKy+Fwtfst6A4EgBtUNq0tIOZVwxWglx/Tkr5i82Xk5ay/PddbSXIHmJXqjv2O72lHdJSBnSql/IEC8BQYQoP/AYTwpQyrpJOWAblU8jEQuScx94DxNRN+UJmb9SjsSYu7mOlWB3xTDCg5xBsTTGvaLfmrKr2TAiCXEgXQiTfIBBxzynRZ5kDJvVlq6MnpouavTgKWGpZcpjJw4ACyuniGgOU1RXic0dUTn09r05nZBVDzISfeZnT/c8AvhEAB+L4wGVSq6leoa5fTtW8Bvq5eHwavylj2437HDRZAKjmbiCoFiHXfErDOsOQcL7uh7TldOwzw2fUBYF/Gkr4vbgMF0PdDyEdJLa0xrdJcdQDiTwBjQgsgO06bQHHOewXGzHMyRXudl93Q9rwudjBQ949aqqdQgWaAKzivJ79h0C11gjsSl7K9/RAOqwLI6uJFAp6u1y9GuHtCQX7id+zAAXgthMQ83yjab/oVeOI6ILhO3w2mJW9TGTtwAK7zvRdD67GTy4nJFWMA2E+E3SA8W+uOTkV0Pq3Nd6cRgAsBKruJR4TlRqFU646i9rap4ngk2v4L+LTwUPWENukAAAAASUVORK5CYII=
// @match *://*.taobao.com/*
// @match *://*.tmall.com/*
// @match *://*.tmall.hk/*
// @match *://*.liangxinyao.com/*
// @match *://chaoshi.detail.tmall.com/*
// @match *://pages.tmall.com/wow/an/cs/search**
// @match *://*.jd.com/*
// @match *://*.jd.hk/*
// @match *://item.jkcsjd.com/*
// @match *://*.yiyaojd.com/*
// @match *://www.vipglobal.hk
// @match *://*.vip.com/*
// @match *://detail.vip.com/detail-*
// @match *://www.vipglobal.hk/detail-*
// @match *://category.vip.com/suggest.php**
// @match *://list.vip.com/*.html
// @exclude *://jianghu.taobao.com/*
// @exclude *://login.taobao.com/*
// @exclude *://uland.taobao.com/*
// @exclude *://map.taobao.com/*
// @exclude *://creator.guanghe.taobao.com/*
// @exclude *://myseller.taobao.com/*
// @exclude *://qn.taobao.com/*
// @exclude *://jingfen.jd.com/*
// @exclude *://passport.jd.com/*
// @exclude *://jmw.jd.com/*
// @exclude *://passport.shop.jd.com/*
// @exclude *://passport.vip.com/*
// @exclude *://huodong.taobao.com/wow/z/guang/gg_publish/*
// @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.2.1/jquery.min.js
// @require https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/keypress/2.1.5/keypress.min.js
// @connect tt.shuqiandiqiu.com
// @connect j.jiayoushichang.com
// @grant GM_openInTab
// @grant GM.openInTab
// @grant GM_getValue
// @grant GM.getValue
// @grant GM_setValue
// @grant GM.setValue
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM.xmlHttpRequest
// @grant GM_registerMenuCommand
// @license AGPL License
// @antifeature referral-link 【此提示为GreasyFork代码规范要求含有查券功能的脚本必须添加,实际使用无任何强制跳转,代码可查,请知悉】
// @charset UTF-8
// @run-at document-idle
// ==/UserScript==
(function () {
'use strict';
/**
* 脚本遵循AGPL License开源协议;在协议允许的范围类,可以自由修改
* 开完万岁!!
*/
//共有方法,全局共享
function CommonFunction(){
this.GMgetValue = function (name, value=null) {
let storageValue = value;
if (typeof GM_getValue === "function") {
storageValue = GM_getValue(name, value);
} else if(typeof GM.setValue === "function"){
storageValue = GM.getValue(name, value);
}else{
var arr = window.localStorage.getItem(name);
if(arr != null){
storageValue = arr
}
}
return storageValue;
};
this.GMsetValue = function(name, value){
if (typeof GM_setValue === "function") {
GM_setValue(name, value);
} else if(typeof GM.setValue === "function"){
GM.setValue(name, value);
}else{
window.localStorage.setItem(name, value)
}
};
this.GMaddStyle = function(css){
var myStyle = document.createElement('style');
myStyle.textContent = css;
var doc = document.head || document.documentElement;
doc.appendChild(myStyle);
};
this.GMopenInTab = function(url, options={"active":true, "insert":true, "setParent":true}){
if (typeof GM_openInTab === "function") {
GM_openInTab(url, options);
} else {
GM.openInTab(url, options);
}
};
this.addScript = function(url){
var s = document.createElement('script');
s.setAttribute('src',url);
document.body.appendChild(s);
};
this.randomNumber = function(){
return Math.ceil(Math.random()*100000000);
};
this.request=function(mothed, url, param, headers={"Content-Type": "application/json;charset=UTF-8"}){
return new Promise(function(resolve, reject){
GM_xmlhttpRequest({
url: url,
method: mothed,
data:param,
headers:headers,
onload: function(response) {
var status = response.status;
var playurl = "";
if(status==200||status=='200'){
var responseText = response.responseText;
resolve({"result":"success", "data":responseText});
}else{
reject({"result":"error", "data":null});
}
}
});
})
};
this.addCommonHtmlCss = function(){
var cssText =
`
@keyframes fadeIn {
0% {opacity: 0}
100% {opacity: 1}
}
@-webkit-keyframes fadeIn {
0% {opacity: 0}
100% {opacity: 1}
}
@-moz-keyframes fadeIn {
0% {opacity: 0}
100% {opacity: 1}
}
@-o-keyframes fadeIn {
0% {opacity: 0}
100% {opacity: 1}
}
@-ms-keyframes fadeIn {
0% {opacity: 0}
100% {opacity: 1}
}
@keyframes fadeOut {
0% {opacity: 1}
100% {opacity: 0}
}
@-webkit-keyframes fadeOut {
0% {opacity: 1}
100% {opacity: 0}
}
@-moz-keyframes fadeOut {
0% {opacity: 1}
100% {opacity: 0}
}
@-o-keyframes fadeOut {
0% {opacity: 1}
100% {opacity: 0}
}
@-ms-keyframes fadeOut {
0% {opacity: 1}
100% {opacity: 0}
}
.web-toast-kkli9{
position: fixed;
background: rgba(0, 0, 0, 0.7);
color: #fff;
font-size: 14px;
line-height: 1;
padding:10px;
border-radius: 3px;
left: 50%;
transform: translateX(-50%);
-webkit-transform: translateX(-50%);
-moz-transform: translateX(-50%);
-o-transform: translateX(-50%);
-ms-transform: translateX(-50%);
z-index: 999999999999999999999999999;
white-space: nowrap;
}
.fadeOut{
animation: fadeOut .5s;
}
.fadeIn{
animation:fadeIn .5s;
}
`;
this.GMaddStyle(cssText);
};
this.webToast = function(params) { //小提示框
var time = params.time;
var background = params.background;
var color = params.color;
var position = params.position; //center-top, center-bottom
var defaultMarginValue = 50;
if(time == undefined || time == ''){
time = 1500;
}
var el = document.createElement("div");
el.setAttribute("class", "web-toast-kkli9");
el.innerHTML = params.message;
//背景颜色
if(background!=undefined && background!=''){
el.style.backgroundColor=background;
}
//字体颜色
if(color!=undefined && color!=''){
el.style.color=color;
}
//显示位置
if(position==undefined || position==''){
position = "center-bottom";
}
//设置显示位置,当前有种两种形式
if(position==="center-bottom"){
el.style.bottom = defaultMarginValue+"px";
}else{
el.style.top = defaultMarginValue+"px";
}
el.style.zIndex=999999;
document.body.appendChild(el);
el.classList.add("fadeIn");
setTimeout(function () {
el.classList.remove("fadeIn");
el.classList.add("fadeOut");
/*监听动画结束,移除提示信息元素*/
el.addEventListener("animationend", function () {
document.body.removeChild(el);
});
el.addEventListener("webkitAnimationEnd", function () {
document.body.removeChild(el);
});
}, time);
};
this.filterStr = function(str){
if(!str) return "";
str = str.replace(/\t/g,"");
str = str.replace(/\r/g,"");
return encodeURIComponent(str)
};
this.getParamterQueryUrl = function(text, tag) { //查询GET请求url中的参数
if(text.indexOf("?")!=-1){ //选取?后面的字符串,兼容window.location.search,前面的?不能去掉
var textArray = text.split("?");
text = "?"+textArray[textArray.length-1];
}
var t = new RegExp("(^|&)" + tag + "=([^&]*)(&|$)");
var a = text.substr(1).match(t);
if (a != null){
return a[2];
}
return "";
};
this.getEndHtmlIdByUrl = function(url) { //获得以html结束的ID
if(url.indexOf("?")!=-1){
url = url.split("?")[0]
}
if(url.indexOf("#")!=-1){
url = url.split("#")[0]
}
var splitText = url.split("/");
var idText = splitText[splitText.length-1];
idText = idText.replace(".html","");
return idText;
};
this.getEcommercePlatform=function(url = window.location.href){
let platform = "";
if(url.indexOf("detail.tmall")!=-1 || url.indexOf("tmall.hk")!=-1 || url.indexOf("pages.tmall.com")!=-1){
platform = "tmall";
}else if(url.indexOf("taobao.com")!=-1 || url.indexOf("maiyao.liangxinyao.com")!=-1){
platform = "taobao";
}else if(url.indexOf("jd.com")!=-1 || url.indexOf("npcitem.jd.hk")!=-1 || url.indexOf("yiyaojd.com")!=-1 || url.indexOf("jkcsjd.com")!=-1){
platform = "jd";
}else if(url.indexOf("detail.vip.com")!=-1 || url.indexOf("www.vipglobal.hk")!=-1){
platform = "vpinhui";
}
return platform;
}
this.isPC = function(){
var userAgentInfo = navigator.userAgent;
var Agents = ["Android", "iPhone","SymbianOS", "Windows Phone", "iPad", "iPod"];
var flag = true;
for (var v = 0; v < Agents.length; v++) {
if (userAgentInfo.indexOf(Agents[v]) > 0) {
flag = false;
break;
}
}
return flag;
};
this.getBilibiliBV=function(){
var pathname = window.location.pathname;
var bv = pathname.replace("/video/","").replace("/","");
return bv;
};
this.getSystemOS=function(){
var u = navigator.userAgent;
if (!!u.match(/compatible/i) || u.match(/Windows/i)) {
return 'windows';
} else if (!!u.match(/Macintosh/i) || u.match(/MacIntel/i)) {
return 'macOS';
} else if (!!u.match(/iphone/i) || u.match(/Ipad/i)) {
return 'ios';
} else if (!!u.match(/android/i)) {
return 'android';
} else {
return 'other';
}
};
this.RPCDownloadFile = function(fileName, url, savePath="D:/", RPCURL="ws://localhost:16800/jsonrpc", RPCToken="") {
const self = this;
if(!savePath){
savePath = "D:/";
}
if(!RPCURL){
RPCURL = "ws://localhost:16800/jsonrpc";
}
let options = { //下载配置文件
"dir":savePath,
"max-connection-per-server": "16",
"header":["User-Agent:"+navigator.userAgent+"", "Cookie:"+document.cookie+"", "Referer:"+window.location.href+""]
}
if(!!fileName) {
options.out = fileName;
}
let jsonRPC = {
"jsonrpc": "2.0",
"id": "huahuacat",
"method": "aria2.addUri",
"params": [[url], options],
}
if (!!RPCToken) {
jsonRPC.params.unshift("token:" + RPCToken); // 必须要加在第一个
}
return new Promise(function(resolve, reject) {
var webSocket = new WebSocket(RPCURL);
webSocket.onerror = function(event) {
console.log("webSocket.onerror", event);
reject("Aria2连接错误,请打开Aria2和检查RPC设置!");
}
webSocket.onopen = function(){
webSocket.send(JSON.stringify(jsonRPC));
}
webSocket.onmessage = function(event){
let result = JSON.parse(event.data);
switch (result.method) {
case "aria2.onDownloadStart":
resolve("Aria2 开始下载【"+fileName+"】");
webSocket.close();
break;
case "aria2.onDownloadComplete":
break;
default:
break;
}
}
});
};
this.getElementObject = function(selector, target=document.body, allowEmpty = true, delay=10, maxDelay=10 * 1000){
return new Promise((resolve,reject) =>{
let totalDelay = 0;
let element = target.querySelector(selector);
let result = allowEmpty ? !!element : (!!element && !!element.innerHTML);
if(result){
resolve(element);
}
const elementInterval = setInterval(()=>{
if(totalDelay >= maxDelay){
clearInterval(elementInterval);
resolve(null);
}
element = target.querySelector(selector);
result = allowEmpty ? !!element : (!!element && !!element.innerHTML);
if(result){
clearInterval(elementInterval);
resolve(element);
}else{
totalDelay += delay;
}
}, delay);
});
};
/**
* @param {Object} time
* @param {Object} format
* 时间格式化
* DateFormat(new Date(dateCreated), "yyyy-MM-dd hh:mm:ss")
*/
this.DateFormat = function(time, format) {
var o = {
"M+": time.getMonth() + 1, //月份
"d+": time.getDate(), //日
"h+": time.getHours(), //小时
"m+": time.getMinutes(), //分
"s+": time.getSeconds(), //秒
"q+": Math.floor((time.getMonth() + 3) / 3), //季度
"S": time.getMilliseconds() //毫秒
};
if(/(y+)/.test(format)){
format = format.replace(RegExp.$1, (time.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for(var k in o){
if(new RegExp("(" + k + ")").test(format)){
format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
}
return format;
};
this.decryptStr=function(str){
let result = atob(str);
return result.split('').reverse().join('');
};
this.encryptStr=function(str){
let result = str.split('').reverse().join('');
return btoa(result);
};
}
//全局弹窗对象
const dialog = (function(){
class Dialog {
constructor() {
this.mask = document.createElement('div');
this.dialogStyle = document.createElement('style');
this.setStyle(this.mask, {
"width": '100%',
"height": '100%',
"backgroundColor": 'rgba(0, 0, 0, .6)',
"position": 'fixed',
"left": "0px",
"top": "0px",
"bottom":"0px",
"right":"0px",
"z-index":"9999999999999"
});
this.content = document.createElement('div');
this.setStyle(this.content, {
"max-width": '450px',
"width":"100%",
"max-height": '600px',
"backgroundColor": '#fff',
"boxShadow": '0 0 2px #999',
"position": 'absolute',
"left": '50%',
"top": '50%',
"transform": 'translate(-50%,-50%)',
"borderRadius": '5px'
})
this.mask.appendChild(this.content);
}
middleBox(param) {
// 先清空中间小div的内容 - 防止调用多次,出现混乱
this.content.innerHTML = '';
let title = '默认标题内容';
if({}.toString.call(param) === '[object String]') {
title = param;
} else if({}.toString.call(param) === '[object Object]') {
title = param.title;
}
document.body.appendChild(this.mask);
this.title = document.createElement('div');
this.setStyle(this.title, {
"width": '100%',
"height": '40px',
"lineHeight": '40px',
"boxSizing": 'border-box',
"background-color":"#dedede",
"color": '#000',
"text-align": 'center',
"font-weight":"700",
"font-size":"17px",
"border-radius": "4px 4px 0px 0px"
});
this.title.innerText = title;
this.content.appendChild(this.title);
this.closeBtn = document.createElement('div');
this.closeBtn.innerText = '×';
this.setStyle(this.closeBtn, {
"textDecoration": 'none',
"color": '#000',
"position": 'absolute',
"right": '10px',
"top": '0px',
"fontSize": '25px',
"display":"inline-block",
"cursor":"pointer"
})
this.title.appendChild(this.closeBtn);
const self = this;
this.closeBtn.onclick = function(){
self.close();
if(param.onClose && (typeof param.onClose)==="function"){
param.onClose();
}
}
}
showMake(param) {
//添加公用样式表
if(param.hasOwnProperty("styleSheet")){
this.dialogStyle.textContent = param.styleSheet;
}
document.querySelector("head").appendChild(this.dialogStyle);
this.middleBox(param);
this.dialogContent = document.createElement('div');
this.setStyle(this.dialogContent,{
"padding":"15px",
"max-height":"400px"
});
this.dialogContent.innerHTML = param.content;
this.content.appendChild(this.dialogContent);
param.onContentReady(this);
}
close() {
document.body.removeChild(this.mask);
document.querySelector("head").removeChild(this.dialogStyle);
}
setStyle(ele, styleObj) {
for(let attr in styleObj){
ele.style[attr] = styleObj[attr];
}
}
}
let dialog = null;
return (function() {
if(!dialog) {
dialog = new Dialog()
}
return dialog;
})()
})();
//全局统一方法对象
const commonFunctionObject = new CommonFunction();
commonFunctionObject.addCommonHtmlCss(); //统一html、css元素添加
let functionController = null;
/**
* 购物助手部分功能借鉴自:https://greasyfork.org/zh-CN/scripts/428266
* 作者:洪皓儿,原脚本开源协议:AGPL License
* 本脚本继承AGPL License协议并开源,在源代码基础上优化了部分逻辑,修复了部分bug,特此申明!!
*/
const recordBrowsingHistoryKey = "record_browsing_history_mark_key";
const browsedHtml= `
已浏览
`
function HistoryObject(){
this.redirectUrl="https://j.jiayoushichang.com/api/go/to?e=";
this.storageKeys={
goodsHistory:"goooods_history_key",
offset:"goooods_wrapper_key",
maximumRecordsKey:"goooods_max_records_key"
};
this.defaultValue={
historyStorage:{"jd":[], "taobao":[], "vpinhui":[]},
offsetWrapper:{left:15, bottom:15},
records:{min:10, max:500, default:100}
};
this.push=function(platform, obj){
const storageObj = GM_getValue(this.storageKeys.goodsHistory, this.defaultValue.historyStorage);
const maximumRecords = GM_getValue(this.storageKeys.maximumRecordsKey, this.defaultValue.records.default);
const histories = storageObj[platform] ?? [];
if(histories.length>=maximumRecords){
histories.splice(0, parseInt(maximumRecords/5)); //removev forward 1/5
}
const newArr = histories.filter((item, index) => item.id != obj.id);
newArr.push(obj);
storageObj[platform] = newArr;
GM_setValue(this.storageKeys.goodsHistory, storageObj);
};
this.get=function(platform, num=-1){
const storageObj = GM_getValue(this.storageKeys.goodsHistory, this.defaultValue.historyStorage);
const histories = storageObj[platform];
if(num > 0){ // <0 is get all storage
const showHistories = [];
for(let i=histories.length-1; i>=0; i--){
if(showHistories.length>=num) break;
showHistories.push(histories[i]);
}
return showHistories;
}
return histories;
};
this.remove=function(platform, id){
const storageObj = GM_getValue(this.storageKeys.goodsHistory, this.defaultValue.historyStorage);
const histories = storageObj[platform];
let newArr = histories.filter((item, index) => item.id != id);
storageObj[platform] = newArr;
GM_setValue(this.storageKeys.goodsHistory, storageObj);
};
this.removeAll=function(){
GM_setValue(this.storageKeys.goodsHistory, this.defaultValue.historyStorage);
document.querySelector(".peter99032j-xyz-panel-aside-body .goods_____review").innerHTML='';
document.querySelector(".peter99032j-xyz-panel-aside-main .panel-aside-main_____content").innerHTML='';
};
this.removeAllConfirm=function(){
if(confirm('此弹窗来自脚本-[🔥]!!网购小助手,不花冤枉钱\n是否要移除所有的浏览记录?移除后将不可恢复...')){
this.removeAll(); //box展示
commonFunctionObject.GMsetValue(recordBrowsingHistoryKey,[]); //已浏览标识
}
};
this.registerMenuCommand=function(){
GM_registerMenuCommand("浏览记录设置【点击或shift+c均可可唤起】", ()=> {
this.showSettingDialog();
});
const listener = new window.keypress.Listener();
listener.simple_combo("shift c", ()=>{
this.showSettingDialog();
});
};
this.getGoodsByDateGroup=function(platform){
const histories = this.get(platform).reverse();
const group = [];
const today = new Date();
const yesterday = new Date(today);
const format = "dd/MM";
yesterday.setDate(today.getDate() - 1);
const todayStr = this.dateFormat(today, format);
const yesterdayStr = this.dateFormat(yesterday, format);
const showDateFormat = (todayStr, yesterdayStr, current) =>{
return current === todayStr ? "今天" : (current === yesterdayStr ? "昨天" : current);
};
let items = [], cacheDateStr=null, currentDateStr = null;
for(let i=0; i
`+tips+`
清除所有浏览浏览记录。注意:清除后浏览记录不可恢复,请谨慎操作。
`;
dialog.showMake({
title: "设置",
content: content,
styleSheet: styleSheet,
onContentReady:function($that){
$that.dialogContent.querySelector("button[name='clear']").addEventListener("click",function(){
self.removeAllConfirm();
});
$that.dialogContent.querySelector("input[name='maximum-records']").onchange=function(e){
const value = this.value;
if(value>=min && value<=max){
GM_setValue(self.storageKeys.maximumRecordsKey, value);
}
}
}
});
};
this.showOrHideHistoryBox=function(platform){
const self = this;
const group = this.getGoodsByDateGroup(platform);
const contentElement = document.querySelector(".peter99032j-xyz-panel-aside-main .panel-aside-main_____content");
contentElement.innerHTML = "";
let historiesBoxHtml = "", jumpUrl="", imgUrl="";
for(let i=0; i`;
historiesBoxHtml += ` —— `+group[i].str+` ——
`;
historiesBoxHtml += `
`;
}
historiesBoxHtml += ``;
historiesBoxHtml += ``;
}
contentElement.innerHTML = historiesBoxHtml;
document.querySelectorAll(".peter99032j-xyz-panel-aside-main .delete_____btn").forEach((ele)=>{
ele.addEventListener("click",function(e){
e.stopPropagation();
e.preventDefault();
const id = this.getAttribute("data-id");
this.parentNode.parentNode.parentNode.remove();
self.remove(platform, id);
});
});
const items = document.querySelectorAll(".peter99032j-xyz-panel-aside-main .histories-box-review_item > a");
items.forEach((ele)=>{
ele.addEventListener('mouseover', function() {
this.querySelector(".review___shadow").style.display="block";
});
ele.addEventListener('mouseout', function() {
this.querySelector(".review___shadow").style.display="none";
});
});
document.querySelectorAll(".peter99032j-xyz-panel-aside-main a[jump-tag='true']").forEach((ele)=>{
ele.addEventListener("click",function(e){
e.stopPropagation();
e.preventDefault();
const href = this.getAttribute("jump-url");
commonFunctionObject.GMopenInTab(commonFunctionObject.decryptStr(href));
});
});
};
this.createHistoryBox=function(platform){
const wrapperOffset = GM_getValue(this.storageKeys.offset, this.defaultValue.offsetWrapper);
let css = `
.peter99032j-xyz-panel-wrapper{
position: fixed;
bottom: `+wrapperOffset.bottom+`px;
left: `+wrapperOffset.left+`px;
z-index: 999999999;
box-sizing: border-box;
}
.peter99032j-xyz-panel-wrapper svg.icon-svg path{
fill: #bfbfbf;
}
.peter99032j-xyz-panel-wrapper svg.icon-svg:hover path{
fill: #6a7a9b;
}
/*** 历史记录大box ***/
.peter99032j-xyz-panel-wrapper >.peter99032j-xyz-panel-aside-main{
width: 400px;
height: 400px;
position: absolute;
left: 0px;
bottom: 70px;
border-radius: 5px;
border: 1px solid #ebebeb;
background-color: #fafafa;
overflow-y: auto;
overflow-x: hidden;
background-color:#fafafa;
display:none;
-moz-box-shadow:2px 2px 5px #b6bdc5;
-webkit-box-shadow:2px 2px 5px #b6bdc5;
box-shadow:2px 2px 5px #b6bdc5;
}
.peter99032j-xyz-panel-wrapper >.peter99032j-xyz-panel-aside-main >.panel-aside-main_____inner{
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
}
.peter99032j-xyz-panel-aside-main .panel-aside-main_____header{
display: flex;
align-items: center;
flex-direction: row;
height:40px;
background: #dedede;
}
.peter99032j-xyz-panel-aside-main .panel-aside-main_____header >.header_____title{
align-items: center;
display: flex;
flex: 1;
margin-left: 15px;
font-size: 15px;
font-weight: bold;
}
.peter99032j-xyz-panel-aside-main .panel-aside-main_____header >.header_____title >img{
display:block;
margin-right:5px;
width:25px;
height:25px;
}
.peter99032j-xyz-panel-aside-main .panel-aside-main_____header >.header_____close,
.peter99032j-xyz-panel-aside-main .panel-aside-main_____header >.header_____setting{
display: flex;
justify-content: center;
align-items: center;
cursor:pointer;
width:35px;
}
.peter99032j-xyz-panel-aside-main .panel-aside-main_____content{
flex: 1;
overflow: auto;
}
.peter99032j-xyz-panel-aside-main .panel-aside-main_____item{
padding: 5px;
margin:5px 0px;
}
.peter99032j-xyz-panel-aside-main .panel-aside-main_____item .item_____title{
font-size: 13px;
font-weight: 500;
text-align: center;
color: #b6b6b6;
padding: 5px 0px;
}
.peter99032j-xyz-panel-aside-main .panel-aside-main_____item .item_____container{
display: flex;
flex-flow: wrap;
flex-direction: row;
justify-content: flex-start;
}
/**** 历史记录展示 ****/
.peter99032j-xyz-panel-aside-main .histories-box-review_item{
width:33.3333%;
margin: 5px 0px;
overflow: hidden;
}
.peter99032j-xyz-panel-aside-main .histories-box-review_item >a{
display: block !important;
position: relative !important;
margin: 0px auto !important;
background-color: #fff !important;
width: 110px !important;
border-radius: 5px !important;
border: 1px solid #ccc !important;
box-sizing: content-box !important;
}
.peter99032j-xyz-panel-aside-main .histories-box-review_item > a >.review___shadow{
position:absolute;
left:0px;
right:0px;
top:0px;
bottom:0px;
z-index:99;
text-align: center;
border:2px solid red;
border-radius: 5px;
display:none;
}
.peter99032j-xyz-panel-aside-main .histories-box-review_item > a >.review___shadow .delete_____btn{
position: absolute;
top: 0px;
right: 0px;
width: 15px;
height: 15px;
text-align: center;
line-height: 10px;
background-color:red;
color:#FFF;
font-size:13px;
border-radius:3px;
}
.peter99032j-xyz-panel-aside-main .histories-box-review_item > a >.review___img{
width:110px;
height: 110px;
border-radius: 5px 5px 0px 0px;
overflow: hidden;
}
.peter99032j-xyz-panel-aside-main .histories-box-review_item > a >.review___img >img{
width:100%;
display:block;
}
.peter99032j-xyz-panel-aside-main .histories-box-review_item > a >.review___text{
text-align: center!important;
font-size: 13px !important;
color: #000 !important;
text-decoration: underline !important;
padding: 5px!important;
white-space: nowrap!important;
overflow: hidden!important;
text-overflow: ellipsis!important;
}
/*** 横向小卡片 ***/
.peter99032j-xyz-panel-wrapper >.peter99032j-xyz-panel-aside-body{
display: flex;
border-radius:5px;
overflow: hidden;
background-color: #fafafa;
-moz-box-shadow:2px 2px 5px #b6bdc5;
-webkit-box-shadow:2px 2px 5px #b6bdc5;
box-shadow:2px 2px 5px #b6bdc5;
height:60px;
}
.peter99032j-xyz-panel-wrapper >.peter99032j-xyz-panel-aside-body >div{
display: flex;
justify-content: center;
align-items: center;
}
.peter99032j-xyz-panel-aside-body .goods_____expand{
cursor: pointer;
width: 20px !important;
}
.peter99032j-xyz-panel-aside-body .goods_____expand svg{
transition: transform 0.3s;
}
/**** goods展示 ****/
.peter99032j-xyz-panel-aside-body .goods_____review{
flex-direction: row;
width:auto;
transition: all 0.5s ease-in-out;
}
.peter99032j-xyz-panel-aside-body .goods-review_____item{
width:45px;
height:45px;
line-height:45px;
margin:0px 5px;
position:relative;
border-radius: 4px;
overflow: hidden;
cursor:pointer;
}
.peter99032j-xyz-panel-aside-body .goods-review_____item >a{
display:block;
width: 100%;
height: 100%;
}
.peter99032j-xyz-panel-aside-body .goods-review_____item > a>.review___shadow{
position:absolute;
left:0px;
right:0px;
top:0px;
bottom:0px;
z-index:99;
text-align: center;
background-color:rgb(61 155 164 / 20%);
display:none;
}
.peter99032j-xyz-panel-aside-body .goods-review_____item > a>.review___shadow img{
width:15px;
display:inline;
}
.peter99032j-xyz-panel-aside-body .goods-review_____item img{
width:100%;
display:block;
}
/** 展开历史记录BOX **/
.peter99032j-xyz-panel-aside-body .history-box_____expand{
flex-direction: column;
text-align: center;
margin:0px 10px;
cursor: pointer;
}
.peter99032j-xyz-panel-aside-body .history-box_____expand img{
width:26px;
height:26px;
display:block;
}
.peter99032j-xyz-panel-aside-body .history-box_____expand label{
font-size:12px;
font-weight: bold;
}
.peter99032j-xyz-panel-aside-body .wrapper_____drag-handle{
width: 20px !important;
cursor: grab;
box-shadow: rgba(0, 0, 0, 0.2) 0px 3px 3px -2px, rgba(0, 0, 0, 0.14) 0px 3px 4px 0px, rgba(0, 0, 0, 0.12) 0px 1px 8px 0px;
}
`;
const histories = this.get(platform, 5);
const historyBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA6tJREFUeF7tm0tu1EAQhtsIoZyFQwSyYT0LFhwG8RKHYcFi1mwIHIKzRAgxUVku0y73o17t8QNLUZRMp1311V/VFbu7Cwe/uoP7H0wALqfwcg0Au3O419ohAjA4/D6EdTiecBpA/OjO4QMXCAvA5dRPCI5v6frIAVEFcDmF7yuOOCcgRRBZAIPcwfk9XFkIJQCXPXge+ZCEkASw0ZznxOuOrhgzADt2HgDdd+dwF5NKAVhE+n+f3452PPn1kxM9rzETFUwASAvfn9dvA3zB9ezTq5BzBJ3FsbHz1KunXz/3v8LvXl5H80xUQAGI1vsYADgPEOILHIUxJYdrDgIIZxhFAKI1//e7b6NzMQBwGD7zvJxBjGlAFWACAEaWIg6QME1ouqBK4HtOMSmVKSFnAYgKYKyAnCHoKMCRFLs4vVJ1wpgWywDwkG0OhHHutgAcpToGPwXCAKE9gFi2AMQo2X46RwhtAaTqQalPkBSyFATF3D4ASoWqQeHKpoMi5XwAoCyps3QZk64AHEVQ+EIV+AHgGNtqzMOXh8nUN29uuLdaBwCIYtwcca3HcbTjFKjg+gBi4w3LWd9yY8oJasH1ASgNn4lEqYL/APDJEP1nSPS/gDRn4/FeCoA5FXPtRwGpDpGxGuwLAK0DzQBg82Gp2pgGCtlmM05RCOUKUNykWCIOD4C2shZVKYIjVwCEM249BV1XVgm0ldVCWKwGxAZrjY1ppB6eaualampWBOO81RiakoLHQ46rABD03dV+yfqQQ1FQdTVAUWyqzuMACwRFaq4PQKqj46SZ8sGIDoCy72argELgpJnyoYgegJK4CAK+Hao9STb0EnoAtB+AnxnLjggAd7Ay+jC9DYCBPNe36jijDTYAtBbAz5yCVfWKOYA6z6kVZGo7AK8ujunzOCx1X0VbbgeQWrZaK8GjaxxI+gBYEoKj8/YiSGXb6BV2f5vcNhtjzfFTQKmVxc80xpb2F2nm4xZB0RYZqoTapih8C1TaTVbbIuP0ntFnj1CugkveGnNXAYeoj7fqzv/OSZj2CdaMt4JAxdRa4pod9PPFAOCNUdYleeNY7aYqAYTJpunUVllTHeAaQvcQSHaQce+RGhdHHz5PAYBzQHs5J0AZzLbMH2q7PI1+UgGIbAdHZWj0Z2cFigDgwx1BkB+ZiZQg2kFuKVAN/haO0YHz2XOF1VNjgxIAwouNnR7zOTYXR2U4UAGrxBphYJSLEZ81RQ1kt6kpWSmwKY+Exh4ewCNrZxJuJPAN9AAAAABJRU5ErkJggg==";
let goodsHtml = ``, jumpUrl = "";
histories.forEach((h)=>{
jumpUrl = commonFunctionObject.encryptStr(this.redirectUrl+encodeURIComponent(h.url));
goodsHtml += `
`;
});
let html = `
`+goodsHtml+`
`;
GM_addStyle(css);
document.querySelector("body").insertAdjacentHTML('afterend', html);
this.addEventListener(platform);
};
this.addEventListener=function(platform){
const self = this;
const items = document.querySelectorAll(".goods_____review >.goods-review_____item >a");
items.forEach((ele)=>{
ele.addEventListener('mouseover', function() {
this.querySelector(".review___shadow").style.display="block";
});
ele.addEventListener('mouseout', function() {
this.querySelector(".review___shadow").style.display="none";
});
});
//展开底部tool商品
const goodsExpandEle = document.querySelector(".peter99032j-xyz-panel-wrapper .goods_____expand");
if(goodsExpandEle){
goodsExpandEle.addEventListener("click",function(e){
const goodsReviewEle = this.previousElementSibling;
const svgEle = this.querySelector("svg");
svgEle.style.transition = 'transform 0.3s';
if(goodsReviewEle.style.width=="0px"){
goodsReviewEle.style.width = "auto";
svgEle.style.transform = 'rotate(0deg)';
}else{
goodsReviewEle.style.width = "0px";
svgEle.style.transform = 'rotate(180deg)';
}
e.stopPropagation();
});
}
//历史记录大的box,关闭
const historyBoxExpandEles = [
document.querySelector(".peter99032j-xyz-panel-wrapper .history-box_____expand"),
document.querySelector(".peter99032j-xyz-panel-wrapper .header_____close")
];
const asideMainEle = document.querySelector(".peter99032j-xyz-panel-wrapper >.peter99032j-xyz-panel-aside-main");
if(asideMainEle){
historyBoxExpandEles.forEach((ele)=>{
if(ele){
ele.addEventListener("click", function(e){
if(!asideMainEle.style.display || asideMainEle.style.display==="none"){
self.showOrHideHistoryBox(platform);
asideMainEle.style.display="block";
}else{
asideMainEle.style.display="none";
}
e.stopPropagation();
});
}
});
}
//点击历史记录弹框以外的区域,影藏历史记录大的box
document.body.addEventListener("click",function(e){
if(asideMainEle.style.display && asideMainEle.style.display!=="none"){
asideMainEle.style.display="none";
}
});
//弹出设置弹窗
const headerSettingElement = document.querySelector(".peter99032j-xyz-panel-wrapper .header_____setting");
if(headerSettingElement){
headerSettingElement.addEventListener("click",()=>{
self.showSettingDialog();
});
}
//绑定点击事件
document.querySelectorAll(".peter99032j-xyz-panel-aside-body a[jump-tag='true']").forEach((ele)=>{
ele.addEventListener("click",function(e){
e.stopPropagation();
e.preventDefault();
const href = this.getAttribute("jump-url");
commonFunctionObject.GMopenInTab(commonFunctionObject.decryptStr(href));
});
});
// 添加右键移动
const draggable = document.querySelector(".peter99032j-xyz-panel-wrapper .wrapper_____drag-handle");
const wrapper = document.querySelector(".peter99032j-xyz-panel-wrapper");
let offsetX, offsetY;
const padding = 10;
const {width, height} = wrapper.getBoundingClientRect();
const offsetWrapper = Object.assign({}, this.defaultValue.offsetWrapper);
//移动操作
const move = (e)=>{
const {innerWidth, innerHeight } = window;
let x = e.clientX - offsetX;
let y = innerHeight - (e.clientY - offsetY) - height;
if(x < padding){
x = padding;
}else if(x > innerWidth/2){
x = innerWidth/2;
}
if(y < padding){
y = padding;
}else if(y > innerHeight - height - padding){
y = innerHeight - height - padding;
}
wrapper.style.left = x + 'px';
wrapper.style.bottom = y + 'px';
offsetWrapper.bottom = y;
offsetWrapper.left = y;
GM_setValue(this.storageKeys.offset, offsetWrapper)
}
if(draggable && wrapper){
draggable.addEventListener('mousedown', function(e){
offsetX = e.clientX - wrapper.offsetLeft;
offsetY = e.clientY - wrapper.offsetTop-10;
draggable.style.cursor="grabbing";
wrapper.style.userSelect="none";
document.addEventListener('mousemove',move);
});
document.addEventListener('mouseup', function(){
draggable.style.cursor="grab";
wrapper.style.userSelect="default";
document.removeEventListener("mousemove", move);
});
}
};
this.platform=function(){
const host = window.location.host;
const isForbidden = [
/^s\.click\.taobao\.com/,/^u\.jd\.com/,/^myseller\.taobao\.com/,
/^pro\.taobao\.com/,/^open\.taobao\.com/,/^jubao\.taobao\.com/,/^ishop\.taobao\.com/,
/^myseller\.taobao\.com/,/^trade\.taobao\.com/,/^sell\.taobao\.com/,/^fuwu\.taobao\.com/,
/^daxue\.taobao\.com/,/^healthcenter\.taobao\.com/,/^qn\.taobao\.com/,/^consumerservice\.taobao\.com/,/^helpcenter\.taobao\.com/,
/^market\.m\.taobao\.com/,/^jubao\.taobao\.com/,/^ipp\.taobao\.com/,
/^jr\.jd\.com/,/^diy\.jd\.com/,/^join\.jd\.com/,/^smart\.jd\.com/,/^baitiao\.jd\.com/,/^m\.jr\.jd\.com/,
/^trade\.jr\.jd\.com/,/^chongzhi\.jd\.com/,/^jiaofei\.jd\.com/,/^caipiao\.jd\.com/,/^jipiao\.jd\.com/,/^movie\.jd\.com/,
/^daojia\.jd\.com/,/^huishou\.jd\.com/,/^lai\.jd\.com/,/^mobile\.jd\.com/,/^b\.jd\.com/,/^fw\.jd\.com/,
/^lj\.jd\.com/,/^bxdl\.jd\.com/,/^about\.jd\.com/,
/^passport\.vip\.com/,/^jr\.vip\.com/,/^acs\.vip\.com/,/^help\.vip\.com/,/^h5rsc\.vip\.com/,/^rule\.vip\.com/
].map((reg)=>reg.test(host)).some((rs)=>rs==true);
if(isForbidden){
return;
}
const isVip = [/vip\.com/, /vipglobal\.hk/]
.map((reg)=>reg.test(host))
.some((rs)=>rs==true);
const isTaobao = [/taobao\.com/, /tmall\.com/, /tmall\.hk/, /liangxinyao\.com/]
.map((reg)=>reg.test(host))
.some((rs)=>rs==true);
const isJd = [/.jd\.com/, /jd\.hk/, /yiyaojd\.com/, /item\.jkcsjd\.com/]
.map((reg)=>reg.test(host))
.some((rs)=>rs==true);
if(isTaobao) return "taobao";
if(isJd) return "jd";
if(isVip) return "vpinhui";
return null;
};
this.start=function(){
let platform = this.platform();
if(platform){
if(platform=="tmall") platform="taobao";
this.createHistoryBox(platform);
this.registerMenuCommand();
}
};
}
function QueryCoupon(historyObject){
this.platforms = ["detail.tmall.com", "item.taobao.com", "item.jd.com", "item.yiyaojd.com", "npcitem.jd.hk",
"detail.tmall.hk", "detail.vip.com", "item.jkcsjd.com"];
this.createQrcodeIsResult = true;
this.historyObject = historyObject;
this.isRun=function(){
for(var i=0; i{
this.randomSpmValue();
}, 2000);
}
};
this.browsingHistoryMark=function(platform, goodsId){
let histories = commonFunctionObject.GMgetValue(recordBrowsingHistoryKey,[]);
let saveContent = platform+"_"+goodsId;
if(!histories.includes(saveContent)){
histories.unshift(saveContent);
commonFunctionObject.GMsetValue(recordBrowsingHistoryKey,histories.slice(0,60));
}
};
this.browsingHistoryGoods=async function(platform, goodsId){
let recordPlatform = platform;
if(recordPlatform=="tmall"){ //淘宝,天猫合并为在一起
recordPlatform = "taobao";
}
const visitUrl = window.location.href;
let elementName = null;
if(/^https:\/\/detail\.tmall\.com\/item\.htm/.test(visitUrl)
|| /^https:\/\/item\.taobao\.com\/item\.htm/.test(visitUrl)
){
elementName={
"price":"span[class^='priceText--']",
"slider":"ul[class^='thumbnails--'] >li >img",
"title":"div[class^='ItemTitle--']>h1"
}
}else if(/^https:\/\/chaoshi\.detail\.tmall\.com\/item\.htm/.test(visitUrl)){
elementName={
"price":"span[class^='Price--priceText--']",
"slider":"ul[class^='PicGallery--thumbnails--'] img",
"title":"div[class^='ItemHeader--root--'] >h1"
}
}else if(/^https:\/\/detail\.tmall\.hk\/hk\/item\.htm/.test(visitUrl)){
elementName={
"price":"span[class^='Price--priceText--']",
"slider":"li[class^='PicGallery--thumbnail--'] img",
"title":"div[class^='ItemHeader--root--']>h1"
}
}else if(/^https:\/\/item\.jd\.com/.test(visitUrl)
|| /^https:\/\/npcitem\.jd\.hk/.test(visitUrl)
|| /^https:\/\/item\.yiyaojd\.com/.test(visitUrl)
|| /^https:\/\/item\.jkcsjd\.com/.test(visitUrl)
){
elementName={
"price":"span.p-price >.price",
"slider":"div[id^='main-img-'] img",
"title":"div[class='sku-name']"
}
}else if(/^https:\/\/detail\.vip\.com\/detail-/.test(visitUrl)){
elementName={
"price":"span.sp-price",
"slider":"#J-img-content img",
"title":"p.pib-title-detail"
}
}
if(elementName){
const promiseArray = [
commonFunctionObject.getElementObject(elementName.price, document.body, false, 100, 10*1000),
commonFunctionObject.getElementObject(elementName.slider, document.body, true, 100, 10*1000),
commonFunctionObject.getElementObject(elementName.title, document.body, true, 100, 10*1000),
];
Promise.all(promiseArray).then((elements)=>{
if(elements.length!=3){
return;
}
const priceElement = elements[0], sliderElement = elements[1], titleElement = elements[2];
if(sliderElement){
const imgSrc = sliderElement.getAttribute("src");
let price = priceElement ? priceElement.innerText : "--";
const title = titleElement ? titleElement.innerText : "--";
price = price.replace(/\t|\r|\s|¥|¥/g,"");
const goods = {"id":goodsId, "url":window.location.href, "pic":imgSrc, "date":(new Date()).getTime(), "price":price, "title":title}
this.historyObject.push(recordPlatform, goods);
}
});
}
};
this.createHtml=async function(platform, goodsId, goodsName){
if(!platform || !goodsId){
return "kong";
}
this.browsingHistoryMark(platform, goodsId); //把浏览记录给存在本地
this.browsingHistoryGoods(platform, goodsId); //把商品记录下来,包括title、价格和主图
let addition = "";
if(platform=="vpinhui"){
const vip = goodsId.split("-");
addition = vip[0];
goodsId = vip[1];
}
const goodsCouponUrl = "https://j.jiayoushichang.com/api/ebusiness/find?n=7&v=1.0.2&p="+platform+"&i="+goodsId+"&q="+goodsName+"&addition="+addition;
try{
const data = await commonFunctionObject.request("GET", goodsCouponUrl, null);
if(data.result=="success" && !!data.data){
const json = JSON.parse(data.data);
await this.createCoupon(platform, json.data);
await this.createQrcode(platform, json.mscan);
//开启插入检测
let heartms = 0;
const HEART_DELAY = 1500, MAX_MS = 1000*30;
const createResultInterval = setInterval(async ()=>{
if(this.createQrcodeIsResult){
if(document.querySelector("*[name='exist-llkbccxs-9246-hi']") || heartms>=MAX_MS){
clearInterval(createResultInterval);
}else{
await this.createCoupon(platform, json.data);
}
}
heartms += HEART_DELAY;
}, HEART_DELAY);
}
}catch(e){
console.log("createCouponHtml:",e);
}
};
this.getHandlerElement=async function(handler){
const getElement = async (handler)=>{
const promiseArray = [];
const handlers = handler.split("@");
for(let i=0; i{ resolve(document.body) })
);
}else if(eleName=="html"){
promiseArray.push(
new Promise((resolve,reject) =>{ resolve(document.html) })
);
}else{
promiseArray.push(commonFunctionObject.getElementObject(eleName, document.body, true, 10, 1500));
}
}
const element = await Promise.race(promiseArray);
return element ? element : null;
}
const element = await getElement(handler);
return new Promise((resolve,reject) =>{
resolve(element);
});
};
this.createCoupon=async function(platform, result){
try{
this.createQrcodeIsResult = false;
if(!result || result==="null" || !result.hasOwnProperty("css") || !result.hasOwnProperty("html") || !result.hasOwnProperty("handler")){
return;
}
const cssText = result.css, htmlText = result.html, handler = result.handler, templateId = result.templateId;
if(!cssText || !htmlText || !handler){
return;
}
GM_addStyle(cssText);
// 添加HTML, 需要动态检测元素
const handlerElement = await this.getHandlerElement(handler);
if(handlerElement){
const $handlerElement = $(handlerElement);
if(platform=="taobao"){
$handlerElement.parent().after(htmlText);
}else if(platform=="tmall"){
$handlerElement.parent().after(htmlText);
}else if(platform=="jd"){
$handlerElement.after(htmlText);
}else if(platform=="vpinhui"){
$handlerElement.after(htmlText);
}
}
const $template = $("#"+templateId);
if($template.length == 0){
return;
}
const couponId = $template.data("id");
const goodsPrivateUrl = "https://j.jiayoushichang.com/api/private/change/coupon?script=7&platform="+platform+"&id=";
if(!/\d/.test(couponId)){
return;
}
setInterval(()=>{
$template.find("*").each(function(){
$(this).removeAttr("data-spm-anchor-id");
});
},400);
const couponElementA = $template.find("a[name='cpShUrl']");
couponElementA.unbind("click").bind("click", ()=>{
event.stopPropagation();
event.preventDefault();
commonFunctionObject.request("GET", goodsPrivateUrl+couponId, null).then((privateResultData)=>{
if(privateResultData.result==="success" && !!privateResultData.data){
let url = JSON.parse(privateResultData.data).url;
if(!!url) GM_openInTab(url, {active:true});
}
});
});
//canvas画二维码
var $canvasElement = $("#ca"+templateId);
if($canvasElement.length == 0){
return;
}
const qrcodeResultData = await commonFunctionObject.request("GET", goodsPrivateUrl+couponId, null);
if(!!qrcodeResultData && qrcodeResultData.result==="success" && !!qrcodeResultData.data){
let img = JSON.parse(qrcodeResultData.data).img;
if(!!img){
var canvasElement = document.getElementById("ca"+templateId);
var cxt = canvasElement.getContext("2d");
var imgData = new Image();
imgData.src = img;
imgData.onload=function(){
cxt.drawImage(imgData, 0, 0, imgData.width, imgData.height);
}
}
}
}catch(e){
console.log("~~~~~~~~~~~~~~~~~",e);
}finally{
this.createQrcodeIsResult = true;
}
};
this.createQrcode=async function(platform, mscan){
if(!mscan || mscan==="null" || !mscan.hasOwnProperty("mount")
|| !mscan.hasOwnProperty("html")|| !mscan.hasOwnProperty("qrcode")){
return;
}
const {mount, html, qrcode, iden} = mscan;
if(!!mount && !!html && !!qrcode && !!iden){
$(mount).append(html);
var canvasElement = document.getElementById("mscan"+iden);
var width = canvasElement.getAttribute("width");
var height = canvasElement.getAttribute("height");
var cxt = canvasElement.getContext("2d");
var imgData = new Image();
imgData.src = qrcode;
imgData.onload=function(){
cxt.drawImage(imgData, 0, 0, width, height);
}
}
};
this.start=async function(){
if(this.isRun()){
this.runAliDeceptionSpm();
const platform = commonFunctionObject.getEcommercePlatform();
if(!platform) return;
//如果sku太多就折叠,不然移动端体验太差了
if(platform=="tmall" || platform=="taobao"){
commonFunctionObject.getElementObject("[class='skuItemWrapper']", document.body, false, 10, 1500).then((skuItemWrapper)=>{
if(skuItemWrapper != null){
const { style } = skuItemWrapper;
style.maxHeight = "350px";
style.overflow = "auto";
}
}).catch(()=>{});
}
const goodsData = await this.getGoodsData(platform);
this.createHtml(platform, goodsData.goodsId, goodsData.goodsName);
}
};
}
function SearchPageObject(historyObject){
this.intervalIsRunComplete = true; //定时任务一个循环是否完成
this.histories = commonFunctionObject.GMgetValue(recordBrowsingHistoryKey, []);
this.pickupSearchElements=function(){ //收集列表的元素
const selectorElementList = new Array();
const url = window.location.href;
if(url.indexOf("://s.taobao.com/search")!=-1 || url.indexOf("://s.taobao.com/list")!=-1) { //淘宝搜索页面
selectorElementList.push({"element":".items >.item", "page":"taobao"});
selectorElementList.push({"element":".Content--content--sgSCZ12 .Card--doubleCardWrapper--L2XFE73", "page":"taobao_new"});
selectorElementList.push({"element":".Content--content--sgSCZ12 .Card--listCardWrapper--ax09OfT", "page":"taobao_new"});
selectorElementList.push({"element":".Content--content--sgSCZ12 .Card--doubleCardWrapperMall--uPmo5Bz", "page":"taobao_new"});
selectorElementList.push({"element":".Content--content--sgSCZ12 .Card--listCardWrapperMall--E3jI8L4", "page":"taobao_new"});
}else if(url.indexOf("taobao.com/category")!=-1){ //淘宝店铺分类
selectorElementList.push({"element":"dl.item", "page":"taobao_category"});
}else if(url.indexOf("taobao.com/search.htm")!=-1){ //淘宝店铺搜索
selectorElementList.push({"element":"dl.item", "page":"taobao_shop_search"});
}
else if (url.indexOf("://list.tmall.com/search_product.htm")!=-1 || url.indexOf("://list.tmall.com//search_product.htm")!=-1
|| url.indexOf("://list.tmall.com/coudan/search_product.htm")!=-1
|| url.indexOf("://pages.tmall.com/wow/an/cs/search")!=-1) { //天猫超市
selectorElementList.push({"element":".product", "page":"tmall_chaoshi_search"});
selectorElementList.push({"element":".chaoshi-recommend-list .chaoshi-recommend-item", "page":"tmall_chaoshi_search_new"}); //新天猫超市
selectorElementList.push({"element":".feeds-list .feeds-item", "page":"tmall_chaoshi_search_20240115"}); //天猫超市新页面https://pages.tmall.com/wow/an/cs/search%2F18a4077f847?spm=a3204.7084713.1996500281.13.z3hXwd&s=0&user_id=725677994&area_code=330100&cat=50514029&active=1&style=g&acm=lb-zebra-27092-331852.1003.4.457104&search_condition=1&sort=s&scm=1003.4.lb-zebra-27092-331852.OTHER_14434954372593_457104&n=40#/?q=%E7%89%99%E8%86%8F&sort=s&page_no=1&spos=&brand=&prop=&cat=50514008
}else if (url.indexOf("//list.tmall.hk/search_product")!=-1) { //天猫国际
selectorElementList.push({"element":"#J_ItemList .product", "page":"tmall_hk"});
}else if(url.indexOf("tmall.com/category-")!=-1){ //天猫分类
selectorElementList.push({"element":"#J_ShopSearchResult dl.item", "page":"tmall_category"});
}else if(url.indexOf("tmall.com/category-")!=-1){ //天猫旗舰店分类
selectorElementList.push({"element":"#J_ShopSearchResult dl.item", "page":"tmall_category"});
}else if(url.indexOf(".tmall.com/shop/view_shop.htm")!=-1){ //天猫旗舰全部展示
selectorElementList.push({"element":"dl.item", "page":"tmall_shop_01"});
}else if(url.indexOf(".tmall.com/search.htm")!=-1){
selectorElementList.push({"element":"dl.item", "page":"tmall_shop_search"});
}
else if(url.indexOf("//maiyao.liangxinyao.com/shop/view_shop.htm")!=-1
|| url.indexOf("//maiyao.liangxinyao.com/search.htm")!=-1
|| url.indexOf("//maiyao.liangxinyao.com/category")!=-1){ //阿里大药房
selectorElementList.push({"element":"#J_ShopSearchResult dl.item", "page":"ali_yao"});
}
else if (url.indexOf("//search.jd.com/Search")!=-1 || url.indexOf("//search.jd.com/search")!=-1) { //京东搜索
selectorElementList.push({"element":"#J_goodsList li.gl-item", "page":"jd_search"});
}else if(url.indexOf("//search.jd.hk/Search")!=-1){ //京东国际https://search.jd.hk/Search?keyword=ds
selectorElementList.push({"element":"#plist li.gl-item", "page":"jd_hk_search"}); //可能已弃用
selectorElementList.push({"element":"li[class^='productList_']", "page":"jd_hk_new_search"});//20240119添加
}else if(url.indexOf("//mall.jd.com/view_search")!=-1){ //京东大药房
selectorElementList.push({"element":"li.jSubObject", "page":"jd_yao_search"});
}else if(url.indexOf("www.jd.com")!=-1 && window.location.pathname=="/"){
selectorElementList.push({"element":"#feedContent0 li.more2_item_good", "page":"jd_homepage"});
}
else if(url.indexOf("category.vip.com/suggest.php")!=-1){
selectorElementList.push({"element":"#J_searchCatList .c-goods-item", "page":"vpinhui_search_page"});
}else if(url.indexOf("://list.vip.com")!=-1){
selectorElementList.push({"element":"#J_wrap_pro_add .c-goods-item", "page":"vpinhui_list"});
}
return selectorElementList;
};
this.createAllElementHtml=function(elementData){ //为所有的商品创建提示
const self = this;
$(elementData.element).each(function(){ //遍历所有的商品框
self.createOneElementHtml($(this), elementData);
});
self.intervalIsRunComplete = true;
};
this.markBrowsingHistory=function($element, mark){
if(this.histories.includes(mark)){
$element.append(browsedHtml);
}
};
/**
* 为商品box添加有券提醒
* @param {Object} $element 每一个商品box
* @param {Object} elementData id and page
*/
this.createOneElementHtml=async function($element, elementData){ //查询到每个商品list
if($element.attr("honghaoerbox")){ //当存在时,说明已经处理过了
return;
}
const self = this;
$element.attr("honghaoerbox","true");
$element.css("position","relative");
var page = elementData.page;
var goodsDetailUrl = null;
if(page==="taobao"){
goodsDetailUrl = $element.find("a[id^='J_Itemlist_TLink_']").attr("href");
}else if(page==="taobao_new"){
let href = $element.attr("href");
goodsDetailUrl = href.indexOf("http") == -1 ? (location.protocol + href) : href;
}else if(page==="taobao_category"){
goodsDetailUrl = $element.find(".J_TGoldData").attr("href");
}else if(page==="taobao_shop_search"){
goodsDetailUrl = $element.find(".J_TGoldData").attr("href");
}else if(page==="ali_yao"){
goodsDetailUrl = $element.find(".J_TGoldData").attr("href");
}else if(page==="tmall_chaoshi_search"){
let href = $element.find("div.product-img").find("a").attr("href");
goodsDetailUrl = href.indexOf("http") ==-1 ? (location.protocol + href) : href;
}else if(page==="tmall_chaoshi_search_new"){
let href = !!$element.attr("href")?$element.attr("href"):$element.find("a").attr("href");
goodsDetailUrl = href.indexOf("http") ==-1 ? (location.protocol + href) : href;
}else if(page==="tmall_hk"){
goodsDetailUrl = $element.find("a.productImg").attr("href");
}else if(page==="tmall_category"){
goodsDetailUrl = $element.find(".J_TGoldData").attr("href");
}else if(page==="tmall_shop_01"){
goodsDetailUrl = $element.find("dt.photo").find("a").attr("href");
}else if(page==="tmall_shop_search"){
goodsDetailUrl = $element.find(".J_TGoldData").attr("href");
}else if(page=="tmall_chaoshi_search_20240115"){
goodsDetailUrl = $element.find("a").attr("href");
}
else if(page==="jd_search"){
goodsDetailUrl = $element.find("div.p-img").find("a").attr("href");
}else if(page==="jd_hk_search"){
goodsDetailUrl = $element.find("div.p-img").find("a").attr("href");
}else if(page==="jd_hk_new_search"){
goodsDetailUrl = $element.find("a").attr("href");
}else if(page==="jd_yao_search"){
goodsDetailUrl = $element.find("div.jPic").find("a").attr("href");
}else if(page=="jd_homepage"){
goodsDetailUrl = $element.find("a[class='more2_lk']").attr("href");
}
else if(page=="vpinhui_search_page"){
goodsDetailUrl = $element.find("a").attr("href");
}else if(page=="vpinhui_list"){
goodsDetailUrl = $element.find("a").attr("href");
}
if(!goodsDetailUrl){
return;
}
var analysisData = null;
if(page.indexOf("jd_")!=-1){
var jdId = commonFunctionObject.getEndHtmlIdByUrl(goodsDetailUrl);
if(!!jdId) analysisData = {"id":jdId, "platform":"jd"};
}else if(page.indexOf("vpinhui_")!=-1){
var vipId = commonFunctionObject.getEndHtmlIdByUrl(goodsDetailUrl).replace("detail-","");;
if(!!vipId){
analysisData = {"id":vipId.split("-")[1], "platform":"vpinhui"};
}
}else{
var platform = commonFunctionObject.getEcommercePlatform(goodsDetailUrl);
var id = commonFunctionObject.getParamterQueryUrl(goodsDetailUrl, "id");
if(platform && id){
analysisData = {"id":id, "platform":platform};
}
}
if(!analysisData){
return;
}
this.markBrowsingHistory($element, analysisData.platform + "_" + analysisData.id);
try{
const searchUrl = "https://j.jiayoushichang.com/api/ebusiness/coupon/exist/"+analysisData.platform+"?id="+analysisData.id;
const data = await commonFunctionObject.request("GET", searchUrl, null);
if(data.result=="success" && !!data.data){
const { tip, encryptLink } = JSON.parse(data.data);
if(tip){
$element.append(tip);
}
if(encryptLink){
let decryptUrl = null;
try{
const decryptLink = atob(encryptLink);
decryptUrl = decryptLink.split('').reverse().join('');
}catch(e){}
if(decryptUrl){
self.relativeJu(page, $element, decryptUrl);
}
}
}
}catch(e){
console.log("查券出现异常",e);
}
};
this.relativeJu=function(page, $element, decryptUrl){
const self = this;
try{
if(page.indexOf("jd_")!=-1){
$element.find("a").each(function(){
if($(this).attr("href").indexOf("item.jd.com")!=-1){
$(this).removeAttr("onclick");
$(this).unbind("click").bind("click", function(e){
e.preventDefault();
e.stopPropagation();
commonFunctionObject.GMopenInTab(decryptUrl);
});
}
});
}
else if(page.indexOf("taobao_")!=-1 || page.indexOf("tmall_")!=-1){
$element.unbind("click").bind("click",function(e){
const target = $(e.target);
const tagName = target.prop("tagName").toUpperCase();
let isPreventDefault = false;
if(tagName==="A"){ //只有点击A标签才去判断
const href = target.attr("href");
const isDetail = [/detail\.tmall\.com\/item\.htm/, /item\.taobao\.com\/item\.htm/]
.map((reg)=> reg.test(href))
.some((result) => result);
if(isDetail){
isPreventDefault = true;
}
}else{
isPreventDefault = true;
}
if(isPreventDefault){
e.preventDefault();
e.stopPropagation();
commonFunctionObject.GMopenInTab(decryptUrl);
}
});
}
else if(page.indexOf("vpinhui_")!=-1){
$element.find("a").each(function(){
if($(this).attr("href").indexOf("detail.vip.com/detail-")!=-1){
$(this).unbind("click").bind("click", function(e){
e.preventDefault();
e.stopPropagation();
commonFunctionObject.GMopenInTab(decryptUrl);
});
}
});
}
}catch(e){
console.log(e);
}
};
this.searchPage=function(selectorElementList){
if(!this.intervalIsRunComplete){
return;
}
selectorElementList.forEach((elementData)=>{
if(!!elementData){
this.createAllElementHtml(elementData);
}
});
}
this.start=function(){
const selectorElementList = this.pickupSearchElements();
selectorElementList.forEach((elementData)=>{
if(!!elementData){
$("body").on("click",elementData.element,function(){
$(this).append(browsedHtml);
});
}
});
setInterval(()=>{
this.searchPage(selectorElementList);
}, 1000);
};
}
try{
const historyObject = new HistoryObject();
(new SearchPageObject(historyObject)).start();
(new QueryCoupon(historyObject)).start();
historyObject.start();
}catch(e){
console.log("优惠券查询:error:"+e);
}
})();