Greasy Fork

纯净网购省钱助手,自动查询淘宝、天猫、天猫国际、京东、京东国际、京东大药房等隐藏优惠券。简洁无广告,不花冤枉钱

浏览商品时,自动查询商品是否有隐藏优惠券,支持:京东(jd.com)、淘宝(taobao.com)、天猫(tmall.com)、天猫超市(chaoshi.tmall.com)、天猫国际(tmall.hk)、京东国际(jd.hk)、京东图书、京东大药房(yiyaojd.com)、阿里大药房(maiyao.liangxinyao.com)等,低侵入提示,长期维护更新~

目前为 2021-06-21 提交的版本。查看 最新版本

// ==UserScript==
// @name         纯净网购省钱助手,自动查询淘宝、天猫、天猫国际、京东、京东国际、京东大药房等隐藏优惠券。简洁无广告,不花冤枉钱
// @description  浏览商品时,自动查询商品是否有隐藏优惠券,支持:京东(jd.com)、淘宝(taobao.com)、天猫(tmall.com)、天猫超市(chaoshi.tmall.com)、天猫国际(tmall.hk)、京东国际(jd.hk)、京东图书、京东大药房(yiyaojd.com)、阿里大药房(maiyao.liangxinyao.com)等,低侵入提示,长期维护更新~
// @namespace    coupon_honghaoer
// @version      1.0.1
// @author       洪皓儿
// @match        *://*.taobao.com/*
// @match        *://*.tmall.com/*
// @match        *://chaoshi.detail.tmall.com/*
// @match        *://*.tmall.hk/*
// @match        *://*.liangxinyao.com/*
// @match        *://*.jd.com/*
// @match        *://*.jd.hk/*
// @match        *://*.yiyaojd.com/*
// @exclude      *://login.taobao.com/*
// @exclude      *://uland.taobao.com/*
// @exclude      *://pages.tmall.com/*
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @connect      j.jiayoushichang.com
// @grant        GM_info
// @grant        GM_openInTab
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_xmlhttpRequest
// @run-at       document-idle
// @charset		 UTF-8
// @license      AGPL License
// @original-script https://greasyfork.org/zh-CN/scripts/398195
// @original-author 匆匆过客
// @original-license GPLA License
// @antifeature  referral-link 【应GreasyFork代码规范要求:优惠券查询功能必须添加此提示!脚本使用过程中无任何强制行为,请大家放心...】
// ==/UserScript==

