Greasy Fork is available in English.

公共库js

公共库文件

Script này sẽ không được không được cài đặt trực tiếp. Nó là một thư viện cho các script khác để bao gồm các chỉ thị meta // @require https://update.greasyfork.org/scripts/441330/1323965/%E5%85%AC%E5%85%B1%E5%BA%93js.js

const host = window.location.host
const id = getQueryVariable('id')
// 配置
const config = {
	zhetaoke: {
		appkey: '52b273a5972949388ce7b57b84453aa4',
		sid: '45532',
		pid: 'mm_55657354_2153100333_111014050406'
	}
}
// ajax
function dtd(url, params, callback, query) {
	let dtd = $.Deferred()
	let wait = function (dtd) {
		$.ajax({
			url: url,
			method: 'get',
			data: params
		})
			.done(function (res) {
				dtd.resolve(res)
			})
			.fail(function () {
				dtd.resolve({ error: true })
			})
		return dtd.promise()
	}
	$.when(wait(dtd)).done(function (res, q = query) {
		callback(res, q)
	})
}
// 历史价格图表
/**
 * @description: 初始化图表
 * @param {*} obj time 时间
 * @param {*} obj value 数据
 * @param {*} obj maxNum 最大值
 * @param {*} obj minNum 最小值
 * @return {*}
 */
function eachart(obj) {
	// 找到容器
	var myChart = echarts.init(document.getElementById('historyChart'))
	// 指定图表的配置项和数据
	var option = {
		title: {
			right: 30,
			subtext:
				'最高价:¥' +
				'{a|' +
				obj.maxNum +
				'}' +
				'  最低价:¥' +
				'{a|' +
				obj.minNum +
				'}',
			subtextStyle: {
				color: '#333',
				rich: {
					a: {
						fontSize: 16,
						fontWeight: 'bold',
						color: '#F40',
						lineHeight: 10
					}
				}
			}
		},
		tooltip: {
			trigger: 'axis',
			formatter: '{b0} <br />¥{c0}元'
		},
		legend: {
			type: 'scroll',
			icon: 'roundRect',
			left: 50,
			top: 10,
			itemGap: 100,
			itemWidth: 16, // 设置宽度
			itemHeight: 4, // 设置高度
			data: ['历史价格(券后价)'],
			textStyle: {
				fontSize: 16
			}
		},
		grid: {
			left: '12%',
			right: '5%',
			bottom: '30px'
		},
		xAxis: {
			data: obj.time,
			axisLabel: {
				formatter: function (value, idx) {
					var date = new Date(value)
					return idx === 0
						? value
						: [
								date.getMonth() + 1 < 10
									? '0' + (date.getMonth() + 1)
									: date.getMonth() + 1,
								date.getDate() < 10
									? '0' + date.getDate()
									: date.getDate()
						  ].join('-')
				}
			}
		},
		yAxis: {
			splitNumber: 5,
			min: obj.minNum,
			max: obj.maxNum
		},
		series: [
			{
				name: '历史价格(券后价)',
				type: 'line',
				color: '#F40',
				data: obj.historyPrice,
				lineStyle: {
					color: '#F40' //改变折线颜色
				}
			}
		]
	}

	// 使用刚指定的配置项和数据显示图表。
	myChart.setOption(option)
}
// 获取链接参数
function getQueryVariable(variable) {
	var query = window.location.search.substring(1)
	var vars = query.split('&')
	for (var i = 0; i < vars.length; i++) {
		var pair = vars[i].split('=')
		if (pair[0] == variable) {
			return pair[1]
		}
	}
	return false
}
// 对象排序
function objKeySort(obj) {
	//排序的函数
	var newkey = Object.keys(obj).sort()
	//先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
	var newObj = {} //创建一个新的对象,用于存放排好序的键值对
	for (var i = 0; i < newkey.length; i++) {
		//遍历newkey数组
		newObj[newkey[i]] = obj[newkey[i]] //向新创建的对象中按照排好的顺序依次增加键值对
	}
	return newObj //返回排好序的新对象
}
// 获取时间
function dateFormat() {
	let myDate = new Date()
	let obj = {
		year: myDate.getFullYear(),
		month: myDate.getMonth(),
		date: myDate.getDate(),
		hours: myDate.getHours(),
		min: myDate.getMinutes(),
		sec: myDate.getSeconds()
	}
	for (i in obj) {
		if (i === 'month') {
			obj[i] = obj[i] + 1
		}
		if (i !== 'year' && obj[i] < 10) {
			obj[i] = '0' + obj[i]
		}
	}
	let time =
		obj.year +
		'-' +
		obj.month +
		'-' +
		obj.date +
		' ' +
		obj.hours +
		':' +
		obj.min +
		':' +
		obj.sec
	return time
}
/**
 * @description: 获取数组最大值最小值
 * @param {*} arr 数据源
 * @return {*} arr[0] 最大值
 * @return {*} arr[1] 最小值
 */
