youwh 发表于 2023-11-12 13:00:22

一次失败的研究

一篇帖子不仅可以记录成功,也可以记录失败,所有花费过时间的事情都是值得被记录的。
### 起因

一之必应积分的脚本最近运提示`必应每日签到错误, 请手动检查积分或者重新执行`,早上起来在调试了一下其实逻辑并不难,难得是发现问题出在哪里。
这里简单说一下脚本的逻辑,先获取用户任务信息判断是否达标,没有达标就网络请求获取百度热点关键字再发送请求来完成任务,功能不复杂但需要耐心找接口数据,还有同步执行代码流程,这个脚本是一个相当不错的例子。

### 发现的问题

一开始以为接口的数据格式发生了变化,所以导致代码执行结果异常,后来通过打印请求会来的数据,发现所有请求都是成功的,请求后的数据可以正常解析和使用,仅仅是微软后台不认可之前简单的请求操作,所以没算做是完成了搜索任务,而手动搜索的方式积分是会正常增加的,很明显就是后台加强了积分的认证方式。


## 调试代码的收获

1. 强化了对ScriptCat脚本的了解,原来后台脚本和定时脚本是通过返回一个promise对象作为脚本的入口,之前还在想怎么突然就用到return关键字了,也没有发现有那个函数包裹return的内容。
2. js实现同步操作的代码技巧,关键字 `async` 和`await` ,两个关键字在同一个函数的申明处和里面函数调用处。
3. web上可以通过ua识别网络请求设备的型号的,当然这也是可以伪造的。
4. 加深了GM_xmlhttpRequest的理解,以前只是了解它是用来发起网络请求的,但是里面的一些参数都没详细了解,用的时候再查一下也行但终究不熟练。

## 修复想法
既然需要手动搜索才能完成任务,那就模拟手动填写和触发,先说结果没有成功,以目前技术水平还没能力实现,只是通过获取input标签赋值,但是模拟键盘上enter事件的触发没有成功,这里有一个抗后面再说。
通过gpt找到了触发enter事件的代码,在控制台调试没有成功,直接上脚本调试也没有成功。
```js
// 创建一个键盘事件
var event = new KeyboardEvent('keydown', {
    key: 'Enter',
    code: 'Enter',
    charCode: 13,
    keyCode: 13,
    which: 13
});
// 触发该事件
document.dispatchEvent(event);
```
自己也摸索到了一些东西,在浏览器的`源代码`区可以调试js代码,右侧断点下面有`作用域``调用堆栈`还有我想要的`事件侦听器断点`,这里面可以给键盘的监听自动下断点找到enter触发的函数,后面的部分还是不太会实现。

### 上面说的坑
1. 存在死循环,想通过匹配`https://cn.bing.com/search?q=*`模拟手动点击enter打开新的检索网页,但新的网页还是会触发脚本的运行,但也应该有办法控制的。
2. 还可以通过 `window.location.href` 来实现,控制的方法可以通过`GM_getValue` `GM_setValue`,目前没有尝试,因为今天的PC检索任务手动搞完了。
3. 暂时还没有很好的完成必应手机端任务的想法,每天少了60积分想想也心痛,如果可以找到微软后台判断的机制应该可以更好实现自动。

代码还是要自己写一遍,仅仅分析别人的代码还是会有疏漏之处。

王一之 发表于 2023-11-12 16:34:22

ggnb,可以的

手机端的话,之前是看UserAgent来的,现在不知道怎么样

ray040237 发表于 2023-11-12 19:53:44

ggnb!!!!!

youwh 发表于 2023-11-12 21:58:30

ray040237 发表于 2023-11-12 19:53
ggnb!!!!!

谢谢哥哥

王一之 发表于 2023-11-13 10:34:47

已更新

youwh 发表于 2023-11-13 21:27:34

王一之 发表于 2023-11-13 10:34
已更新

从哥哥的代码中学到了没有一个参数是无用的

王一之 发表于 2023-11-14 09:39:30

youwh 发表于 2023-11-13 21:27
从哥哥的代码中学到了没有一个参数是无用的

本来有个id的参数的,但是不是很好解(虽然解出来了,代码不好写),不加也能用就没加了
页: [1]
查看完整版本: 一次失败的研究