☰
CDP协议伪装技巧:rewards-farmer如何把Edge伪装成MSRewards桌面客户端
2026/10/17 5:50:30 网站建设 项目流程

【免费下载链接】rewards-farmer

Automation for MS Rewards based on https://youtu.be/4qdPcMNaioA

项目地址:https://gitcode.com/gh_mirrors/re/rewards-farmer
点击查看免费下载

rewards-farmer 是一个 Microsoft Rewards 自动刷分工具:它用 Selenium 驱动 Edge 浏览器,再通过 CDP 协议注入自定义请求头,把浏览器伪装成 MSRewards 桌面客户端,从而解锁"仅桌面端可用"的奖励任务,并配合拟人化的鼠标轨迹和打字节奏来绕过自动化检测。这篇文章拆解它的全部伪装技巧。

一、奖励网站凭什么识别自动化脚本?

在讲伪装之前,先弄清楚检测方手里有什么"证据"。Selenium 驱动的浏览器默认会留下一串明显的自动化指纹,rewards-farmer 的对策可以按"指纹 → 对策"一一对应:

检测点自动化留下的痕迹rewards-farmer 的对策源码位置
页面脚本navigator.webdriver === true--disable-blink-features=AutomationControlledsrc/browser.py
页面脚本"被自动化测试软件控制"信息条excludeSwitches移除enable-automationsrc/browser.py
服务端请求缺少桌面端标识,看不到"桌面专属"任务CDP 注入MSRewards/DesktopUser-Agentsrc/rewards_tasks.py
行为分析打字瞬间完成、鼠标走直线随机打字间隔 + 贝塞尔轨迹 + Fitts 定律src/mouse_trajectory.py
页面状态窗口失焦时页面逻辑被暂停伪装document.hidden为可见src/tab_utils.py

可以看到,伪装分三个层次:启动参数抹掉静态指纹 → CDP 协议改写请求身份 → 拟人化输入覆盖动态行为。下面逐层拆解。

二、第一层伪装:用启动参数移除 Selenium 自动化指纹

浏览器还没打开之前,指纹就已经存在了。rewards-farmer 在 src/browser.py 的build_options中做了三件事:

options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) options.add_argument("--disable-blink-features=AutomationControlled")
  • excludeSwitches移除enable-automation:Selenium 默认会给浏览器加这个开关,导致页面顶部出现黄条提示"Chrome 正在受到自动化测试软件的控制",任何页面脚本也都能读到它。移除后,这条最显眼的"自曝"信息直接消失。
  • useAutomationExtension设为False:不加载 Selenium 的自动化扩展,进一步消除扩展层面的特征。
  • --disable-blink-features=AutomationControlled:这是关键一步。Chromium 在自动化模式下会把navigator.webdriver置为true,而这一特征正是由 Blink 的AutomationControlled特性控制的。禁用该特性后,页面里执行navigator.webdriver会返回false,大多数"反爬虫检测库"的第一道判断就此失效。

此外,启动参数里还有一个不那么"伪装"但同样重要的细节:--accept-lang=en-US(src/browser.py)。脚本靠按钮的英文文案来定位元素,锁定英文界面能避免用户系统语言不同导致任务全部找不到入口。

三、第二层伪装(核心):CDP 协议把 Edge 改成 MSRewards 桌面客户端

如果说第一层只是"洗白",那这一层就是真正的"变身"——它要解决的不是"我是不是浏览器",而是"我是什么客户端"。

Microsoft Rewards 有一些任务只对官方桌面客户端开放,服务端靠请求头来区分来源。普通的 Selenium 请求发出的是标准 Edge 浏览器的 User-Agent,服务端一看就知道"你只是个浏览器",于是这些任务根本不出现。

rewards-farmer 的解法藏在 src/rewards_tasks.py 的初始化代码里,短短几行就是全文最精华的部分:

# Set headers to spoof the rewards app for the rewards only quests self.driver.execute_cdp_cmd("Network.enable", {}) headers = { "User-Agent": "Mozilla/5.0 ... Edg/151.0.0.0 MSRewards/Desktop/1.1.0", "X-Rewards-Source": "msrewards-desktop", } self.driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": headers})

这里用到了CDP(Chrome DevTools Protocol)的两个命令,这也是 Selenium 4 的强大之处——execute_cdp_cmd让你绕过 WebDriver 的标准接口,直接向浏览器下发协议级指令:

  1. Network.enable:先开启网络域。这是前置条件,不开启的话setExtraHTTPHeaders不会生效。
  2. Network.setExtraHTTPHeaders:给该目标的所有出站 HTTP 请求附加额外请求头。注意是"所有请求"——导航、XHR、图片、静态资源,整个会话里发出的每个包都带着这两行头,伪装是全局的,不存在"漏网之鱼"。

两个头的分工很清晰:

  • User-Agent 末尾的MSRewards/Desktop/1.1.0:标准 Edge 的 UA 只到Edg/151.0.0.0为止。官方桌面客户端在这个位置追加了MSRewards/Desktop标识,rewards-farmer 原样照抄,让请求看起来来自桌面应用本体。
  • 自定义头X-Rewards-Source: msrewards-desktop:这是桌面端独有的来源声明,等价于向服务端出示"身份证"。

💡 为什么用 CDP 而不是 Selenium 的add_header思路?因为 Selenium 本身没有修改任意请求头的能力,而 CDP 是浏览器对自动化端开放的"底层控制台"——凡是 DevTools 能做的,execute_cdp_cmd基本都能做。这也提示了一个通用技巧:WebDriver 接口做不到的伪装,往往可以直接下探到 CDP 层完成。

