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; } });
已知的问题如下:
- 脚本运行一次后,有些数据并没有被查询
- 脚本运行完毕后,有些皮肤的磨损数据已被查询但是无法被显示,需要再一次查询
这些BUG会在以后的更新中慢慢修复,以上。