Greasy Fork镜像 支持简体中文。

百度还在搜

还在搜

  1. // ==UserScript==
  2. // @name 百度还在搜
  3. // @namespace http://blog.sxnxcy.com/
  4. // @version 1.0.7
  5. // @icon https://www.baidu.com/favicon.ico
  6. // @description 还在搜
  7. // @author xiaobao
  8. // @license CC-BY-4.0
  9. // @run-at document-start
  10. // @grant GM_addStyle
  11. // @grant GM_getValue
  12. // @grant GM_deleteValue
  13. // @grant GM_getResourceURL
  14. // @grant GM_openInTab
  15. // @grant GM_xmlhttpRequest
  16. // @grant GM_notification
  17. // @match *://*.baidu.com/*
  18. // @require https://cdn.staticfile.org/jquery/3.7.0/jquery.min.js
  19. // @require https://unpkg.com/layui@2.8.6/dist/layui.js
  20. // @require https://cdn.staticfile.org/xlsx/0.18.5/xlsx.core.min.js
  21.  
  22. // ==/UserScript==
  23.  
  24. (function () {
  25. console.log("脚本注入成功", GM_info.script.version);
  26. GM_addStyle(`@import url('https://unpkg.com/layui@2.8.6/dist/css/layui.css');
  27. .chrome-plugin-demo-panel {
  28. position: fixed;
  29. right: 0;
  30. bottom: 10px;
  31. padding: 10px;
  32. width: 500px;
  33. height: 800px;
  34. margin-right: 30px;
  35. }
  36. #pzdv{
  37. position: fixed;
  38. right: 0;
  39. bottom: 30px;
  40. padding: 40px;
  41. margin-right: 40px;
  42. }
  43. `);
  44. document.addEventListener('DOMContentLoaded', function () {
  45. insertPage();
  46. localStorage.yzm = 1
  47. $("#pzan").click(function () {
  48. layer.open({
  49. type: 1,
  50. title: "还在搜配置",
  51. offset: 'auto',
  52. anim: 'slideLeft', // 从右往左
  53. area: ['650px', '60%'],
  54. shade: 0.1,
  55. shadeClose: false,
  56. id: 'ID-demo-layer-direction-r',
  57. content: nbHtml
  58. });
  59. configurationButtonEvent()
  60. });
  61. })
  62. })();
  63. let nbHtml = `
  64. <div class="layui-field-box">
  65. <div class="layui-row layui-col-space5">
  66. <div class="layui-col-xs4">
  67. <input type="text" id="cj" placeholder="搜索深度" class="layui-input" value="3">
  68. </div>
  69. </div>
  70. <div class="layui-row">
  71. <div class="layui-col-xs12">
  72. <textarea id="gjc" placeholder="请输入关键词" class="layui-textarea"
  73. style="height: 200px;"></textarea>
  74. </div>
  75. </div>
  76. <div class="layui-row">
  77. <hr>
  78. <div class="layui-progress layui-progress-big" lay-showPercent="true" lay-filter="demo-filter-progress">
  79. <div id="jdt" class="layui-progress-bar" lay-percent="0%">
  80. </div>
  81. </div>
  82. </div>
  83. <div class="layui-row layui-col-space5">
  84. <hr>
  85. <button id="saveStart" class="layui-btn layui-btn-primary layui-border-blue">开始</button>
  86. <button id="butTest" class="layui-btn layui-btn-primary layui-border-red">下载结果</button>
  87. </div>
  88. <hr>
  89. <iframe id="nqcs" src="https://www.baidu.com/" frameborder="0" width="100%" height="300"></iframe>
  90. </div>
  91. `;
  92. let zjg = []
  93. let zarr = []
  94. document.addEventListener('DOMContentLoaded', function () {
  95. insertPage();
  96. localStorage.yzm = 1
  97. $("#pzan").click(function () {
  98. layer.open({
  99. type: 1,
  100. title: "还在搜配置",
  101. offset: 'auto',
  102. anim: 'slideLeft', // 从右往左
  103. area: ['650px', '60%'],
  104. shade: 0.1,
  105. shadeClose: false,
  106. id: 'ID-demo-layer-direction-r',
  107. content: nbHtml
  108. });
  109. configurationButtonEvent()
  110. });
  111. })
  112. function sendMessage(title, message) {
  113. GM_notification({
  114. text: message,
  115. title: title,
  116. timeout: 5000, // 通知显示时间,单位为毫秒,默认为 4000 毫秒
  117. onclick: function () {
  118. }
  119. });
  120. }
  121. // 配置按钮事件
  122. function configurationButtonEvent() {
  123. $("#saveStart").click(() => {
  124. setTimeout(function () {
  125. rw($("#gjc").val())
  126. }, 500)
  127. })
  128. $("#butTest").click(function () {
  129. xz();
  130. });
  131. $("#clyzm").click(function () {
  132. localStorage.yzm = "1"
  133. });
  134. $("#copyjg").click(function () {
  135. jgclcopy()
  136. });
  137. }
  138. // 进度条更新
  139. function jdtup(bfb) {
  140. layui.element.progress('demo-filter-progress', bfb + "%")
  141. document.querySelector("#jdt").innerText = bfb + "%"
  142. }
  143.  
  144. function initCustomPanel() {
  145. var panel = document.createElement('div');
  146. panel.className = 'chrome-plugin-demo-panel';
  147. panel.innerHTML = `
  148. <fieldset class="layui-elem-field">
  149. <legend id="mc">时间戳检测配置</legend>
  150. <div class="layui-field-box">
  151. <div class="layui-row layui-col-space5">
  152. <div class="layui-col-xs6">
  153. <input type="text" id="sl" placeholder="输入需要的数量" class="layui-input" value="1">
  154. </div>
  155. <div class="layui-col-xs6">
  156. <input type="text" id="ms" placeholder="增加时间秒数" class="layui-input" value="3600">
  157. </div>
  158. </div>
  159. <div class="layui-row layui-col-space5">
  160. <div class="layui-col-xs12">
  161. <textarea id="gjc" placeholder="请输入关键词" class="layui-textarea"
  162. style="height: 200px;"></textarea>
  163. </div>
  164. </div>
  165. <div class="layui-row layui-col-space5">
  166. <div class="layui-col-xs12">
  167. <textarea id="wz" placeholder="请输入域名或者链接" class="layui-textarea"
  168. style="height: 200px;"></textarea>
  169. </div>
  170. </div>
  171. <div class="layui-row layui-col-space5">
  172. <button id="saveStart" class="layui-btn layui-btn-primary layui-border-blue">开始</button>
  173. <button id="copy" class="layui-btn layui-btn-primary layui-border-green">复制结果</button>
  174. <button id="test" class="layui-btn layui-btn-primary layui-border-red">已处理验证码</button>
  175. </div>
  176. <div class="layui-row layui-col-space5">
  177. <div class="layui-col-xs12">
  178. <textarea id="jg" placeholder="" class="layui-textarea"
  179. style="height: 200px;"></textarea>
  180. </div>
  181. </div>
  182. <div class="layui-row layui-col-space5">
  183. <div id="progress-bar">
  184. <div id="progress"></div>
  185. <div id="progress-text"></div>
  186. </div>
  187. </div>
  188. </div>
  189. </fieldset>
  190. `;
  191. document.body.appendChild(panel);
  192. }
  193. //插入配置按钮页
  194. function insertPage() {
  195. var panel = document.createElement('div');
  196. panel.id = 'pzdv';
  197. let html = `<button id="pzan" type="button" class="layui-btn layui-btn-primary" lay-on="test-offset-r"></button>`
  198. panel.innerHTML = html
  199. document.body.appendChild(panel);
  200. document.querySelector("#pzan").innerText = "开启配置页面 当前版本:" + GM_info.script.version
  201. }
  202. // 任务处理
  203. async function rw(gjc) {
  204. zjg = []
  205. zarr = [["层级", "原关键词", "采集的关键词"]]
  206. sendMessage('还在搜索', '任务开始');
  207. jdtup(0)
  208. let level = Number(document.querySelector("#cj").value)
  209. let gjcsz = gjc.trim().split("\n")
  210. for (let index = 0; index < gjcsz.length; index++) {
  211. console.log("当前执行:" + gjcsz[index]);
  212. levelInit(gjcsz[index], level)
  213. await singleTaskProcessing(gjcsz[index], gjcsz[index], 1, level, "")
  214. jdtup(Math.floor((index + 1) / gjcsz.length * 100))
  215. await delayedAction()
  216. }
  217. sendMessage('还在搜索', '任务完成');
  218. console.log("结果预览:", zjg);
  219. }
  220. // 层级初始化
  221. function levelInit(gjc, level) {
  222. zjg[gjc] = {}
  223. for (let index = 0; index < level; index++) {
  224. zjg[gjc][1 + index] = new Array()
  225. }
  226. }
  227. // 单任务处理
  228. async function singleTaskProcessing(gjc, sgjc, level, levelt, url) {
  229. if (level > levelt) {
  230. return
  231. }
  232. if (url == "") {
  233. url = "https://www.baidu.com/s?wd=" + sgjc
  234. }
  235. let str = await syncGet2(url) //json接口匹配
  236. let parser = new DOMParser();
  237. let doc = parser.parseFromString(str, 'text/html');
  238. let pageArr = doc.querySelectorAll("a.c-gap-top-xsmall.item_3WKCf")
  239. for (let index = 0; index < pageArr.length; index++) {
  240. let a = pageArr[index]
  241. zjg[gjc][level].push(a.innerText)
  242. zarr.push([level, gjc, a.innerText])
  243. console.log(level, gjc, a.innerText, a.href);
  244. await singleTaskProcessing(gjc, a.innerText, level + 1, levelt, a.href)
  245. await delayedAction(150)
  246. }
  247. }
  248. // 延迟
  249. function sleep(ms) {
  250. return new Promise((resolve) => {
  251. setTimeout(resolve, ms);
  252. });
  253. }
  254. function jgclcopy() {
  255. let t = ""
  256. for (let index = 0; index < zarr.length; index++) {
  257. t = t + zarr[index].join("-") + "\n"
  258. }
  259. $("#jg").val(t)
  260. $("#jg").select()
  261. document.execCommand('copy');
  262. $("#jg").blur()
  263. sendMessage('百度搜索', '已复制到剪贴板');
  264. }
  265. //延迟执行
  266. async function delayedAction(s) {
  267. if (s == null | s == undefined) {
  268. s = 1000
  269. }
  270. await sleep(s);
  271. }
  272. async function xz() {
  273. const wb = XLSX.utils.book_new();
  274. const ws = XLSX.utils.aoa_to_sheet(zarr);
  275. XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
  276. const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
  277. const blob = new Blob([wbout], { type: 'application/octet-stream' });
  278. const downloadLink = document.createElement('a');
  279. downloadLink.id = "downloadLink"
  280. downloadLink.href = URL.createObjectURL(blob);
  281. downloadLink.download = 'data.xlsx';
  282. downloadLink.click();
  283. downloadLink.remove()
  284. }
  285. async function syncGet2(url) {
  286. let xhr = null
  287. while (true) {
  288. if (localStorage.yzm == "1") {
  289. xhr = new XMLHttpRequest();
  290. xhr.open('GET', url, false); // 同步请求
  291. xhr.send();
  292. }
  293. if (localStorage.yzm == "1" && xhr && (xhr.responseURL.indexOf("wappass.baidu.com") > -1)) {
  294. localStorage.yzm = "0"
  295. sendMessage("百度搜索", "请手动处理验证码")
  296. document.querySelector("#nqcs").src = xhr.responseURL
  297. } else { //ok
  298. if (xhr && xhr.responseURL.indexOf("wappass.baidu.com") == -1) {
  299. return xhr.responseText
  300. }
  301. }
  302. if (localStorage.yzm == "0") {
  303. console.log("等待验证码处理中...");
  304. await delayedAction(10000)
  305. if (document.querySelector("#nqcs").src.indexOf("wappass.baidu.com") == -1) {
  306. localStorage.yzm = "1"
  307. }
  308. }
  309. }
  310. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址