SWH_Helper

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

目前为 2020-12-23 提交的版本。查看 最新版本

// ==UserScript==
// @name         SWH_Helper
// @namespace    https://blog.chrxw.com
// @version      1.32
// @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();
      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) {
    return '<a style="color: #01AAED;" href=https://store.steampowered.com/app/' + b["appid"].toString() + '>' + b["appid"].toString() + '</a>'
  }
  function treleaset2s(b) {
    var date = new Date(b['trelease'] * 1000);
    return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString()
  }
  function tlowestt2s(b) {
    var date = new Date(b['tlowest'] * 1000);
    return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString()
  }
  function tmodifyt2s(b) {
    var date = new Date(b['tmodify'] * 1000);
    return date.getFullYear().toString() + '-' + (date.getMonth() + 1).toString() + '-' + date.getDate().toString()
  }
  function review2text(b) {
    var score = b["rscore"];
    if (score > 9) { score = 9; }
    if (score < 0) { score = 0; }
    return review[b["rscore"]];
  }

  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: 'ID', width: 100, sort: true, fixed: 'left', align: "center", templet: genLink }
          , { 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" }

          , { 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" }
          , { field: 'plowestcut', title: '史低折扣', width: 100, sort: true, align: "center" }

          , { 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: 120, sort: true, align: "center", templet: tlowestt2s }
          , { field: 'trelease', title: '发售时间', width: 120, sort: true, align: "center", templet: treleaset2s }
          , { field: 'tmodify', title: '更新时间', width: 120, 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: [15, 30, 60, 100, 150, 300, 600, 1000]
        , limit: 60
        , cellMinWidth: 60
        , 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)) + "%";
  }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址