// ==UserScript==
// @name [🔥]!!网购小助手,不花冤枉钱:自动查询淘宝、天猫、天猫国际、京东、京东国际、唯品会等隐藏的大额优惠券,有无优惠券一目了然,持续维护更新,请放心使用!
// @name:zh [🔥]!!网购小助手,不花冤枉钱:自动查询淘宝、天猫、天猫国际、京东、京东国际、唯品会等隐藏的大额优惠券,有无优惠券一目了然,持续维护更新,请放心使用!
// @name:zh-TW [🔥]!!網購小助手,不花冤枉錢:自動查詢淘寶、天貓、天貓國際、京東、京東國際、唯品會等隱藏的大額優惠券,有無優惠券一目瞭然,持續維護更新,請放心使用!
// @description 网购小助手功能有:🔥1、浏览商品时脚本会自动查询商品是否有隐藏的优惠券,支持:京东、淘宝、天猫、天猫超市、天猫国际、京东国际、京东图书、京东大药房、阿里大药房、唯品会等;🔥2、商品二维码生成,手机可快捷访问该商品;🔥3、浏览记录标注,避免反复浏览相同商品(本地存储,可手动清空,快捷键shift+c清空);🔥4、PC网页优化,让使用更加舒适;代码全部采用低侵入提示,脚本长期维护更新~
// @description:zh 网购小助手功能有:🔥1、浏览商品时脚本会自动查询商品是否有隐藏的优惠券,支持:京东、淘宝、天猫、天猫超市、天猫国际、京东国际、京东图书、京东大药房、阿里大药房、唯品会等;🔥2、商品二维码生成,手机可快捷访问该商品;🔥3、浏览记录标注,避免反复浏览相同商品(本地存储,可手动清空,快捷键shift+c清空);🔥4、PC网页优化,让使用更加舒适;代码全部采用低侵入提示,脚本长期维护更新~
// @description:zh-TW 網購小助手功能有:🔥1、瀏覽商品時指令碼或直譯式程式會自動查詢商品是否有隱藏的優惠券,支援:京東、淘寶、天貓、天貓超市、天貓國際、京東國際、京東圖書、京東大藥房、阿里大藥房、唯品会等;🔥2、商品二維碼生成,手機可快捷訪問該商品;🔥3、瀏覽記錄標註,避免反覆瀏覽相同商品(本地存儲,可手動清空,快捷键shift+c清空);🔥4、PC網頁優化,讓使用更加舒適;代碼全部採用低侵入提示,指令碼或直譯式程式長期維護更新~
// @icon data:image/png;base64,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
// @namespace coupon_honghaoer
// @version 2.2.1
// @author 洪皓儿
// @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 api.shuoaini.xyz
// @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
// @original-script https://greasyfork.org/zh-CN/scripts/469417
// @original-author huahuacat
// @original-license AGPL License
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
/**
* 代码版权说明:
* 原作者huahuacat,本脚本在原作者基础上优化了代码结构,添加了新功能
* 本脚本代码已获得原作者授权,并遵循AGPL License开源协议,请悉知!
*/
const recordBrowsingHistoryKey = "record_browsing_history_key";
const browsedHtml= `
已浏览
`
/**
* 公共的方法
*/
class CommonTools{
request(mothed, url, param){
return new Promise(function(resolve, reject){
GM_xmlhttpRequest({
url: url,
method: mothed,
data:param,
onload: function(response) {
var status = response.status;
if(status==200||status=='200'){
var responseText = response.responseText;
resolve({"code":"success", "result":responseText});
}else{
reject({"code":"error", "result":null});
}
}
});
})
}
randomNumber(){
return Math.ceil(Math.random()*100000000);
}
getPlatform(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;
}
getParamterQueryUrl(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 "";
}
getEndHtmlIdByUrl(url){
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;
}
getElementAsync(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);
});
}
GMgetValue(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;
}
GMsetValue(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)
}
}
decryptStr(str){
let result = atob(str);
return result.split('').reverse().join('');
}
encryptStr(str){
let result = str.split('').reverse().join('');
return btoa(result);
}
GMopenInTab(url, options={"active":true, "insert":true, "setParent":true}){
if (typeof GM_openInTab === "function") {
GM_openInTab(url, options);
} else {
GM.openInTab(url, options);
}
}
}
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;
})()
})();
/**
* 历史记录
*/
class HistoryObject{
constructor(){
this.commonTools = new CommonTools();
}
redirectUrl="https://api.shuoaini.xyz/api/go/to?e=";
storageKeys={
goodsHistory:"goooods_history_key",
offset:"goooods_wrapper_key",
maximumRecordsKey:"goooods_max_records_key"
}
defaultValue={
historyStorage:{"jd":[], "taobao":[], "vpinhui":[]},
offsetWrapper:{left:10, bottom:10},
records:{min:10, max:500, default:100}
}
push(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);
}
get(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;
}
remove(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);
}
removeAll(){
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='';
}
removeAllConfirm(){
if(confirm('此弹窗来自脚本-[🔥]!!网购小助手,不花冤枉钱\n是否要移除所有的浏览记录?移除后将不可恢复...')){
this.removeAll(); //box展示
this.commonTools.GMsetValue(recordBrowsingHistoryKey,[]); //已浏览标识
}
}
registerMenuCommand(){
GM_registerMenuCommand("浏览记录设置【点击或shift+c均可可唤起】", ()=> {
this.showSettingDialog();
});
const listener = new window.keypress.Listener();
listener.simple_combo("shift c", ()=>{
this.showSettingDialog();
});
}
getGoodsByDateGroup(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);
}
}
}
});
}
showOrHideHistoryBox(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");
self.commonTools.GMopenInTab(self.commonTools.decryptStr(href));
});
});
}
createHistoryBox(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 = this.commonTools.encryptStr(this.redirectUrl+encodeURIComponent(h.url));
goodsHtml += `
`;
});
let html = `
`+goodsHtml+`
`;
GM_addStyle(css);
document.querySelector("body").insertAdjacentHTML('afterend', html);
this.addEventListener(platform);
}
addEventListener(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");
self.commonTools.GMopenInTab(self.commonTools.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);
});
}
}
platform(){
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;
}
start(){
let platform = this.platform();
if(platform){
if(platform=="tmall") platform="taobao";
this.createHistoryBox(platform);
this.registerMenuCommand();
}
}
}
/**
* 优惠券相关功能
*/
class Coupon{
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"];
constructor(historyObject){
this.commonTools = new CommonTools();
this.createQrcodeIsResult = true;
this.historyObject = historyObject;
}
isRun(){
for(var i=0; i{
this.randomSpmValue();
}, 2000);
}
}
browsingHistoryMark(platform, goodsId){
let histories = this.commonTools.GMgetValue(recordBrowsingHistoryKey,[]);
let saveContent = platform+"_"+goodsId;
if(!histories.includes(saveContent)){
histories.unshift(saveContent);
this.commonTools.GMsetValue(recordBrowsingHistoryKey,histories.slice(0,60));
}
}
async browsingHistoryGoods(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 = [
this.commonTools.getElementAsync(elementName.price, document.body, false, 100, 10*1000),
this.commonTools.getElementAsync(elementName.slider, document.body, true, 100, 10*1000),
this.commonTools.getElementAsync(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);
}
});
}
}
async createHtml(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://api.shuoaini.xyz/api/coupon/query?no=888&version=1.0.2&platform="+platform+"&id="+goodsId+"&q="+goodsName+"&addition="+addition;
try{
const data = await this.commonTools.request("GET", goodsCouponUrl, null);
if(data.code=="success" && !!data.result){
const json = JSON.parse(data.result);
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);
}
}
async getHandlerElement(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(this.commonTools.getElementAsync(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);
});
}
async createCoupon(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://api.shuoaini.xyz/api/private/real?no=888&v=1.0.2&p="+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();
this.commonTools.request("GET", goodsPrivateUrl+couponId, null).then((privateResultData)=>{
if(privateResultData.code==="success" && !!privateResultData.result){
let url = JSON.parse(privateResultData.result).url;
if(!!url) GM_openInTab(url, {active:true});
}
});
});
//canvas画二维码
var $canvasElement = $("#ca"+templateId);
if($canvasElement.length == 0){
return;
}
const qrcodeResultData = await this.commonTools.request("GET", goodsPrivateUrl+couponId, null);
if(!!qrcodeResultData && qrcodeResultData.code==="success" && !!qrcodeResultData.result){
let img = JSON.parse(qrcodeResultData.result).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;
}
}
async createQrcode(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);
}
}
}
async start(){
if(this.isRun()){
this.runAliDeceptionSpm();
const platform = this.commonTools.getPlatform();
if(!platform) return;
//如果sku太多就折叠,不然移动端体验太差了
if(platform=="tmall" || platform=="taobao"){
this.commonTools.getElementAsync("[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);
}
}
}
class SearchPageObject{
intervalIsRunComplete = true; //定时任务一个循环是否完成
constructor(historyObject){
let commonTools = new CommonTools();
this.histories = commonTools.GMgetValue(recordBrowsingHistoryKey, []);
this.commonTools = commonTools;
this.historyObject = historyObject;
}
pickupSearchElements(){ //收集列表的元素
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;
}
createAllElementHtml(elementData){ //为所有的商品创建提示
const self = this;
$(elementData.element).each(function(){ //遍历所有的商品框
self.createOneElementHtml($(this), elementData);
});
self.intervalIsRunComplete = true;
}
markBrowsingHistory($element, mark){
if(this.histories.includes(mark)){
$element.append(browsedHtml);
}
}
/**
* 为商品box添加有券提醒
* @param {Object} $element 每一个商品box
* @param {Object} elementData id and page
*/
async createOneElementHtml($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 = this.commonTools.getEndHtmlIdByUrl(goodsDetailUrl);
if(!!jdId) analysisData = {"id":jdId, "platform":"jd"};
}else if(page.indexOf("vpinhui_")!=-1){
var vipId = this.commonTools.getEndHtmlIdByUrl(goodsDetailUrl).replace("detail-","");;
if(!!vipId){
analysisData = {"id":vipId.split("-")[1], "platform":"vpinhui"};
}
}else{
var platform = this.commonTools.getPlatform(goodsDetailUrl);
var id = this.commonTools.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://api.shuoaini.xyz/api/ebusiness/q/c?p="+analysisData.platform+"&id="+analysisData.id;
const data = await this.commonTools.request("GET", searchUrl, null);
if(data.code=="success" && !!data.result){
const { tip, encryptLink } = JSON.parse(data.result);
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);
}
}
relativeJu(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();
self.commonTools.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();
self.commonTools.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();
self.commonTools.GMopenInTab(decryptUrl);
});
}
});
}
}catch(e){
console.log(e);
}
}
searchPage(selectorElementList){
if(!this.intervalIsRunComplete){
return;
}
selectorElementList.forEach((elementData)=>{
if(!!elementData){
this.createAllElementHtml(elementData);
}
});
}
start(){
const selectorElementList = this.pickupSearchElements();
selectorElementList.forEach((elementData)=>{
if(!!elementData){
$("body").on("click",elementData.element,function(){
$(this).append(browsedHtml);
});
}
});
setInterval(()=>{
this.searchPage(selectorElementList);
}, 1000);
};
}
const historyObject = new HistoryObject();
historyObject.start();
(new Coupon(historyObject)).start();
(new SearchPageObject(historyObject)).start();
})();