四、第三层伪装:让鼠标和键盘"活"过来

改完了请求头,剩下的风险在行为上。真人操作和脚本操作的区别不在"点了哪个按钮",而在"怎么点的"。rewards-farmer 在这上面下了相当的功夫。

4.1 Fitts 定律驱动的鼠标轨迹

mouse_trajectory.py 是项目里最有"极客味"的模块,它要回答一个问题:从 A 点到 B 点,真人的鼠标怎么走?

它的做法分四步(src/mouse_trajectory.py):

  1. 三次贝塞尔曲线:起点、终点固定,两个控制点在起点/终点附近随机偏移,生成一条自然的弧线而不是直线;
  2. 随机扭曲区间:以约 15% 的频率在路径上插入 1~5 像素的微小偏离,模拟人手的不稳定;
  3. 逻辑斯谛变换:用 sigmoid 函数重排速度曲线,让移动呈现"先加速、末端减速"的真人节奏;
  4. Fitts 定律定时长:移动耗时不是拍脑袋的固定值,而是按运动学公式MT = a + b·ID(其中ID = log2(2D/W))计算——目标越远越小,耗时越长(src/mouse_trajectory.py)。

常数a=0.5500、b=0.1276也不是随便填的,而是 src/fitts_law.py 提供了一个校准程序:让操作者反复点击屏幕上的随机目标并记录真实移动时间,用最小二乘回归拟合出个人参数。也就是说,脚本的鼠标节奏是按"人的手速"标定的。

4.2 带"犹豫"的打字节奏

mimic_typing.py 处理输入节奏。send_keys时每个按键之间会插入随机停顿,从三档间隔里按权重抽取:

  • 0 ~ 0.1s(概率 0.377):连击、熟练的词
  • 0.1 ~ 0.2s(概率 0.5492):正常打字
  • 0.2 ~ 0.4s(概率 0.0738):偶尔的"卡壳"

这个三档分布比"固定间隔"更接近真实打字的统计特征,也避免了脚本最典型的"匀速机器感"。

4.3 其他细节

  • 窗口焦点伪装:src/tab_utils.py 的ensure_focus通过Object.defineProperty把document.hidden和visibilityState钉死为"可见/聚焦"。很多页面的前台任务在检测到窗口失焦后会暂停逻辑,这招保证脚本切到后台(比如虚拟桌面挂机)时页面依然"认为自己在前台"。
  • 搜索词后缀-noai:src/rewards_tasks.py 每次提交的查询都追加-noai,让结果页不展开 AI 回答卡片,避免额外的交互和流量特征,同时保持搜索结果结构稳定、便于定位元素。

五、快速上手:运行 rewards-farmer

了解了原理,跑起来并不复杂。前置要求:Python 3.12+、Poetry、已安装的 Microsoft Edge(自带 webdriver)。

git clone https://gitcode.com/gh_mirrors/re/rewards-farmer cd rewards-farmer poetry install

然后按 README.md 的建议走三步:

  1. 初始化配置:python src/init-config.py,交互式设置各项参数;
  2. 手动登录一次:运行python src/main.py,等页面打开后 Ctrl-C 退出,在弹出的 Edge 窗口里登录你的 Microsoft 账号(Bing 和 rewards.bing.com 都要登录),让登录态保存在data-dir的专用 profile 里;
  3. 正式运行:再次运行python src/main.py,脚本即开始自动完成每日任务。

几个常用可选项:

  • 搜索词来源:QUERY_SOURCE=trends使用 Google Trends / Wikipedia / Bing 自动补全,无需任何 API Key;QUERY_SOURCE=llm则调用 OpenRouter 或本地 Ollama 生成搜索词(配置见 README.md 的.env说明);
  • 无头模式:REWARDS_HEADLESS=1,配合 src/browser.py 中显式设置的1920x1080窗口尺寸(指针代码按视口坐标工作);
  • Docker:docker compose build后直接跑,无需在宿主机装 Edge,详见 docker-compose.yml;
  • 多账号:REWARDS_ACCOUNTS=personal,spare,每个账号一个独立 profile 目录,逐个顺序执行。

⚠️ 最后必须提醒:README 明确声明风险自负——使用自动化脚本刷取奖励可能违反服务条款,Microsoft 有权对账号采取处罚措施。学习其反检测与拟人化技术本身很有价值,但请遵守目标平台的使用条款。

六、总结:三层伪装缺一不可

rewards-farmer 的伪装思路可以浓缩成一张表:

层次目标关键技术
启动参数抹掉静态自动化指纹excludeSwitches、disable-blink-features=AutomationControlled
CDP 请求头改写"我是谁"的身份Network.setExtraHTTPHeaders注入桌面客户端 UA
行为拟人化动态行为不露馅Fitts 定律轨迹、三档打字间隔、焦点伪装

其中最有借鉴意义的是第二层:当标准 WebDriver 接口无法改变请求身份时,execute_cdp_cmd让你直接下探到 CDP 协议层,用Network.enable+Network.setExtraHTTPHeaders两行代码就完成了一次"浏览器 → 桌面客户端"的完整变身。这正是 CDP 协议在自动化对抗中最锋利的用法。

【免费下载链接】rewards-farmer

Automation for MS Rewards based on https://youtu.be/4qdPcMNaioA

项目地址:https://gitcode.com/gh_mirrors/re/rewards-farmer
点击查看免费下载
上一篇:Remotion错误处理终极指南:7个常见问题排查与调试技巧
下一篇:Homebridge HomeKit Secure Video支持:实现加密视频存储

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询