function getMaxMin(arr) {
	let a = arr.sort()
	let max = a[a.length - 1]
	let min = a[0]
	return [max, min]
}
// 时间格式化
function timeFormat(val, type) {
	let date = new Date(val)
	let YY = date.getFullYear() + '-'
	let MM =
		(date.getMonth() + 1 < 10
			? '0' + (date.getMonth() + 1)
			: date.getMonth() + 1) + '-'
	let DD = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
	let hh =
		(date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
	let mm =
		(date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) +
		':'
	let ss =
		date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
	if (type === 0) {
		return MM + DD
	} else if (type === 1) {
		return YY + MM + DD
	} else {
		return MM + DD + ' ' + hh + mm + ss
	}
}
// 监听dom变化
function domAddEventListener(node, callback) {
	let targetNode = node
	let observer = new MutationObserver(function (mutations) {
		callback(mutations)
	})
	observer.observe(targetNode, {
		attributes: true,
		childList: true,
		subtree: true
	})
}
// 大淘客加密
const makeSign = ($data, $appSecret) => {
	let $str = ''
	let $index = 0
	let $sortPor = []

	for (let key in $data) {
		$sortPor.push(`${key}=${$data[key]}`)
	}
	// 排序
	$sortPor.sort()

	// 转url
	for (let key in $sortPor) {
		$str = `${$str}${$index === 0 ? '' : '&'}${$sortPor[key]}`
		$index++
	}
	// md5加密
	const $ret = md5(`${$str}&key=52538654c86d4d403083c8f1ec69e87b`)
	return $ret.toUpperCase()
}
let historyMd5 = {
	zero: ['0', '00', '000', '0000', '00000', '000000', '0000000', '00000000'],
	chars: [
		'0',
		'1',
		'2',
		'3',
		'4',
		'5',
		'6',
		'7',
		'8',
		'9',
		'a',
		'b',
		'c',
		'd',
		'e',
		'f',
		'g',
		'h',
		'i',
		'j',
		'k',
		'l',
		'm',
		'n',
		'o',
		'p',
		'q',
		'r',
		's',
		't',
		'u',
		'v',
		'w',
		'x',
		'y',
		'z'
	],
	strReverse: function (a) {
		var b,
			c = []
		var l
		for (b = 0, l = a.length; b < l; b++) c[c.length] = a.charAt(b)
		return c.reverse().join('')
	},
	encrypt: function (url, always2, alwaysTrue) {
		var a1 = historyMd5.shuzi(url)
		var a2 = historyMd5.zimu(url)
		url = a2 + a1
		var f,
			g = []
		var l
		for (f = 0, l = url.length; f < l; f++)
			g[g.length] = historyMd5.to(url.charCodeAt(f), always2)
		return historyMd5.rnd(
			alwaysTrue ? historyMd5.strReverse(g.join('')) : g.join(''),
			4
		)
	},
	to: function (a, c) {
		var e = '' + historyMd5.round(a + 88, c).toString(16),
			f = c - e.length
		return f > 0 ? historyMd5.zero[f - 1] + e : e
	},
	round: function (a, b) {
		var c = 1 << (4 * b)
		return 0 > a ? (a % c) + c : a % c
	},
	shuzi: function (a) {
		return a.replace(/[^0-9]+/gi, '')
	},
	zimu: function (a) {
		return a
			.toLowerCase()
			.replace(/https/g, 'http')
			.replace(/[^a-zA-Z]+/gi, '')
	},
	rnd: function (a, b) {
		return (
			historyMd5.rd(b) +
			md5(a) +
			historyMd5.rd(Math.ceil(Math.random() * 10))
		)
	},
	rd: function (a) {
		var res = ''
		for (var i = 0; i < a; i++) {
			res += historyMd5.chars[Math.ceil(Math.random() * 35)]
		}
		return res
	}
}
function urldecode(str, charset, callback) {
	window._urlDecodeFn_ = callback
	var script = document.createElement('script')
	script.id = '_urlDecodeFn_'
	var src =
		'data:text/javascript;charset=' +
		charset +
		',_urlDecodeFn_("' +
		str +
		'");'
	src +=
		'document.getElementById("_urlDecodeFn_").parentNode.removeChild(document.getElementById("_urlDecodeFn_"));'
	script.src = src
	document.body.appendChild(script)
}
// 跳转
function redirect(link) {
	var arg =
		'\u003cscript\u003etop.location.replace("' +
		link +
		'")\u003c/script\u003e'
	var iframe = document.createElement('iframe')
	iframe.src = 'javascript:window.name;'
	iframe.name = arg
	document.body.appendChild(iframe)
}