从steamdb.keylol.com获取愿望单数据
// ==UserScript== // @name SWH_Helper // @namespace https://blog.chrxw.com // @version 1.40 // @description 从steamdb.keylol.com获取愿望单数据 // @author Chr_ // @match https://swh.chrxw.com/ // @match http://localhost/ // @match https://steamdb.keylol.com/* // @connect steamdb.keylol.com // @connect swh.chrxw.com // @connect swh.chrxw.cn // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // ==/UserScript== (function () { 'use strict'; var serverdic = { 'ali': ["阿里云1", "swh.chrxw.cn:20443"], 'ali2': ["阿里云2", "swh2.chrxw.cn:20443"], } var review = ['评测不足', '差评如潮', '特别差评', '差评', '多半差评', '褒贬不一', '多半好评', '好评', '特别好评', '好评如潮', '好评如潮']; var infodict; var wishlist; var wishstr; var server; var tmp; if (window.location.host == 'steamdb.keylol.com') { wishstr = window.localStorage.getItem('wish'); GM_setValue('wish', wishstr); var nav = document.getElementsByClassName('nav')[0]; var button = document.createElement('li'); button.setAttribute('class', 'nav-swh'); button.setAttribute('class', 'nav-swh'); var link = document.createElement('a'); link.setAttribute('href', 'https://swh.chrxw.com') link.text = '愿望单助手'; button.appendChild(link); nav.appendChild(button); var i = setInterval(() => { var tips = document.getElementById('own_after').children[0]; if (tips.textContent.indexOf("成功读取") != -1) { clearInterval(i); wishstr = window.localStorage.getItem('wish'); GM_setValue('wish', wishstr); link.text = '同步完毕,点此返回SWH'; } }, 1000); } else { wishstr = GM_getValue('wish'); if (!wishstr) { wishstr = '[]' } wishlist = JSON.parse(wishstr); infodict = GM_getValue('infodict'); if (!infodict) { infodict = {}; } document.getElementById('install').remove(); document.getElementById('noserver').remove(); var sbox = document.getElementById('server'); var opt; for (var key in serverdic) { opt = document.createElement('option'); opt.value = key; opt.text = serverdic[key][0]; sbox.appendChild(opt); } var bts = document.getElementById('buttons'); var btn; btn = document.createElement('button'); btn.type = 'button'; btn.className = 'layui-btn layui-btn-sm layui-btn-normal'; btn.textContent = '查看帮助'; btn.addEventListener('click', showHelp, false); bts.appendChild(btn); btn = document.createElement('button'); btn.type = 'button'; btn.className = 'layui-btn layui-btn-sm '; btn.textContent = '更新愿望单'; btn.addEventListener('click', updateWishlist, false); bts.appendChild(btn); btn = document.createElement('button'); btn.type = 'button'; btn.className = 'layui-btn layui-btn-sm layui-btn-danger'; btn.textContent = '生成表格'; btn.addEventListener('click', flashLocalData, false); bts.appendChild(btn); if (infodict) { renderTable(); var k, t = 0; for (k in infodict) { t++; } document.getElementById('status').textContent = '已显示' + t.toString() + '条缓存数据' } else if (wishlist) { document.getElementById('status').textContent = '检测到愿望单信息,请点【生成表格】开始获取数据' } else { document.getElementById('status').textContent = '未检测到愿望单数据,请点【更新愿望单】获取数据' } } function showHelp() { layui.use('layer', function () { var layer = layui.layer; layer.open({ title: '帮助' , content: '使用方法:</br>1.先点【更新愿望单】获取愿望单数据</br>2.然后点【生成表格】,数据会保存在本地,刷新后不会丢失.' }); }); } function updateWishlist() { function goToKeylol() { window.location.href = 'https://steamdb.keylol.com/sync' } layui.use('layer', function () { layer.msg('即将前往Keylol,同步完成后刷新本页即可生效.'); }); setTimeout(goToKeylol, 2000); } function getSelectServer() { var choose = document.getElementById('server').value; for (var key in serverdic) { if (choose == key) { server = 'https://' + serverdic[key][1]; } } } function flashLocalData() { getSelectServer(); var process = document.getElementById('process'); var status = document.getElementById('status'); var count = 0; var total = wishlist.length; var tmp; tmp = setInterval( function () { getFromRemote(wishlist[count]); } , 500) while (count >= total) { clearInterval(tmp); } function getFromRemote(appid) { try { GM_xmlhttpRequest({ method: "GET", headers: { "User-Agent": "SWH_Helper 1.0", "Accept": "application/json" }, url: server + '/games/' + appid.toString(), onload: function (response) { count++; status.textContent = '进度:' + count.toString() + '/' + total.toString() + ',刷新即可终止操作(已有数据会保留)'; process.style.width = getPercent(count, total) if (response.status == 200) { var t = JSON.parse(response.responseText); t["lowest"] = t["pcurrent"] <= t["plowest"]; infodict[appid] = t; GM_setValue('infodict', infodict); renderTable(); } else { console.log('未查到信息,appid:', appid); } if (count >= total) { console.log('处理完毕'); } } }); } catch (e) { console.log(e); } } } function cardb2s(b) { return b["card"] ? "√" : "" } function limitb2s(b) { return b["limit"] ? "√" : "" } function adultb2s(b) { return b["adult"] ? "√" : "" } function freeb2s(b) { return b["free"] ? "√" : "" } function releaseb2s(b) { return b["release"] ? "√" : "" } function lowestb2s(b) { return b["lowest"] ? "√" : "" } function genLink(b) { var id = b["appid"].toString() return '<a style="color: #01AAED;" href=https://store.steampowered.com/app/' + id + '>' + id + '</a>' } function genPicLink(b) { var id = b["appid"].toString() return '<a style="color: #01AAED;" href=https://store.steampowered.com/app/' + id + '>' + '<img style="height:100%" src="https://steamcdn-a.akamaihd.net/steam/apps/' + id + '/capsule_sm_120.jpg"></a>' } function treleaset2s(b) { if (!b['trelease']) { return '-' } var date = new Date(b['trelease'] * 1000); return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString() } function tlowestt2s(b) { if (!b['tlowest']) { return '-' } var date = new Date(b['tlowest'] * 1000); return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString() } function tmodifyt2s(b) { if (!b['tmodify']) { return '-' } var date = new Date(b['tmodify'] * 1000); return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString() } function review2text(b) { return review[b["rscore"]]; } function rpercent2p(b) { return b["rpercent"].toString() + '%'; } function pcut2p(b) { return b["pcut"].toString() + '%'; } function plowestcut2p(b) { return b["plowestcut"].toString() + '%'; } function renderTable() { var data = []; for (var key in infodict) { data.push(infodict[key]); } layui.use('table', function () { var table = layui.table; table.render({ elem: '#test' , cols: [[ { field: 'appid', title: 'APPID', width: 100, sort: true, fixed: 'left', align: "center", templet: genLink } , { field: 'pic', title: '预览图', width: 110, align: "center", templet: genPicLink } , { field: 'name_cn', title: '名称', width: 200, sort: true, align: "center" } , { field: 'card', title: '卡牌', minWidth: 50, sort: true, align: "center", templet: cardb2s } , { field: 'limit', title: '受限', minWidth: 50, sort: true, align: "center", templet: limitb2s } , { field: 'adult', title: '软锁', width: 50, sort: true, align: "center", templet: adultb2s } , { field: 'free', title: '免费', width: 50, sort: true, align: "center", templet: freeb2s } , { field: 'release', title: '发售', width: 50, sort: true, align: "center", templet: releaseb2s } , { field: 'lowest', title: '史低', width: 50, sort: true, align: "center", templet: lowestb2s } , { field: 'rscore', title: '评测结果', width: 120, sort: true, align: "center", templet: review2text } , { field: 'rtotal', title: '总评', width: 80, sort: true, align: "center" } , { field: 'rpercent', title: '好评', width: 80, sort: true, align: "center", templet: rpercent2p } , { field: 'pcurrent', title: '现价', width: 80, sort: true, align: "center" } , { field: 'porigin', title: '原价', width: 80, sort: true, align: "center" } , { field: 'plowest', title: '史低价', width: 100, sort: true, align: "center" } , { field: 'pcut', title: '当前折扣', width: 100, sort: true, align: "center", templet: pcut2p } , { field: 'plowestcut', title: '史低折扣', width: 100, sort: true, align: "center", templet: plowestcut2p } , { field: 'tag', title: '标签', width: 150, align: "center" } , { field: 'developer', title: '开发商', width: 150, align: "center" } , { field: 'publisher', title: '发行商', width: 150, align: "center" } , { field: 'tlowest', title: '史低时间', width: 105, sort: true, align: "center", templet: tlowestt2s } , { field: 'trelease', title: '发售时间', width: 105, sort: true, align: "center", templet: treleaset2s } , { field: 'tmodify', title: '更新时间', width: 105, sort: true, align: "center", templet: tmodifyt2s } , { field: 'gtype', title: '类型', width: 50, sort: true, align: "center" } , { field: 'source', title: '来源', width: 50, sort: true, align: "center" } ]] , data: data , skin: 'row' //表格风格 , even: true , page: true //是否显示分页 , limits: [30, 60, 100, 150, 300, 600, 1000, 1500, 2000] , limit: 100 , cellMinWidth: 80 , height: 'full-215' }); }); } function getPercent(num, total) { num = parseFloat(num); total = parseFloat(total); if (isNaN(num) || isNaN(total)) { return "0%"; } return total <= 0 ? "0%" : (Math.round(num / total * 100)) + "%"; } })();