一篇帖子不仅可以记录成功,也可以记录失败,所有花费过时间的事情都是值得被记录的。
起因
一之必应积分的脚本最近运提示必应每日签到错误, 请手动检查积分或者重新执行
,早上起来在调试了一下其实逻辑并不难,难得是发现问题出在哪里。
这里简单说一下脚本的逻辑,先获取用户任务信息判断是否达标,没有达标就网络请求获取百度热点关键字再发送请求来完成任务,功能不复杂但需要耐心找接口数据,还有同步执行代码流程,这个脚本是一个相当不错的例子。
发现的问题
一开始以为接口的数据格式发生了变化,所以导致代码执行结果异常,后来通过打印请求会来的数据,发现所有请求都是成功的,请求后的数据可以正常解析和使用,仅仅是微软后台不认可之前简单的请求操作,所以没算做是完成了搜索任务,而手动搜索的方式积分是会正常增加的,很明显就是后台加强了积分的认证方式。
调试代码的收获
- 强化了对ScriptCat脚本的了解,原来后台脚本和定时脚本是通过返回一个promise对象作为脚本的入口,之前还在想怎么突然就用到return关键字了,也没有发现有那个函数包裹return的内容。
- js实现同步操作的代码技巧,关键字
async
和await
,两个关键字在同一个函数的申明处和里面函数调用处。
- web上可以通过ua识别网络请求设备的型号的,当然这也是可以伪造的。
- 加深了GM_xmlhttpRequest的理解,以前只是了解它是用来发起网络请求的,但是里面的一些参数都没详细了解,用的时候再查一下也行但终究不熟练。
修复想法
既然需要手动搜索才能完成任务,那就模拟手动填写和触发,先说结果没有成功,以目前技术水平还没能力实现,只是通过获取input标签赋值,但是模拟键盘上enter事件的触发没有成功,这里有一个抗后面再说。
通过gpt找到了触发enter事件的代码,在控制台调试没有成功,直接上脚本调试也没有成功。
// 创建一个键盘事件
var event = new KeyboardEvent('keydown', {
key: 'Enter',
code: 'Enter',
charCode: 13,
keyCode: 13,
which: 13
});
// 触发该事件
document.dispatchEvent(event);
自己也摸索到了一些东西,在浏览器的源代码
区可以调试js代码,右侧断点下面有作用域``调用堆栈
还有我想要的事件侦听器断点
,这里面可以给键盘的监听自动下断点找到enter触发的函数,后面的部分还是不太会实现。
上面说的坑
- 存在死循环,想通过匹配
https://cn.bing.com/search?q=*
模拟手动点击enter打开新的检索网页,但新的网页还是会触发脚本的运行,但也应该有办法控制的。
- 还可以通过
window.location.href
来实现,控制的方法可以通过GM_getValue
GM_setValue
,目前没有尝试,因为今天的PC检索任务手动搞完了。
- 暂时还没有很好的完成必应手机端任务的想法,每天少了60积分想想也心痛,如果可以找到微软后台判断的机制应该可以更好实现自动。
代码还是要自己写一遍,仅仅分析别人的代码还是会有疏漏之处。