历经艰难险阻,我搞定了自动修改路由器 WIFI 密码( 四 )


历经艰难险阻,我搞定了自动修改路由器 WIFI 密码

文章插图
 
 
禁止页面重新加载为什么要禁止页面重新加载,刚才也说了,就是防止因页面重启加载而导致程序重头再跑一遍 。
但是,我想你会说,不重启 WIFI 密码就无法生效啊 。
其实事实并不完全是这样的,事实真相是,路由器的确要重启才能生效,与此同时页面会重新加载 。
而我们希望的是路由器可以重启,但并不希望页面重新加载或刷新 。
怎么办?
 
方法可能有很多种,只不过我是菜鸟小白,我实在找不出其他高明一些的办法 。
最后,我只能通过点击其他菜单项来跳转到其他页面,从而通过这样一种看似蠢笨的方式变相地改变触发重启倒计时 。
比如在重启倒计时时,点击一下修改密码的菜单项,回到密码修改页面 。
测试的结果是,这样做还真的可行!
// 跳转到其他页面,以防重启而导致刷新页面重新加载JSparent.frames.bottomLeftFrame.document.getElementById('a9').click(); 
这下好了,只要页面不重新加载刷新,程序就不会被初始化,我们也就不用担心它无脑式地重复执行了 。
不过,这样就算完了吗?
 
生成 WIFI 密码的算法我们修改 WIFI 密码的最初目的是防止他人蹭网,但至少我们自己应该能用啊 。
所以我们必须要有一套别人无法识别,但自己却门儿清的密码算法 。
当然这种算法可以复杂也可以简单 。
举例,我将日期作为密码,比如今天是 2021年06月01日 ,那么密码就是 20210601  。
到了第二天,那么密码自动修改为 20210602 ,以此类推 。
所以就很简单了,只要程序能获取到当前的日期即可 。
 
可是还有一个问题,就是程序什么时候修改密码 。
总不能一会儿就改一次,路由器可是要重启生效的 。
所以必须要有一个判断,即当天只能修改一次 。
基于以上,我们可以得出结论,程序每间隔一定的时间循环判断,当日期变动时,自动修改密码并重启生效 。
好了,另一个问题也就随之而来,程序如何判定日期已经变动了?
 
通常做法是设定一个变量,这个变量存放了当前日期 。
等到了第二天,与这个变量对比,就修改密码同时将新的日期放到这个变量中,以备后面再行判断 。
想法是不错,可是油猴脚本并不提供数据持久化功能 。
就是说,我想将某些信息保存到本地文件中,但这实现不了 。
所以说,只能是一次程序跑到底,让这个变量永远保存到内存中不丢弃 。
这也是前面不让页面重新加载的另一个原因 。
 
完整代码示例有了算法,再加上前面杂七杂八的条件,终于第一版的代码形成了 。
 
// ==UserScript==// TP-Link 路由器 型号 TL-WR880N 测试通过// @name定时修改路由器 WIFI 密码// @namespacehttp://tampermonkey.net/// @version0.1// @description网管小贾的博客 / www.sysadm.cc// @author@网管小贾// @matchhttp://192.168.1.1/// @iconhttps://www.google.com/s2/favicons?domain=15.213// @grantnone// ==/UserScript==(function() {'use strict';// Your code here...//页面完全加载后运行 window.onload=function autorun() {console.log('页面加载完毕,可以执行代码!!');Date.prototype.Format = function (fmt) {let o = {"M+": this.getMonth() + 1, //月份"d+": this.getDate(), //日"h+": this.getHours(), //小时"m+": this.getMinutes(), //分"s+": this.getSeconds(), //秒"q+": Math.floor((this.getMonth() + 3) / 3), //季度"S": this.getMilliseconds() //毫秒};if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));for (let k in o) {if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));}return fmt;};var currentDate = (new Date()).Format("yyyyMMdd");var checkDate = '';function changeWifi() {currentDate = (new Date()).Format("yyyyMMdd");if (currentDate != checkDate) {console.log('Different! - currentDate: ' + currentDate + ' | checkDate: ' + checkDate);setTimeout(function() {try {// 登录document.getElementById('pcPassword').value = https://www.isolves.com/it/wl/sz/2022-01-14/'123456';document.getElementById('loginBtn').click();}catch (e) {}setTimeout(function() {try {// 跳转至修改 WIFI 密码页面parent.frames.bottomLeftFrame.document.getElementById('a9').click();currentDate = (new Date()).Format("yyyyMMdd");setTimeout(function() {try {// 避免重复修改if (parent.frames.mainFrame.document.getElementById('pskSecret').value != 'Sysadm' + currentDate) {// 修改 WIFI 密码parent.frames.mainFrame.document.getElementById('pskSecret').value = 'Sysadm' + currentDate;// 保存parent.frames.mainFrame.document.getElementById('Save').click();setTimeout(function() {try {// 跳转至重启页面parent.frames.bottomLeftFrame.document.getElementById('a44').click();setTimeout(function() {try {// 修改重启提示为 trueparent.frames.mainFrame.document.getElementsByTagName("form")[0].onsubmit = true;// 确认重启parent.frames.mainFrame.document.getElementById('reboot').click();setTimeout(function() {// 跳转到其他页面,以防真的重启而导致刷新页面重新加载JSparent.frames.bottomLeftFrame.document.getElementById('a9').click();checkDate = currentDate;}, 1000);}catch (e) {checkDate = '';}}, 1000);}catch (e) {checkDate = '';}}, 1000);}}catch (e) {checkDate = '';}}, 1000);}catch (e) {checkDate = '';}}, 1000);}, 2000);} else {console.log('Same! - currentDate: ' + currentDate + ' | checkDate: ' + checkDate);}}var myVar;myVar = setInterval(changeWifi, 1 * 10 * 1000);// console.log(myVar); }})();


推荐阅读