SWH_Helper

从steamdb.keylol.com获取愿望单数据

当前为 2020-12-23 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name SWH_Helper
  3. // @namespace https://blog.chrxw.com
  4. // @version 1.3
  5. // @description 从steamdb.keylol.com获取愿望单数据
  6. // @author Chr_
  7. // @match https://swh.chrxw.com/
  8. // @match http://localhost/
  9. // @match https://steamdb.keylol.com/*
  10. // @connect steamdb.keylol.com
  11. // @connect swh.chrxw.com
  12. // @connect swh.chrxw.cn
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // @grant GM_xmlhttpRequest
  16. // ==/UserScript==
  17.  
  18. (function () {
  19. 'use strict';
  20. var serverdic = {
  21. 'ali': ["阿里云1", "swh.chrxw.cn:20443"],
  22. 'ali2': ["阿里云2", "swh2.chrxw.cn:20443"],
  23. }
  24. var review = ['评测不足', '差评如潮', '特别差评', '差评', '多半差评', '褒贬不一', '多半好评', '好评', '特别好评', '好评如潮', '好评如潮'];
  25. var infodict;
  26. var wishlist;
  27. var wishstr;
  28. var server;
  29. var tmp;
  30.  
  31. if (window.location.host == 'steamdb.keylol.com') {
  32. wishstr = window.localStorage.getItem('wish');
  33. GM_setValue('wish', wishstr);
  34. var nav = document.getElementsByClassName('nav')[0];
  35. var button = document.createElement('li');
  36. button.setAttribute('class', 'nav-swh');
  37. button.setAttribute('class', 'nav-swh');
  38. var link = document.createElement('a');
  39. link.setAttribute('href', 'https://swh.chrxw.com')
  40. link.text = '愿望单助手';
  41. button.appendChild(link);
  42. nav.appendChild(button);
  43.  
  44. var i = setInterval(() => {
  45. var tips = document.getElementById('own_after').children[0];
  46. if (tips.textContent.indexOf("成功读取") != -1) {
  47. clearInterval(i);
  48. tips = document.getElementById('lastSync');
  49. tips.textContent = '愿望单同步完毕,点此返回SWH';
  50. tips.addEventListener('click', function () {
  51. window.location.href = 'https://swh.chrxw.com'
  52. }, false);
  53.  
  54. }
  55. }, 1000);
  56.  
  57. } else {
  58. wishstr = GM_getValue('wish');
  59. if (!wishstr) {
  60. wishstr = '[]'
  61. }
  62. wishlist = JSON.parse(wishstr);
  63. infodict = GM_getValue('infodict');
  64. if (!infodict) {
  65. infodict = {};
  66. }
  67. document.getElementById('install').remove();
  68. document.getElementById('noserver').remove();
  69. var sbox = document.getElementById('server');
  70. var opt;
  71. for (var key in serverdic) {
  72. opt = document.createElement('option');
  73. opt.value = key;
  74. opt.text = serverdic[key][0];
  75. sbox.appendChild(opt);
  76. }
  77. var bts = document.getElementById('buttons');
  78. var btn;
  79. btn = document.createElement('button');
  80. btn.type = 'button';
  81. btn.className = 'layui-btn layui-btn-sm layui-btn-normal';
  82. btn.textContent = '查看帮助';
  83. btn.addEventListener('click', showHelp, false);
  84. bts.appendChild(btn);
  85. btn = document.createElement('button');
  86. btn.type = 'button';
  87. btn.className = 'layui-btn layui-btn-sm ';
  88. btn.textContent = '更新愿望单';
  89. btn.addEventListener('click', updateWishlist, false);
  90. bts.appendChild(btn);
  91. btn = document.createElement('button');
  92. btn.type = 'button';
  93. btn.className = 'layui-btn layui-btn-sm layui-btn-danger';
  94. btn.textContent = '生成表格';
  95. btn.addEventListener('click', flashLocalData, false);
  96. bts.appendChild(btn);
  97. if (infodict) {
  98. renderTable();
  99. document.getElementById('status').textContent = '已显示缓存数据'
  100. }
  101. }
  102.  
  103. function showHelp() {
  104. layui.use('layer', function () {
  105. var layer = layui.layer;
  106. layer.open({
  107. title: '帮助'
  108. , content: '使用方法:</br>1.先点【更新愿望单】获取愿望单数据</br>2.然后点【生成表格】,数据会保存在本地,刷新后不会丢失.'
  109. });
  110. });
  111. }
  112.  
  113. function updateWishlist() {
  114. function goToKeylol() {
  115. window.location.href = 'https://steamdb.keylol.com/sync'
  116. }
  117. layui.use('layer', function () {
  118. layer.msg('即将前往Keylol,同步完成后刷新本页即可生效.');
  119. });
  120. setTimeout(goToKeylol, 2000);
  121. }
  122.  
  123. function getSelectServer() {
  124. var choose = document.getElementById('server').value;
  125. for (var key in serverdic) {
  126. if (choose == key) {
  127. server = 'https://' + serverdic[key][1];
  128. }
  129. }
  130. }
  131.  
  132. function flashLocalData() {
  133. getSelectServer();
  134. var process = document.getElementById('process');
  135. var status = document.getElementById('status');
  136. var count = 0;
  137. var total = wishlist.length;
  138. var tmp;
  139.  
  140. tmp = setInterval(
  141. function () {
  142. getFromRemote(wishlist[count]);
  143. }
  144. , 500)
  145.  
  146. while (count >= total) {
  147. clearInterval(tmp);
  148. }
  149.  
  150. function getFromRemote(appid) {
  151. try {
  152. GM_xmlhttpRequest({
  153. method: "GET",
  154. headers: {
  155. "User-Agent": "SWH_Helper 1.0",
  156. "Accept": "application/json"
  157. },
  158. url: server + '/games/' + appid.toString(),
  159. onload: function (response) {
  160. count++;
  161. status.textContent = '进度:' + count.toString() + '/' + total.toString() + ',刷新即可终止操作(已有数据会保留)';
  162. process.style.width = getPercent(count, total)
  163. if (response.status == 200) {
  164. var t = JSON.parse(response.responseText);
  165. t["lowest"] = t["pcurrent"] <= t["plowest"];
  166. infodict[appid] = t;
  167. GM_setValue('infodict', infodict);
  168. renderTable();
  169. } else {
  170. console.log('未查到信息,appid:', appid);
  171. }
  172. if (count >= total) {
  173. console.log('处理完毕');
  174. }
  175. }
  176. });
  177. } catch (e) {
  178. console.log(e);
  179. }
  180. }
  181.  
  182. }
  183.  
  184. function cardb2s(b) {
  185. return b["card"] ? "√" : ""
  186. }
  187. function limitb2s(b) {
  188. return b["limit"] ? "√" : ""
  189. }
  190. function adultb2s(b) {
  191. return b["adult"] ? "√" : ""
  192. }
  193. function freeb2s(b) {
  194. return b["free"] ? "√" : ""
  195. }
  196. function releaseb2s(b) {
  197. return b["release"] ? "√" : ""
  198. }
  199. function lowestb2s(b) {
  200. return b["lowest"] ? "√" : ""
  201. }
  202. function genLink(b) {
  203. return '<a style="color: #01AAED;" href=https://store.steampowered.com/app/' + b["appid"].toString() + '>' + b["appid"].toString() + '</a>'
  204. }
  205. function treleaset2s(b) {
  206. var date = new Date(b['trelease'] * 1000);
  207. return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString()
  208. }
  209. function tlowestt2s(b) {
  210. var date = new Date(b['tlowest'] * 1000);
  211. return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString()
  212. }
  213. function tmodifyt2s(b) {
  214. var date = new Date(b['tmodify'] * 1000);
  215. return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString()
  216. }
  217. function review2text(b) {
  218. var score = b["rscore"];
  219. if (score > 9) { score = 9; }
  220. if (score < 0) { score = 0; }
  221. return review[b["rscore"]];
  222. }
  223.  
  224. function renderTable() {
  225. var data = [];
  226. for (var key in infodict) {
  227. data.push(infodict[key]);
  228. }
  229. layui.use('table', function () {
  230. var table = layui.table;
  231. table.render({
  232. elem: '#test'
  233. , cols: [[
  234. { field: 'appid', title: 'ID', width: 100, sort: true, fixed: 'left', align: "center", templet: genLink }
  235. , { field: 'name_cn', title: '名称', width: 200, sort: true, align: "center" }
  236. , { field: 'card', title: '卡牌', minWidth: 50, sort: true, align: "center", templet: cardb2s }
  237. , { field: 'limit', title: '受限', minWidth: 50, sort: true, align: "center", templet: limitb2s }
  238. , { field: 'adult', title: '软锁', width: 50, sort: true, align: "center", templet: adultb2s }
  239. , { field: 'free', title: '免费', width: 50, sort: true, align: "center", templet: freeb2s }
  240. , { field: 'release', title: '发售', width: 50, sort: true, align: "center", templet: releaseb2s }
  241. , { field: 'lowest', title: '史低', width: 50, sort: true, align: "center", templet: lowestb2s }
  242.  
  243. , { field: 'rscore', title: '评价', width: 120, sort: true, align: "center", templet: review2text }
  244. , { field: 'rtotal', title: '总评', width: 80, sort: true, align: "center" }
  245. , { field: 'rpercent', title: '好评', width: 80, sort: true, align: "center" }
  246.  
  247. , { field: 'pcurrent', title: '现价', width: 80, sort: true, align: "center" }
  248. , { field: 'porigin', title: '原价', width: 80, sort: true, align: "center" }
  249. , { field: 'plowest', title: '史低价', width: 100, sort: true, align: "center" }
  250. , { field: 'pcut', title: '当前折扣', width: 100, sort: true, align: "center" }
  251. , { field: 'plowestcut', title: '史低折扣', width: 100, sort: true, align: "center" }
  252.  
  253. , { field: 'tag', title: '标签', width: 150, align: "center" }
  254. , { field: 'developer', title: '开发商', width: 150, align: "center" }
  255. , { field: 'publisher', title: '发行商', width: 150, align: "center" }
  256.  
  257. , { field: 'tlowest', title: '史低时间', width: 120, sort: true, align: "center", templet: tlowestt2s }
  258. , { field: 'trelease', title: '发售时间', width: 120, sort: true, align: "center", templet: treleaset2s }
  259. , { field: 'tmodify', title: '更新时间', width: 120, sort: true, align: "center", templet: tmodifyt2s }
  260.  
  261. , { field: 'gtype', title: '类型', width: 50, sort: true, align: "center" }
  262. , { field: 'source', title: '来源', width: 50, sort: true, align: "center" }
  263. ]]
  264. , data: data
  265. , skin: 'row' //表格风格
  266. , even: true
  267. , page: true //是否显示分页
  268. , limits: [15, 30, 60, 100, 150, 300, 600, 1000]
  269. , limit: 60
  270. , cellMinWidth: 60
  271. , height: 'full-215'
  272. });
  273. });
  274. }
  275. function getPercent(num, total) {
  276. num = parseFloat(num);
  277. total = parseFloat(total);
  278. if (isNaN(num) || isNaN(total)) {
  279. return "0%";
  280. }
  281. return total <= 0 ? "0%" : (Math.round(num / total * 100)) + "%";
  282. }
  283. })();