(function() {
	'use strict';
	const host = window.location.host;
	const href = window.location.href;
	const isDebug = true;
	
	/**
	 * 公共功能
	 */
	function commonFunctionObject(){
		this.selectParamterQueryUrl = 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.filterStr = function(str){ //去掉空格等
			if(!str) return "";
			str = str.replace(/\t/g,"");
			str = str.replace(/\r/g,"");
			str = str.replace(/\n/g,"");
			str = str.replace(/\+/g,"%2B");//"+"
			str = str.replace(/\&/g,"%26");//"&"
			str = str.replace(/\#/g,"%23");//"#"
			return encodeURIComponent(str)
		};
	}
	const commonFuncObject = new commonFunctionObject();
	
	
	function searchPageObject(){
		this.intervalIsRunComplete = true;  //定时任务一个循环是否完成
		
		/**
		 * 收集列表的元素
		 */
		this.pickupSearchElements = function(){
			var selectorElementList = new Array();
			var url = location.href;
			if(url.indexOf("://s.taobao.com/search")!=-1 || url.indexOf("://s.taobao.com/list")!=-1) { //淘宝搜索页面
				selectorElementList.push({"element":".items >.item", "page":"taobao"});
			}
			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) { //天猫、天猫超市
				selectorElementList.push({"element":".product", "page":"tmall_search"});  //天猫
				selectorElementList.push({"element":".product", "page":"tmall_chaoshi"}); //天猫超市
			}else if (url.indexOf("//list.tmall.hk/search_product")!=-1) { //天猫国际
				selectorElementList.push({"element":"#J_ItemList .product", "page":"tmall_hk"});
			}
			else if(url.indexOf("maiyao.liangxinyao.com/search.htm")!=-1){ //阿里大药房
				selectorElementList.push({"element":"#J_ShopSearchResult dl.item", "page":"ali_yao"});
			}
			else if (url.indexOf("//search.jd.com/Search")!=-1) { //京东搜索,京东药房
				selectorElementList.push({"element":"#J_goodsList li.gl-item", "page":"jd"});
			}else if(url.indexOf("//search.jd.hk/Search")!=-1){ //京东国际
				selectorElementList.push({"element":"#plist li.gl-item", "page":"jd_hk"});
			}
			return selectorElementList;
		};
		
		/**
		 * 分析链接,提取id和平台信息
		 * @param {Object} url
		 * @param {Object} tag
		 */
		this.analysisUrl = function(url, tag){
			if(!!url){
				var id = commonFuncObject.selectParamterQueryUrl(url, tag);
				if(!!id){
					var platform = "taobao";
					if(url.indexOf("jd.com")!=-1 || url.indexOf("yiyaojd.com")!=-1){
						platform = "jd";
					}else if(url.indexOf("taobao.com")!=-1 || url.indexOf("maiyao.liangxinyao.com")!=-1){
						platform = "taobao";
					}else if(url.indexOf("tmall.com")!=-1 || url.indexOf("tmall.hk")!=-1){
						platform = "tmall";
					}
					return {"id":id, "platform":platform};
				}
			}
			return null;
		};
		
		/**
		 * 为所有的商品创建提示
		 * @param {Object} elementData
		 */
		this.createAllElementHtml = function(elementData){
			let that = this;
			$(elementData.element).each(function(){  //遍历所有的商品框
				that.createOneElementHtml($(this), elementData);
			});
			that.intervalIsRunComplete = true;
		};
		
		/**
		 * 为商品box添加有券提醒
		 * @param {Object} $element  每一个商品box
		 * @param {Object} elementData id and page
		 */
		this.createOneElementHtml = function($element, elementData){  //查询到每个商品list
			if($element.attr("completebox")){  //当存在时,说明已经处理过了
				return;
			}
			
			$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==="ali_yao"){
				goodsDetailUrl = $element.find(".J_TGoldData").attr("href");
			}else if(page==="tmall_search"){
				goodsDetailUrl = $element.find("a.productImg").attr("href");
			}else if(page==="tmall_hk"){
				goodsDetailUrl = $element.find("a.productImg").attr("href");
			}else if(page==="tmall_chaoshi"){
				goodsDetailUrl = $element.find("div.product-img").find("a").attr("href");
			}else if(page==="jd"){
				goodsDetailUrl = $element.find("div.p-img").find("a").attr("href");
			}else if(page==="jd_hk"){
				goodsDetailUrl = $element.find("div.p-img").find("a").attr("href");
			}
			
			if(!goodsDetailUrl){
				return;
			}
			if(isDebug) console.log(goodsDetailUrl);
			
			var analysisData = null;
			if(page==="jd" || page==="jd_hk"){
				var jdId = commonFuncObject.getEndHtmlIdByUrl(goodsDetailUrl);
				if(!!jdId) analysisData = {"id":jdId, "platform":"jd"};
			}else{
				analysisData = this.analysisUrl(goodsDetailUrl, "id");
			}
			if(!!analysisData){ //一切数据校验完毕,此处查询是否有券
				let requestUrl = "http://j.jiayoushichang.com/api/ebusiness/coupon/exist/"+analysisData.platform+"?id="+analysisData.id;
				GM_xmlhttpRequest({
					url: requestUrl,
					method: "GET",
					headers: {"Content-Type": "application/x-www-form-urlencoded"},
					onload: function(response) {
						var status = response.status;
						if(status==200||status=='200'){
							var responseText = response.responseText;
							if(!!responseText){
								try{
									var serverResponseJson = JSON.parse(responseText);
									var tip = serverResponseJson.tip;
									if(!!tip){
										$element.append(tip);
									}
								}catch(e){
									console.log(e);
								}
							}
						}
					}
				});
			}
			$element.attr("completebox","true");
		};
		
		/**
		 * 开始查询
		 */
		this.startQueryList = function(){
			let selectorElementList = this.pickupSearchElements();
			let that = this;
			setInterval(()=>{
				if(that.intervalIsRunComplete){
					selectorElementList.forEach((elementData)=>{
						if(!!elementData){
							this.createAllElementHtml(elementData);
						}
					});
				}
			}, 400);
		};
	};
	try{
		(new searchPageObject()).startQueryList();
	}catch(e){}
	
	/**
	 * 详情页领券,查券功能
	 */
	function queryCoupon(){
		this.isRun = function(){
			var urls=["detail.tmall.com", "detail.tmall.hk", "item.taobao.com", "chaoshi.detail.tmall.com", "item.jd.com", "item.yiyaojd.com", "npcitem.jd.hk"];
			for(var i=0; i<urls.length;i++){
				if(window.location.host.indexOf(urls[i])!=-1){
					return true;
				}
			}
			return false;
		}
		this.getPlatform = function(){
			let host = window.location.host;
			let platform = "";
			if(host.indexOf("detail.tmall")!=-1){
				platform = "tmall";
			}else if(host.indexOf("item.taobao.com")!=-1){
				platform = "taobao";
			}else if(host.indexOf("item.jd.com")!=-1 || host.indexOf("item.yiyaojd.com")!=-1 || host.indexOf("npcitem.jd.hk")!=-1){
				platform = "jd";
			}
			return platform;
		};
		this.getGoodsData = function(platform){
			var goodsId = "";
			var goodsName = "";
			var href = window.location.href;
			if(platform=="taobao"){
				goodsId =  commonFuncObject.selectParamterQueryUrl(window.location.search, "id");
				goodsName=$(".tb-main-title").text();
	
			}else if(platform=="tmall"){
				goodsId =  commonFuncObject.selectParamterQueryUrl(window.location.search, "id");
				goodsName=$(".tb-detail-hd").text();
	
			}else if(platform=="jd"){
				goodsName=$("div.sku-name").text();
				goodsId = commonFuncObject.getEndHtmlIdByUrl(href);
	
			}
			var data={"goodsId":goodsId, "goodsName":commonFuncObject.filterStr(goodsName)}
			return data;
		};
		this.createCouponHtml = function(platform, goodsId, goodsName){
			if(!platform || !goodsId) return;
			var goodsCouponUrl = "http://j.jiayoushichang.com/api/ebusiness/find?n=7&";
			goodsCouponUrl = goodsCouponUrl+"p="+platform+"&i="+goodsId+"&q="+goodsName;
			GM_xmlhttpRequest({
				url: goodsCouponUrl,
				method: "GET",
				headers: {"Content-Type": "application/x-www-form-urlencoded"},
				onload: function(response) {
					var status = response.status;
					if(status==200||status=='200'){
						var serverResponseJson = JSON.parse(response.responseText);
						var data = serverResponseJson.data;
						if(!data || data==="null"){
							return;
						}
						var cssText = data.css;
						var htmlText = data.html;
						var handler = data.handler;
						if(!cssText || !htmlText || !handler){
							return;
						}
						$("body").prepend("<style>"+cssText+"</style>");
						var handlers = handler.split("@");
						for(var i=0; i<handlers.length; i++){
							var $handler = $(""+handlers[i]+"");
							if(platform=="taobao"){
								$("#J_isku").prepend(htmlText);
							}else if(platform=="tmall"){
								$(".tb-key").prepend(htmlText);
							}else if(platform=="jd"){
								$(".p-choose-wrap").prepend(htmlText);
							}
							break;
						}
					}
				}
			});
		};
		this.start = function(){
			if(this.isRun()){				
				var platform = this.getPlatform();
				if(!!platform){
					var goodsData = this.getGoodsData(platform);
					this.createCouponHtml(platform, goodsData.goodsId, goodsData.goodsName);
				}
			}
		};
	}
	
	try{
		(new queryCoupon()).start();
	}catch(e){}
})();