Protogalaxy

Planet #0

csgo.exchange磨损查询插件开发日志

Github:https://github.com/SolitudeRA/CSGO.exchange-Autoretrieve

最近csgo.exchange这网站对皮肤磨损查询做了点改动,新皮肤的磨损度查询需要用户手动完成,高校群里的大商觉得这样的操作很费时间,所以联系我做了个自动点击插件。经过了一个多星期的研究,终于是将主体完成了七七八八,能够基本运行了。在这里不得不吐槽一下这网站的服务器质量,真的是有点差,脚本的运行速度一快起来,立马就没法响应然后卡死了,所以只能被迫放慢脚本速度。

在开发的过程中,由于网站的响应速度有限,所以使用了各种被动监听器,比如MutationObserver对象,参考MDN,该对象的使用方法如下:

// Firefox和Chrome早期版本中带有前缀
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver

// 选择目标节点
var target = document.querySelector('#some-id');
 
// 创建观察者对象
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });    
});
 
// 配置观察选项:
var config = { attributes: true, childList: true, characterData: true }
 
// 传入目标节点和观察选项
observer.observe(target, config);
 
// 随后,你还可以停止观察
observer.disconnect();

该脚本以Chrome插件的形式运行,其中还运用到了Notification Web API,该API实现了在各个浏览器平台调用提示功能,在Chrome上该API以右下角弹窗的形式出现,具体代码如下:

function controller(Node, reloadFlag) {
  if (Node.next().hasClass("vItem")) {
    clickLogic(Node.next());
  } else {
    if (reloadFlag === true && Number(sessionStorage.AutoclickRefreshCount) < 4) {
      sessionStorage.AutoclickRefreshCount = Number(sessionStorage.AutoclickRefreshCount) + 1;
      location.reload(true);
    } else {
      if (finishedFlag) {
      } else {
        onceFlag = false;
        Notification.requestPermission(function () {
          var n = new Notification("Task Finished");
        });
      }
    }
  }
}

在具体的使用过程中,由于网站服务器性能有限,在实际运行过程中,还是有部分皮肤会出现查询后无效的问题,所以在查询过程中需要多次刷新页面,在页面刷新的过程中还需要用到存储于页面之外的计数器,经过一番研究,这个功能用到了HTML5的新特性——Web存储,原理是以Session生命周期为单位创建本地数据存储,相关代码片段如下:

$(document).ready(function () {
  if (sessionStorage.AutoclickRefreshCount && Number(sessionStorage.AutoclickRefreshCount) > 0) {
    if (Number(sessionStorage.AutoclickRefreshCount) < 4) {
      var handler = window.setInterval(function () {
        if ($(".statsInv").text() !== "") {
          var Node = $(".vItem.Normal.cItem:first");
          window.clearInterval(handler);
          clickLogic(Node);
        }
      }, 50);
    } else {
      var handler = window.setInterval(function () {
        if ($(".statsInv").text() !== "") {
          finishedFlag = true;
          Notification.requestPermission(function () {
            var n = new Notification("Task Finished");
          });
          var Node = $(".vItem.Normal.cItem:first");
          window.clearInterval(handler);
          clickLogic(Node);
        }
      }, 50);
    }
  } else {
    sessionStorage.AutoclickRefreshCount = 0;
  }
});

已知的问题如下:

  1. 脚本运行一次后,有些数据并没有被查询
  2. 脚本运行完毕后,有些皮肤的磨损数据已被查询但是无法被显示,需要再一次查询

这些BUG会在以后的更新中慢慢修复,以上。

发表评论