上一个脚本写完后和朋友交流了一下,他问我:能不能直接调接口去删?
我又扒了下接口,试了两下,发现我删除了4条,但4条的请求完全一样?
又仔细想了一下,豁然开朗:我删除的都是列表中的第一条,当中有一个CurFilterID,每次都传0。
他的机制应该是这样的,这些规则应该就在后台的缓存列表中,没有 uuid,只有列表 id。我只要把对应的列表 id 传过去,然后他在后台删除就行。
那我们的代码也简单了,看一下一共多少条规则,然后重复调用删除第一条就行。
1 window.deleteRuleRC = async () => { 2 haha = window.deleteRuleRC; 3 sendDeleteMessage = () => { 4 return fetch() 5 } 6 sleep = (ms = 1000) => new Promise((resolve, reject) => { 7 const timer = setTimeout(() => { 8 resolve(); 9 clearTimeout(timer); 10 }, ms); 11 }); 12 13 if (document.querySelector('#mainFrame')) { 14 const RCList = document.querySelector('#mainFrame').contentWindow.document.querySelectorAll('.set_table ul li'); 15 if (RCList.length > 1) { 16 for (let i = 1; i < RCList.length; i++) { 17 await sendDeleteMessage(); 18 await sleep(1000); 19 } 20 } 21 } 22 }
这里要说一下,使用这个代码的时候,先要打开 f12,然后点 Network 面板,再手动删除一条,看到一条这样的请求:
这里的第一条就是我们需要的请求,在这条请求上右键,Copy,Copy as fetch。这时候请求的代码已经在剪贴板里,不要再复制其它的内容。
然后我们回到代码中,第4行有句 fetch(),前面的 return 不要动(return 后面还有个空格)。把刚刚复制的代码粘贴上去。
然后就和之前一样:
deleteRuleRC();
回车运行,慢慢欣赏吧!