当前位置: 首页 > article >正文

BOSS直接自动点击未读消息并发送求简历请求

最新版本代码 26-04-23 修复没有对话无法发送求简历按钮(() { /****************************************************************** * 可配置参数 ******************************************************************/ const CONFIG { countdownSeconds: 3, openConfirmDelayMs: 300, requestResultTimeoutMs: 5000, switchConversationDelayMs: 1000, listScrollStep: 700, pollIntervalMs: 200, uniqueNames: false, maxShowNames: 300, enablePeriodicRefresh: true, refreshEveryConversationCount: 40, refreshTabKeyword: 新招呼, refreshAfterClickDelayMs: 800, // 灰色“求简历”但未请求时直接模拟输入的文案 manualUnlockMessageText: 可以发一份简历看看吗, // 模拟发送后先等 1 秒 manualUnlockWaitAfterSendMs: 1000, // 发送后等待“求简历”解锁的最长时间 manualUnlockTimeoutMs: 5000, sameNameLoopLimit: 2 }; /****************************************************************** * 如果旧脚本存在先停掉 ******************************************************************/ if (window.__bossResumeBot typeof window.__bossResumeBot.stop function) { try { window.__bossResumeBot.stop(); } catch (e) {} } /****************************************************************** * 全局状态 ******************************************************************/ const state { running: true, paused: false, stopRequested: false, requestedCount: 0, requestedRecords: [], countdown: 0, status: 初始化中..., phase: idle, currentName: , panel: null, processedConversationCount: 0, lastRefreshAtProcessedCount: 0, lastSwitchedName: , sameNameHitCount: 0 }; class StopError extends Error { constructor(message 脚本已停止) { super(message); this.name StopError; } } /****************************************************************** * 基础工具函数 ******************************************************************/ function sleep(ms) { return new Promise(resolve setTimeout(resolve, ms)); } function textOf(el) { return (el?.textContent || ).replace(/\s/g, ).trim(); } function normalizeText(str) { return String(str ?? ).replace(/\s/g, ).trim(); } function qs(selector, root document) { return root.querySelector(selector); } function qsa(selector, root document) { return [...root.querySelectorAll(selector)]; } function visible(el) { if (!el) return false; const style getComputedStyle(el); const rect el.getBoundingClientRect(); return ( style.display ! none style.visibility ! hidden rect.width 0 rect.height 0 ); } function click(el) { if (!el) return false; el.dispatchEvent( new MouseEvent(click, { bubbles: true, cancelable: true, view: window }) ); return true; } function escapeHtml(str) { return String(str ?? ) .replaceAll(, amp;) .replaceAll(, lt;) .replaceAll(, gt;) .replaceAll(, quot;) .replaceAll(, #39;); } function excelCell(str) { return escapeHtml(String(str ?? )).replace(/\n/g, br); } function nowString() { const d new Date(); const y d.getFullYear(); const m String(d.getMonth() 1).padStart(2, 0); const day String(d.getDate()).padStart(2, 0); const h String(d.getHours()).padStart(2, 0); const min String(d.getMinutes()).padStart(2, 0); const s String(d.getSeconds()).padStart(2, 0); return ${y}-${m}-${day} ${h}:${min}:${s}; } function pickFirst(arr [], matcher) { return arr.find(item matcher(item)) || ; } /****************************************************************** * 运行控制 ******************************************************************/ function guardRunning() { if (!state.running || state.stopRequested) { throw new StopError(); } } async function interruptibleSleep(ms) { let elapsed 0; while (elapsed ms) { guardRunning(); while (state.paused) { state.phase paused; renderPanel(); await sleep(CONFIG.pollIntervalMs); guardRunning(); } const step Math.min(CONFIG.pollIntervalMs, ms - elapsed); await sleep(step); elapsed step; } } function pauseRunner() { if (!state.running) return; state.paused true; state.phase paused; state.status 已暂停; renderPanel(); } function resumeRunner() { if (!state.running) return; state.paused false; state.phase idle; state.status 继续运行中...; renderPanel(); } function stopRunner() { state.stopRequested true; state.running false; state.paused false; state.countdown 0; state.phase stopped; state.status 已停止; renderPanel(); } /****************************************************************** * 面板 ******************************************************************/ function createPanel() { const old document.getElementById(__boss_resume_panel); if (old) old.remove(); const panel document.createElement(div); panel.id __boss_resume_panel; panel.style.cssText position: fixed; top: 16px; right: 16px; z-index: 999999; width: 390px; max-height: 82vh; overflow: hidden; background: rgba(15, 23, 42, 0.95); color: #fff; border-radius: 12px; box-shadow: 0 10px 30px rgba(0,0,0,0.28); font: 14px/1.6 Arial, sans-serif; user-select: text; border: 1px solid rgba(255,255,255,0.1); ; panel.addEventListener(click, (e) { const act e.target?.dataset?.act; if (!act) return; if (act pause) pauseRunner(); if (act resume) resumeRunner(); if (act stop) stopRunner(); if (act export) exportRequestedToExcel(); }); document.body.appendChild(panel); return panel; } function renderPanel() { if (!state.panel) return; const list state.requestedRecords.slice(0, CONFIG.maxShowNames); const listHtml list.length ? list.map(item div stylepadding:4px 0; border-bottom:1px dashed rgba(255,255,255,.08); ${escapeHtml(item.name || 未识别姓名)} /div ).join() : div styleopacity:.7;暂无/div; state.panel.innerHTML div stylepadding:12px 14px; border-bottom:1px solid rgba(255,255,255,.08); div stylefont-size:16px; font-weight:700;求简历助手/div div stylefont-size:12px; opacity:.75;支持暂停 / 继续 / 停止 / 导出Excel/div /div div stylepadding:12px 14px; divb已请求 ${state.requestedCount} 次/b/div div已处理会话 ${state.processedConversationCount} 个/div div倒计时 ${state.countdown}/div div当前阶段${escapeHtml(state.phase)}/div div当前状态${escapeHtml(state.status)}/div div当前姓名${escapeHtml(state.currentName || 未识别)}/div div当前倒计时参数${CONFIG.countdownSeconds} 秒/div div每 ${CONFIG.refreshEveryConversationCount} 个会话刷新一次新消息/div div stylemargin-top:10px; display:flex; gap:8px; flex-wrap:wrap; button>// 点击第一个“有未读数字”的会话 const target [...document.querySelectorAll(.geek-item)].find(item { const countText item.querySelector(.badge-count span)?.textContent?.trim(); return Number(countText) 0; }); if (target) { target.click(); }2、找到可以发送收简历的窗口收简历3、循环读取最后一份简历并且点击 求简历按钮【说明】这是点击未读消息后出现的我两种简历3种对话框以及对应的html我想实现 当如果没有请求过简历点击求简历按钮等待10秒钟自动切换写一个 求简历如此反复并且在屏幕上显示已发送多少次请求显示 已请求 8次 倒计时 10 已请求 8次 倒计时 9 已请求 8次 倒计时 8 。。。 直到切换下一页还有倒计时时间作为参数放在顶部可以修改并且能够暂停 停止当前操作把已请求姓名都列出来一行一个增加一个按钮把已请求简历的名单能够导出excel。(() { /****************************************************************** * 可配置参数 ******************************************************************/ const CONFIG { // 每个会话处理完成后倒计时多少秒再切换到下一条 countdownSeconds: 10, // 点击“求简历”后等待确认弹层出现的时间 openConfirmDelayMs: 300, // 点击“确定”后最多等待多久确认“简历请求已发送” requestResultTimeoutMs: 5000, // 切换到下一条会话后等待页面渲染时间 switchConversationDelayMs: 1000, // 左侧列表找不到下一条时向下滚动的距离 listScrollStep: 700, // 内部轮询间隔 pollIntervalMs: 200, // 名单中是否去重 // true 同一个名字只保留一条 // false 同一个名字请求几次就记几条 uniqueNames: false, // 面板中最多展示多少条已请求姓名 maxShowNames: 300 }; /****************************************************************** * 如果旧脚本存在先停掉防止重复运行 ******************************************************************/ if (window.__bossResumeBot typeof window.__bossResumeBot.stop function) { try { window.__bossResumeBot.stop(); } catch (e) {} } /****************************************************************** * 全局状态 ******************************************************************/ const state { running: true, paused: false, stopRequested: false, requestedCount: 0, requestedRecords: [], countdown: 0, status: 初始化中..., phase: idle, currentName: , panel: null }; /****************************************************************** * 自定义停止异常 ******************************************************************/ class StopError extends Error { constructor(message 脚本已停止) { super(message); this.name StopError; } } /****************************************************************** * 基础工具函数 ******************************************************************/ function sleep(ms) { return new Promise(resolve setTimeout(resolve, ms)); } function textOf(el) { return (el?.textContent || ).replace(/\s/g, ).trim(); } function qs(selector, root document) { return root.querySelector(selector); } function qsa(selector, root document) { return [...root.querySelectorAll(selector)]; } function visible(el) { if (!el) return false; const style getComputedStyle(el); const rect el.getBoundingClientRect(); return ( style.display ! none style.visibility ! hidden rect.width 0 rect.height 0 ); } function click(el) { if (!el) return false; el.dispatchEvent( new MouseEvent(click, { bubbles: true, cancelable: true, view: window }) ); return true; } function escapeHtml(str) { return String(str ?? ) .replaceAll(, amp;) .replaceAll(, lt;) .replaceAll(, gt;) .replaceAll(, quot;) .replaceAll(, #39;); } function excelCell(str) { return escapeHtml(String(str ?? )).replace(/\n/g, br); } function nowString() { const d new Date(); const y d.getFullYear(); const m String(d.getMonth() 1).padStart(2, 0); const day String(d.getDate()).padStart(2, 0); const h String(d.getHours()).padStart(2, 0); const min String(d.getMinutes()).padStart(2, 0); const s String(d.getSeconds()).padStart(2, 0); return ${y}-${m}-${day} ${h}:${min}:${s}; } function normalizeText(str) { return String(str ?? ).replace(/\s/g, ).trim(); } function pickFirst(arr [], matcher) { return arr.find(item matcher(item)) || ; } /****************************************************************** * 运行控制 ******************************************************************/ function guardRunning() { if (!state.running || state.stopRequested) { throw new StopError(); } } async function interruptibleSleep(ms) { let elapsed 0; while (elapsed ms) { guardRunning(); while (state.paused) { state.phase paused; renderPanel(); await sleep(CONFIG.pollIntervalMs); guardRunning(); } const step Math.min(CONFIG.pollIntervalMs, ms - elapsed); await sleep(step); elapsed step; } } function pauseRunner() { if (!state.running) return; state.paused true; state.phase paused; state.status 已暂停; renderPanel(); } function resumeRunner() { if (!state.running) return; state.paused false; state.phase idle; state.status 继续运行中...; renderPanel(); } function stopRunner() { state.stopRequested true; state.running false; state.paused false; state.countdown 0; state.phase stopped; state.status 已停止; renderPanel(); } /****************************************************************** * 浮动面板 ******************************************************************/ function createPanel() { const old document.getElementById(__boss_resume_panel); if (old) old.remove(); const panel document.createElement(div); panel.id __boss_resume_panel; panel.style.cssText position: fixed; top: 16px; right: 16px; z-index: 999999; width: 380px; max-height: 82vh; overflow: hidden; background: rgba(15, 23, 42, 0.95); color: #fff; border-radius: 12px; box-shadow: 0 10px 30px rgba(0,0,0,0.28); font: 14px/1.6 Arial, sans-serif; user-select: text; border: 1px solid rgba(255,255,255,0.1); ; panel.addEventListener(click, (e) { const act e.target?.dataset?.act; if (!act) return; if (act pause) pauseRunner(); if (act resume) resumeRunner(); if (act stop) stopRunner(); if (act export) exportRequestedToExcel(); }); document.body.appendChild(panel); return panel; } function renderPanel() { if (!state.panel) return; const list state.requestedRecords.slice(0, CONFIG.maxShowNames); const listHtml list.length ? list.map(item div stylepadding:4px 0; border-bottom:1px dashed rgba(255,255,255,.08); ${escapeHtml(item.name || 未识别姓名)} /div ).join() : div styleopacity:.7;暂无/div; state.panel.innerHTML div stylepadding:12px 14px; border-bottom:1px solid rgba(255,255,255,.08); div stylefont-size:16px; font-weight:700;求简历助手/div div stylefont-size:12px; opacity:.75;支持暂停 / 继续 / 停止 / 导出Excel/div /div div stylepadding:12px 14px; divb已请求 ${state.requestedCount} 次/b/div div倒计时 ${state.countdown}/div div当前阶段${escapeHtml(state.phase)}/div div当前状态${escapeHtml(state.status)}/div div当前姓名${escapeHtml(state.currentName || 未识别)}/div div当前倒计时参数${CONFIG.countdownSeconds} 秒/div div stylemargin-top:10px; display:flex; gap:8px; flex-wrap:wrap; button>document.querySelectorAll(.geek-item).forEach(item { const countText item.querySelector(.badge-count span)?.textContent?.trim(); if (Number(countText) 0) { item.click(); } });

相关文章:

BOSS直接自动点击未读消息并发送求简历请求

最新版本代码 26-04-23 修复没有对话无法发送求简历按钮(() > {/******************************************************************* 可配置参数******************************************************************/const CONFIG {countdownSeconds: 3,openConfirmDe…...

13款降AI率工具实测:论文查重高怎么改,降重鸟稳居榜首

上周,我室友三天三夜敲完综述,维普AI率飙到46%,他抱头大喊“我又没抄”,我替他摸索工具,顺便吐槽:写得像人还被说像机器。 定向适配各大检测:平台选得对,降幅更稳 降重鸟地址&…...

别再死记公式了!用‘矩形面积’法秒懂均匀分布概率计算(附Python验证)

用几何直觉破解均匀分布:矩形面积法实战指南 想象一下,你经营着一家小花店,每天能卖出10到40束鲜花。某天有位老顾客要预订15到30束花,你想快速估算满足这个需求的概率——这时你需要的不是复杂的积分公式,而是一把直尺…...

Python 微信扫码活动系统实战

系统功能 1. 微信扫码入口 - 活动二维码:支持生成门店活动二维码,顾客扫码即可进入活动页面 - 活动识别:支持识别不同门店、不同活动场景 - 活动状态控制:支持活动启用、停用、过期控制 - 首次进入校验:校验用户是否首次参与、是否已领取、是否重复参与 2. 红包领取模…...

Docker 27容器化低代码平台上线后CPU突增400%?资深SRE带你逆向追踪runtime shim层的5个隐式依赖陷阱

第一章:Docker 27容器化低代码平台上线后CPU突增400%的现场还原凌晨两点,监控告警触发:核心服务容器 CPU 使用率从平均12%飙升至峰值520%,持续超阈值达18分钟。运维团队紧急接入生产环境,通过 docker stats 实时观察发…...

私有Registry沦陷实录:27个未授权镜像推送事件复盘,附GCP/AWS/EKS三平台RBAC最小权限模板

第一章:私有Registry沦陷事件全景图谱私有Docker Registry作为企业容器镜像分发的核心枢纽,其安全性直接关系到整个CI/CD链路与生产环境的可信基线。近年来,多起因配置疏漏、凭证泄露或未授权访问导致的Registry沦陷事件频发,攻击…...

Web 品质样式表:构建高效、美观的网页设计指南

Web 品质样式表:构建高效、美观的网页设计指南 引言 在互联网时代,网页设计已经成为展示企业品牌形象、提供优质用户体验的重要途径。而Web品质样式表(CSS)作为网页设计中的核心组成部分,对于提升网页的整体质量和用户体验至关重要。本文将深入探讨Web品质样式表的重要性…...

别只看主频!全志T3(A40I)和T5(T507)在智能车载与工业HMI场景下的真实表现差异

全志T3与T5芯片在智能车载与工业HMI中的实战选型指南 当工程师面对智能车载中控和工业人机界面(HMI)这两类截然不同的应用场景时,芯片选型往往成为决定产品成败的关键。全志T3(A40I)和T5(T507)作为两款定位不同的处理器,在实际应用中展现出的差异远比参数…...

【2026年版|建议收藏】Agent开发学习路线(从入门到进阶),小白程序员也能轻松上手大模型

本文专为想要转行、求职Agent开发岗位的程序员(含小白入门者)打造,整理了一套由浅入深、贴合2026年大模型技术趋势的Agent开发技术学习路线。内容涵盖大模型应用基础、提示词工程、大模型检索增强生成(RAG)、Agent智能…...

【收藏级】2026年大模型零基础入门到精通学习路线(小白/程序员专属)

在2026年的人工智能领域,大模型早已褪去“高端炫技”的光环,从云端军备竞赛转向端侧普惠,成为赋能各行业数字化转型的核心工具,更是程序员职场进阶、小白入门AI的必备技能。无论是对AI充满好奇的编程新手,还是希望深耕…...

打卡信奥刷题(3154)用C++实现信奥题 P7725 珍珠帝王蟹(Crab King)

P7725 珍珠帝王蟹(Crab King) 题目背景 在一次航程中,你偶然发现了被一片礁石环绕的帝王蟹,被月岛能量侵蚀的它又与月光有着怎样的联系呢?似乎只有击败它才能见分晓。 题目描述 帝王蟹可以通过镶嵌宝石触发战斗&#x…...

告别纯理论!用Proteus+CD4029+4511亲手搭一个可正/倒计数的数码管显示系统

从零搭建可交互数码管计数器:Proteus仿真全流程解析 在电子设计的学习过程中,理论知识的掌握固然重要,但真正让概念"活起来"的往往是亲手搭建电路的实践过程。本文将带您使用Proteus仿真软件,配合CD4029计数器和4511译码…...

如何用 dedao-dl 实现得到课程永久保存:告别知识过期的终极指南

如何用 dedao-dl 实现得到课程永久保存:告别知识过期的终极指南 【免费下载链接】dedao-dl 得到 APP 课程下载工具,可在终端查看文章内容,可生成 PDF,音频文件,markdown 文稿,可下载电子书。可结合 opencla…...

吊顶里的那根龙骨,后来怎么样了

决定用轻钢龙骨做吊顶,是设计师在图纸上画了几条线,轻描淡写说了一句。我当时没太在意,心想不就是吊个顶么。直到后来,我自己跑建材市场,站在一堆银晃晃的金属条面前,才觉得这事儿好像没那么简单。工人师傅…...

Hugging Face开源AI生态:从入门到实战指南

1. 开源AI生态入门指南Hugging Face平台已经成为当代AI开发者不可或缺的工具箱。这个最初专注于自然语言处理的开源社区,如今已发展成为涵盖计算机视觉、语音识别、多模态模型的综合性AI资源中心。我第一次接触Hugging Face是在2019年处理一个文本分类项目时&#x…...

别再只会按AutoSet了!手把手教你玩转泰克MSO2000B示波器的触发与采样设置

别再只会按AutoSet了!手把手教你玩转泰克MSO2000B示波器的触发与采样设置 当示波器屏幕上突然出现一个转瞬即逝的毛刺信号,或是测量一个非周期性的复杂波形时,按下AutoSet键往往只能得到一片混乱的显示。这不是示波器的故障,而是自…...

【限时开源】C++26合约成本审计模板(含Bazel规则、Clang插件、Gnuplot性能热力图脚本):仅开放72小时,专供高实时性系统团队

第一章:C26合约编程实战教程C26 将正式引入标准化的合约(Contracts)机制,作为语言级的运行时契约验证设施,用于表达函数前置条件、后置条件与断言不变量。与 C20 的实验性合约提案不同,C26 合约设计更强调可…...

【完整源码+数据集+部署教程】苹果品种分割系统源码&数据集分享 [yolov8-seg-C2f-RFCAConv&yolov8-seg-C2f-DCNV3等50+全套改进创新点发刊_一键训练教程_W

背景意义 随着全球人口的不断增长和生活水平的提高,水果作为人们日常饮食中不可或缺的部分,其生产和消费需求日益增加。苹果作为一种广受欢迎的水果,因其丰富的营养价值和多样的品种而备受青睐。苹果的品种繁多,不同品种的苹果在外…...

【限时技术白皮书】:Docker 27低代码集成性能压测报告(23类低代码引擎+8大PaaS平台横向对比,仅开放72小时)

第一章:Docker 27低代码平台容器集成全景概览Docker 27 是面向企业级低代码开发平台的轻量级容器运行时增强版本,专为支持可视化编排、动态组件热插拔与多租户隔离场景而优化。它并非 Docker Desktop 或 Docker Engine 的简单补丁,而是基于 c…...

COMSOL声学超材料实证研究

COMSOL 薄膜型声学超材料,薄膜质量块耦合吸声结构,sci完整复现。【COMSOL搞声学超材料的同学看过来】今天咱们聊聊薄膜型声学超材料建模那些事。这玩意儿在降噪领域挺火,特别是那个薄膜-质量块耦合结构,SCI论文里动不动就秀出90%以…...

电脑小白自救指南:当你的Win10被2345、小鸟壁纸攻占后,除了重装还能做什么?

电脑小白自救指南:当Win10被2345全家桶攻占后的终极清理方案 看着电脑右下角不断弹出的游戏广告、浏览器首页被篡改成陌生网址、任务管理器里挤满陌生进程——这可能是每个Windows用户都经历过的噩梦。尤其当2345系列软件、小鸟壁纸这类"业界毒瘤"侵入系统…...

如何5分钟搭建个人番茄小说图书馆:终极离线阅读解决方案

如何5分钟搭建个人番茄小说图书馆:终极离线阅读解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否遇到过这种情况?在地铁上网络信号断断续…...

谷歌 AI 会议记录功能大拓展:Gemini 支持线下及 Zoom、Teams 会议摘要生成

谷歌 AI 会议记录功能拓展至多场景据 9to5Google 报道,谷歌的 AI 会议记录功能不再局限于 Google Meets,如今,Gemini 能为线下会议以及在 Zoom 和 Microsoft Teams 上举行的会议生成摘要和文字记录。此前线下会议支持功能仅面向内测用户且仅在…...

6分27秒!宁德时代这一拳,直接打在了比亚迪的脸上,燃油车的时代真要终结了?

月21日晚,宁德时代的“超级科技日”发布会,本来以为只是常规的秀肌肉,结果曾毓群(宁德时代董事长)直接往牌桌上扔了一对“王炸”——第三代神行超充电池,10%充到98%,只要6分27秒! 你…...

别再只懂@NotNull了!手把手教你用Hibernate Validator玩转Java Bean校验,从自定义注解到集合校验

突破基础校验:Hibernate Validator高级实战指南 在Java后端开发中,数据校验是保障系统健壮性的第一道防线。虽然NotNull、Size等基础注解能解决80%的简单场景,但当面对复杂业务规则、跨字段逻辑或集合校验时,开发者往往陷入重复造…...

深度学习 —— 学习率衰减策略

目录 学习率策略 1. 先说结论: 2. 图例:各种学习率下的图 3. 学习率的方式 4. 公式: 4. 神经网络的训练流程 5. 完整代码示例 学习率策略 模型调优的时候可能才会用 1. 先说结论: ① 学习率小, 梯度下降慢 …...

百度网盘直链解析工具:告别龟速下载,重获下载自由

百度网盘直链解析工具:告别龟速下载,重获下载自由 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾面对百度网盘几十KB的下载速度感到绝望&…...

深度学习 —— 正则化批量归一化BN

正则化概念是什么? 机器学习/深度学习中,防止模型过拟合/提高模型泛化能力的方法L1与L2正则化L1和L2正则化通过在损失函数上添加惩罚项来实现L1正则化在工程中,通常引入软阈值操作,权重小于某个值时,强制为0深度学习中…...

告别本地显卡焦虑:用阿里云PAI一站式部署ChatGLM3,我的云端AI开发环境搭建实录

告别本地显卡焦虑:用阿里云PAI一站式部署ChatGLM3,我的云端AI开发环境搭建实录 当我在本地用RTX 3060显卡尝试运行ChatGLM3时,风扇的呼啸声和漫长的等待让我意识到——消费级硬件已经难以承载大模型时代的开发需求。经过两周的云端实践&#…...

一根同轴电缆的逆袭:SDI接口如何靠‘复用’老设备,成为专业视频传输的30年常青树?

一根同轴电缆的逆袭:SDI接口如何靠‘复用’老设备,成为专业视频传输的30年常青树? 在技术迭代日新月异的今天,很少有标准能像SDI接口这样,凭借一根75欧姆同轴电缆和BNC接头,在专业视频传输领域屹立30年不倒…...