Version History
2.9.3
Latest Version版本:2.9.2 → 2.9.3
修改内容
位置 修改 原因
1 ~692行 pointsCounters 改为 JSON.parse 解析 旧正则要求固定字段顺序和 mobile 字段,新版页面不兼容
2 ~721行 activityCards 改为括号深度匹配 旧正则 [^]]+ 遇到嵌套数组会截断
3 ~1951行 宽泛匹配补充 rnoreward 关键字 兜底逻辑更全面
4 ~2285行 startPunchCards() 添加 await 修复异步竞态,确保执行顺序
5 ~1107/1126行 DAPI 调试日志加 debugDAPI 条件 减少正常运行时的日志噪音
6 ~829-848行 兜底逻辑(getuserinfo + DAPI) 页面解析失败时自动用 API 获取配额
2.9.2
浏览器通知静默开关(2068-2078行):菜单显示"🔕 关闭浏览器通知"或"🔔 开启浏览器通知"
通知控制统一:所有 GM_notification 调用都受 Notice.bro 开关控制
授权码获取改进(586-629行):
移除不可行的 GM_xmlhttpRequest 跨域请求
保留 GM_openInTab 打开授权页面(浏览器自动携带 Cookie)
支持用户粘贴完整 URL 或单独的 code
2.9.1
移除 getSearchQuotaFromAPI 函数
v2.9.0 有一个 65 行的 getSearchQuotaFromAPI(),优先从 DAPI 查询搜索配额,失败时回退到 HTML 解析。v2.9.1 完全删除了这个函数,因为 DAPI counters 字段始终返回 null。getRewardsInfo 简化
v2.9.0 先尝试 DAPI 查询,失败才走 HTML 解析。v2.9.1 直接走 HTML 解析,去掉了 DAPI 查询分支。getToken 返回值统一
v2.9.0 网络错误返回 null,code 失效返回 false。v2.9.1 两种情况都返回 false,简化了调用方判断逻辑(不再需要 if (token === null) return false)。discoverCards 方法 3 改用平衡括号匹配
v2.9.0 用正则 {[^{}]"offerId"[^{}]"hash"[^{}]*} 匹配卡片对象,只支持 flat JSON,且需要正反两次匹配(offerId/hash 顺序不同)。v2.9.
2.9.0
v2.9.1 更新日志
修复
阅读任务虚假完成:服务端二次验证进度
搜索配额获取失败:移除无效DAPI查询,改用HTML解析
剪贴板报错:改为prompt弹窗
优化
401自动刷新Token并重试
getRewardsInfo简化为纯HTML解析
二次扫描机制:首轮完成后补扫新卡片
调整
删除getSearchQuotaFromAPI
Token续期逻辑重构>
⚠️ 维护声明:本项目短期内不再维护。** 代码以开源形式发布供学习参考,不保证后续更新、Bug 修复或功能迭代。使用风险自担。
2.8.2
Prerelease Versionv2.8.2 改动内容
修复的核心问题
- 日志不可见:所有 console.log 改为 Utils.log,确保在 GM_log 中可见
- 静默失败:所有异步函数添加 try/catch,错误信息会显示在日志中
- 选择器不够健壮:findDailySetLinksOnMainPage 现在支持多种容器选择器
- 启动诊断:添加模块加载日志,方便排查问题
新增的日志输出(下次运行会看到)
📅 每日活动模块已加载,准备启动...
📅 每日活动定时器已启动(8秒后执行)
📅 开始执行每日活动...
📅 共找到 X 个活动链接
📅 打开活动: XXX (+10分)
或者如果出错:
🔴 每日活动执行异常: XXX
findDailySetLinksOnMainPage 改进
现在搜索以下容器:
- #dailyset section id
- 所有
中 heading 包含"每日活动"的 - 全局 bing.com 搜索/购物链接(备用)
下次运行
脚本管理器日志中应该能看到 📅 开头的条目,显示每日活动的执行过程。如果仍有问题,日志会显示具体错
2.8.1
2.8.1 改动内容
核心策略变更:优先从主页面直接点击
问题:v2.8.0 需要先点击卡片打开侧边栏对话框,再从对话框中点击活动项。但实际上这些活动链接同时存在于主页面的 #dailyset 区域中。
改进:
- 优先方式:直接在主页面的 #dailyset 区域查找 活动链接
- 备用方式:如果主页面未找到,才回退到打开对话框的方式
新增函数 - findDailySetLinksOnMainPage() - 在主页面 #dailyset 区域查找 bing.com 的搜索/购物链接
- clickDailySetViaDialog() - 对话框方式(备用方案)
执行流程(v2.8.1)
- 在主页面 #dailyset 区域查找活动链接( 标签,target="_blank")
↓ 找到 - 筛选未完成的(不包含"已完成"文本)
- 使用 GM_openInTab 在后台打开
↓ 未找到 - 回退:点击"每日活动"卡片 → 打开对话框 → 从对话框中点击
判断逻辑
- 已完成:文本包含"已完
2.7.3
微软目前对国区账号采取了极其复杂的灰度策略。对于一部分账号,它允许通过 DAPI 查询所有数据;而对于另一部分账号(尤其是最近比较活跃的),它会关闭 DAPI 的配额下发,强制要求客户端通过加载网页来获取进度。有时候虽然 Token 有效,但微软会限制该 Token 访问敏感计数器的权限。
2.7.1
已修复 (v2.7.1)
问题原因:变量 hasMobile 在 doSearch() 函数中被重复声明了多次,导致语法错误,整个脚本无法运行。
修复内容:
问题 修复
变量重复声明 将第 1869 行的 hasMobile 改为 canSearchMobile
async 回调 移除测试通知菜单的 async 关键字
2.4.0
活动卡片跳过规则 添加 skipHrefs 数组,包含 Python 版的链接跳过规则
卡片解析一致性 方法2的跳过规则现在也检查 offerId,与方法1保持一致