webmirage

mcp
Guvenlik Denetimi
Uyari
Health Uyari
  • No license — Repository has no license file
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Gecti
  • Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Gecti
  • Permissions — No dangerous permissions requested

Bu listing icin henuz AI raporu yok.

SUMMARY

网蜃楼 — MCP 服务器,用浏览器 Cookie + TLS 指纹模拟,让 AI 直接调平台内部 API。支持 Twitter、Reddit、雪球、闲鱼,24 个工具,零 API 费用。

README.md

🌊 webmirage

给你的 AI Agent 一键装上互联网能力

网蜃楼 — 帮 AI 从互联网的海市蜃楼中捕捉真实信息

MIT License Python 3.10+ MCP Compatible

快速开始 · English · 支持平台 · 设计理念 · 闲鱼评分


为什么需要 webmirage?

AI Agent 已经能帮你写代码、改文档、管项目——但你让它去网上找点东西,它就抓瞎了:

  • 🐦 "帮我搜一下推特上大家怎么评价这个产品" → 搜不了,Twitter API 要 $100/月
  • 📖 "去 Reddit 上看看有没有人遇到过同样的 bug" → 403 被封,服务器 IP 被拒
  • 📈 "查一下茅台现在的 PE 和市值" → 拿不到,金融数据要付费
  • 🛒 "帮我在闲鱼搜个二手迷你主机,性价比好一点的" → 没法搜,没有 API 只能手动刷
  • 🌐 "帮我看看这个网页写了啥" → 抓回来一堆 HTML 标签,根本没法读

这些不难实现,但是需要自己折腾配置

每个平台都有自己的门槛——要付费的 API、要绕过的封锁、要登录的账号、要清洗的数据。你要一个一个去踩坑、装工具、调配置,光是让 Agent 能读个推特就得折腾半天。

webmirage 把这件事变成一个 MCP 服务器:

装好、配好 Cookie,你的 AI 就能搜推特、刷 Reddit、查股票行情、逛闲鱼、研究 GitHub 项目——33 个工具,一个入口。


✅ 在你用之前,你可能想知道

💰 完全免费 所有工具开源,所有 API 免费。不花一分钱,不用申请任何 API Key
🔒 隐私安全 Cookie 只存在你本地,不上传不外传。代码完全开源,随时可审查
🛡️ 反检测 TLS 指纹模拟 + x-client-transaction-id 生成 + 请求抖动,降低被封风险
🤖 兼容所有 MCP 客户端 Claude Desktop、Cursor、Windsurf、opencode……任何支持 MCP 的客户端都能用
🧩 插件架构 实现一个接口就能添加新平台,不改核心代码

支持的平台

平台 工具数 核心能力 怎么配
🐦 Twitter/X 9 搜索推文、用户帖子、帖子线程、用户画像、关注列表、Watchlist Feed Cookie(auth_token + ct0)
📖 Reddit 5 搜索帖子、版块热帖、帖子+评论、用户画像、用户发帖 Cookie(reddit_session),或装 browser-cookie3 自动提取
📈 雪球 5 实时行情+PE/PB/EPS、股票搜索、热帖、热门股排行、自选股批量行情 无需配置(自动获取公共 Cookie)
🛒 闲鱼 5 商品搜索、智能评分排名、商品详情、我的在售列表、确认发货 Cookie(含 _m_h5_tk + unb)
🐙 GitHub 8 仓库搜索、仓库详情、README、Issue、Release、PR、仓库对比 可选 Token(匿名只读可用)
合计 33

🍪 所有平台都用浏览器 Cookie 认证,不需要申请任何官方 API。Cookie 只存你本地,不上传不外传。

⚠️ 封号风险提醒: 使用 Cookie 登录的平台(Twitter 等),通过脚本/API 调用存在被平台检测并封号的风险。请务必使用专用小号,不要用你的主账号。


快速上手

1. 安装

git clone https://github.com/lca1rus01/webmirage.git
cd webmirage
pip install -e .

如需浏览器 Cookie 自动提取(Reddit / 雪球):

pip install -e ".[xueqiu]"

2. 配置 Cookie

方式 A:.env 文件

cp .env.example .env
# 编辑 .env,填入你的 Cookie
TWITTER_AUTH_TOKEN=你的auth_token
TWITTER_CT0=你的ct0
# REDDIT_COOKIE=reddit_session=xxx
# XIANYU_COOKIE=你的完整cookie字符串

方式 B:YAML 配置文件 ~/.webmirage/config.yaml

twitter_auth_token: "你的auth_token"
twitter_ct0: "你的ct0"
twitter_watchlist:
  - elonmusk
  - realDonaldTrump

reddit_cookie: "reddit_session=xxx"

xueqiu_watchlist:
  - SH601318
  - 09988
  - AAPL

xianyu_cookie: "_m_h5_tk=xxx; unb=12345; ..."

# GitHub Token 可选;建议使用 Fine-grained PAT,仅授予必要的只读权限
github_tokens:
  - "github_pat_xxx"

Cookie 怎么获取?

Twitter/X(点击展开)
  1. 在浏览器登录 x.com
  2. 安装 Cookie-Editor Chrome 插件
  3. 点击插件图标 → Export → "Header String"
  4. 从导出内容中找到 auth_token 和 ct0 两个值
Reddit(点击展开)
  1. 在 Chrome/Edge 中登录 reddit.com
  2. F12 → Application → Cookies → reddit.com
  3. 找到 reddit_session,复制其 Value
  4. 配置为 reddit_session=xxx 形式

如果安装了 browser-cookie3,webmirage 可以自动从浏览器提取 Reddit Cookie——无需手动配置。

闲鱼 / Goofish(点击展开)
  1. 在浏览器中登录 goofish.com
  2. F12 → Application → Cookies → goofish.com
  3. 把所有 Cookie 拼成 k1=v1; k2=v2; ... 格式
  4. 必须包含 _m_h5_tk 和 unb 字段
雪球(点击展开)
  • 无需配置! webmirage 自动从雪球首页获取公共 Cookie。
  • 如需个性化数据(自选股),在 Chrome 中登录并安装 browser-cookie3 即可。

3. 添加到 MCP 客户端

Claude Desktop(claude_desktop_config.json):

{
  "mcpServers": {
    "webmirage": {
      "command": "python",
      "args": ["-m", "webmirage"],
      "cwd": "/path/to/webmirage",
      "env": {
        "TWITTER_AUTH_TOKEN": "你的auth_token",
        "TWITTER_CT0": "你的ct0"
      }
    }
  }
}

Cursor / Windsurf / opencode — 在 MCP 设置中添加相同的配置。

如果用 ~/.webmirage/config.yaml 管理 Cookie,可以省略 env 块。

4. 开始用

直接对 AI 说:

Twitter:

  • "搜索 Twitter 上关于 Claude Code 的讨论"
  • "获取 @elonmusk 的最新推文"
  • "读一下这条推文:https://x.com/..."
  • "拉取我关注博主的最新推文"

Reddit:

  • "在 Reddit 上搜索关于 opencode 的讨论"
  • "r/MachineLearning 有什么热帖?"
  • "读一下这个 Reddit 帖子的评论"

雪球:

  • "查一下茅台的 PE 和市值"
  • "雪球上热门的股票有哪些?"
  • "看看我的自选股行情"

闲鱼:

  • "搜闲鱼上的 16G 迷你主机,按评分排名"
  • "查看这个闲鱼商品的详情"
  • "看看我闲鱼上挂了哪些东西"
  • "给这个订单发货"

集成 Mihomo 代理(Docker)

仓库根目录的 docker-compose.yml 现在同时管理 webmirage 和 mihomo:WebMirage 通过私有 Compose 网络使用 mihomo:7890,而原有的宿主机端口保持不变(SSE 8084、代理 7890/7891、仅本机可访问的控制器 127.0.0.1:9090)。

  1. 创建不提交的运行配置:

    cp .env.example .env
    chmod 600 .env
    
  2. 在 .env 中设置 MIHOMO_API_SECRET;首次部署还需要把已有 Mihomo 的 config.yaml、API_SECRET、geoip.metadb 和 geosite.dat 放在 mihomo/data/。该目录被 Git 忽略,避免提交订阅节点、控制器密钥和 Geo 数据。

  3. 若宿主机没有默认的 local/mihomo:v1.19.31 镜像,在 .env 中设置兼容的 MIHOMO_IMAGE。

  4. 启动:

    docker compose up -d --build
    

MCP 额外提供两个代理工具:

  • webmirage_proxy_status:查看 Mihomo 版本、可切换分组、当前节点及候选节点;
  • webmirage_proxy_select:使用状态工具返回的精确 group 和 node 名即时切换节点。

刷新订阅时运行 ./mihomo/update_subscription.sh。它会在替换当前配置前下载到临时文件、规范化 REALITY short-id、调用运行中的 Mihomo 验证候选配置,并在重启失败时回滚;订阅 URL 只从环境变量或不提交的 .env 读取。

多订阅与自动故障转移

在不提交的 .env 中设置主来源 MIHOMO_SUBSCRIPTION_URL、备用来源
MIHOMO_BACKUP_SUBSCRIPTION_URL;更多备用可使用 _2、_3 等后缀。
每个来源单独维护,节点自动添加来源前缀,同名节点不会互相覆盖。

# 下载、生成候选配置并使用当前内核验证,不改变正在运行的配置
python3 mihomo/configure_failover.py
# 发布、热加载、验证 HTTPS 出网;验证失败自动恢复上一配置
python3 mihomo/configure_failover.py --apply

启用后,XFLTD 提供“自动”和“手动节点”两种模式,默认自动。自动模式将主备故障转移与订阅内低延迟优选结合:先在主订阅的健康节点中优选;主订阅全部不可用时依次切换备用订阅、最后本地救援,恢复后按来源优先级回切。备用订阅延迟更低也不会抢占健康的主订阅。每个来源使用独立 URLTest 组,外层 Fallback 保持订阅顺序。

订阅内使用 30ms 切换容差,减少延迟小幅波动造成的反复换线;不保证每个时刻严格取最小值,也不代表带宽最大。切到手动节点后会固定出口并暂停自动优选和故障转移,可通过控制台恢复自动。模式与手动节点由内核持久化。策略切换不主动关闭已有连接;已经因网络故障断开的连接仍需应用重新建立。全量节点每 15 分钟进行 HTTPS 健康检查,外层主备组每 2 分钟只检查各来源当前优选出口(当前最多 4 条),单次超时 20 秒;检查周期不保证所有故障都在固定秒数内恢复。实际代理连接连续失败会触发内核额外检查;启动、热加载和订阅更新也可能触发初始检查。健康检查判断基础出网,业务认证、余额或站点限制需另行诊断。

多订阅节点 DNS 按各来源的节点域名分别配置。编译器保留订阅的 proxy-server-nameserver 元数据并生成精确域名策略,避免某个来源的专用 DNS 被用于其他来源。普通节点解析使用通用 DNS,原有业务域名 DNS、路由、监听端口保持不变。冷启动握手可能超过 5 秒,节点和策略组的探测上限统一为 20 秒;延迟数值可能仅反映统一延迟模式下的后续请求,不等于完整探测耗时。

发布配置时会暂时保留正在工作的出口,待初始检测和 HTTPS 验证完成后恢复原来的自动/手动模式及手动节点;验证失败恢复上一份配置。修复验证不依赖重新创建或重启 Mihomo 容器。

Mihomo 每小时独立更新各订阅,下载失败保留已缓存节点;订阅服务器不可达时也可使用缓存
启动。配置生成器先直连下载,失败后尝试现有代理,再尝试该来源对应的缓存。修改为新链接
时不会使用旧链接的缓存冒充新来源。首次添加某来源必须取得其有效节点。

update_subscription.sh 检测到备用订阅后会自动使用新流程,避免再次更新时覆盖主备结构。
本机配置与缓存权限受限,不要提交订阅、Token 或节点密码。多个订阅并不必然代表独立
基础设施;工具仅提示节点配置重合情况,不会自动合并来源。

可在不影响生产网关的临时容器中运行故障切换和缓存冷启动验证:

python3 -m unittest discover -s tests -v
MIHOMO_INTEGRATION=1 python3 -m unittest discover -s tests -p '*native.py' -v

Vue 网关控制台

控制台由 WebMirage 独立提供:http://192.168.188.3:8091/。
WebMirage 负责平台接口、凭证、检测记录与 Mihomo 网关管理;Mira 是 MCP 调用方,继续使用原有 8084/sse,不承担管理页面托管。
原 8086/gateway/ 是借用 Mira Nginx 的旧入口,已停止自动维护,不能再作为网关入口。Mira 发布不影响独立控制台。
支持网关总览、订阅节点搜索和筛选、实时连接与实际转发链路,以及自动/手动出口切换。
总览流量曲线表示当前浏览器会话的采样;“历史流量”页提供后台持续保存的连接与时间段用量。

cd gateway/frontend
npm ci
VITE_APP_BASE=/ npm run build
cd ../..

首次启动前,创建管理密码文件(不提交,不要写入前端):

python3 - <<'PY'
import os, secrets
from pathlib import Path
p = Path('mihomo/data/gateway-admin-password')
if not p.exists():
    p.write_text(secrets.token_urlsafe(18) + '\n')
    os.chmod(p, 0o600)
PY
python3 -m venv gateway/.venv
gateway/.venv/bin/pip install -r gateway/requirements.txt
gateway/.venv/bin/python gateway/install_service.py --host 192.168.188.3

登录后的 POST /api/policy 支持 {"mode":"auto"}(订阅内低延迟优选与主备故障转移)和 {"mode":"manual","node":"精确节点名称"}。写请求必须携带 X-Gateway-Request: 1 和登录会话;浏览器不接触控制器密钥。

登录密码保存在 mihomo/data/gateway-admin-password。登录使用 HttpOnly 会话 Cookie;
所有控制接口需要登录,浏览器不会收到控制器密钥、节点密码或订阅 Token。
切换前会校验节点存在且检测可用,切换失败尝试恢复原出口;不会主动中断已有连接。
页面仅提供自动优选与故障转移、手动选择节点两个入口;手动模式明确提示节点故障时不会自动换线,“恢复自动”同时启用订阅内优选与主备故障转移。

“平台健康”(/#platforms)接入现有 WebMirage MCP 服务,当前包括 X/Twitter、雪球、闲鱼、Reddit、GitHub,共 33 个平台工具(系统管理工具另计)。后台每 2 分钟只读取本地 MCP 工具注册、凭证字段是否齐全和进程内调用计数;页面刷新只读记录,不触发平台请求。通过现有容器内的 MCP SDK 连接真实 SSE 服务,沿用服务当前的 Cookie、缓存和出网路径,不重启 WebMirage/Mihomo 容器。原生运行入口 serve.py 启用固定本机桥接;未启用桥接的部署会明确显示不可用。

平台自动检测默认启用,每个代表接口基础周期 30 分钟,覆盖 5 个平台共 10 个固定只读接口,逐个执行。页面可选 15、30、60、120 分钟或暂停;设置通过登录及 CSRF 保护的 POST /api/platforms/monitoring 保存到 SQLite,重启后保留。后台每 30 秒检查到期计划,MCP 本地注册/计数仍按 2 分钟同步;页面轮询和“刷新状态”本身不会发起平台探测。

近期真实调用通过时可延后该平台的代表探测,但平台汇总调用不能清除已记录的单个接口异常。连续失败的接口按基础周期的 2、4、8 倍退避,最长 4 小时;正常接口保持基础周期。缺少必要凭证、接口未注册或 MCP 不通时跳过自动请求;暂停后当前已发出的请求可以结束,后续不再发起,手动检查仍可使用。每次探测发出前保存计划,防止重启立即重复同一请求;自动与手动共享串行任务及 60 秒冷却。

状态分别显示“尚未检测”“检测结果已过期,待复测”“凭证变更,待复测”,并展示上次检测、下次计划和自动/手动来源。有效期为基础周期加 5 分钟;过期只说明需要新证据,不代表故障。自动、手动结果均写入检测历史并参与对应接口的 24 小时主动检测统计;没有安全代表参数的其他接口保持未验证,写操作始终不参与检测。

主动检测按平台或单个接口运行,可一次检测 10 个预设的只读代表接口;逐个执行、完成后冷却 60 秒,相同时间只允许一个检查任务。参数由服务端固定,不提供任意工具调用或任意 URL 请求。闲鱼 xianyu_confirm_delivery 等写操作不在白名单内;需要商品 ID、账号或关注列表的其他工具保持未单独验证。已有客户端可能进行正常重试,一次工具检查不等于一次 HTTP 请求。

结果区分明确的认证错误、限流、风控、403 访问限制、网络超时、平台服务异常、接口异常及 MCP 通信故障;403 和风控不会直接判为 Cookie 过期。原生调用统计的相对时间按读取时刻估算,且仅按平台汇总;较旧调用不能证明当前可用。近 24 小时主动检测成功率按对应接口的检查记录计算,不与被动调用计数混算。检测历史保存在 gateway/data/platforms.sqlite3,保留 30 天、最多 10,000 条,仅记录结论与完整工具调用耗时,不记录 Cookie、搜索响应或用户资料正文。

平台凭证可在已登录管理台中更新:仅白名单字段、密码输入框不回显原值;受环境变量覆盖的字段禁止写入文件。通过固定容器桥接从 stdin 传递输入,原子写入配置且权限为 0600,再调用无敏感参数的 webmirage_reload_config;避免使用会把凭证参数写入旧 MCP 日志的 webmirage_set_cookie。热加载失败恢复配置文件。未重新注册的工具仍显示未注册,不能假定更新凭证就能让所有工具出现。更新凭证会使旧检测结果失效,需要复测,保存成功不会直接标为健康。

各平台凭证默认逐项填值:X/Twitter 的 auth_token、ct0,雪球的 xq_a_token,闲鱼的 _m_h5_tk、unb,Reddit 的 reddit_session,以及 GitHub Token。雪球、闲鱼、Reddit 由服务端在文件锁内拼接和合并 Cookie,仅替换非空填写项并保留其他 Cookie;可展开其他会话项按需修改,也可选择“导入完整 Cookie”明确替换整段。逐项更新和完整导入不可混用,字段受各平台白名单与环境变量覆盖限制,热加载失败恢复原文件。切换模式会清空尚未保存的输入。X/Twitter 两项应来自同一次登录;闲鱼若原先单独设置了用户 ID 覆盖项,换账号时需在选填区域同步更新该项。

平台状态使用独立接口与存储,即使 Mihomo 不可达仍可查看检测历史;平台存储初始化失败也不会阻止网关管理启动。平台监控数据库不包含历史 Cookie 值;修改配置前后的旧业务数据不进入浏览器。

节点检测与页面刷新分开:页面每 5 秒读取控制器缓存,不会主动访问测试站点。点击总览“刷新状态”仅重新检测当前出口;在节点列表点击时仅检测当前页(最多 12 条)。可另选“检测此订阅”或“检测全部”。POST /api/healthcheck 接受 scope=current/page/provider/all,页范围附 nodes,订阅范围附 provider;服务端仅接受已加载的 managed 节点,固定 HTTPS 测试地址。任务异步执行,最多并发 4 个、每个工作线程间隔 250ms,任务完成后冷却 60 秒,重复请求复用运行中的任务。GET /api/healthcheck 只读进度。控制器中断显示未完成,不把未检测节点记为失败。

列表展示最近 HTTPS 探测、检测时间及最近最多 10 个原生样本的成功率、中位数和波动(成功样本的最大值减最小值;不足两次不计算)。优先读取测试地址对应的状态,确保预期 HTTP 状态码也计入健康判定。结果超过全量周期加宽限时间会标为较旧;这不是持续丢包率、下载带宽或业务站点成功率。统一延迟开启时使用内核定义的请求耗时,通常不包含完整首次建连成本。

gateway/install_service.py --host <本机私有 IPv4> 安装用户级 mirage-gateway-api.service,
在指定的现有私有地址监听 8091,同时提供 Vue 静态资源与 /api/,默认直接运行 serve.py 时仅绑定 127.0.0.1。
服务直接读取 WebMirage 仓库中的构建产物、管理密码与记录;启动不查询或依赖 Mira 容器。
部署会停用旧 mirage-gateway-page.timer,避免自动修改 Mira;不会修改防火墙、系统路由、Docker 端口映射或容器网络,也不重启业务容器。
独立入口使用站点根路径构建和 Cookie,不能混用旧 /gateway/ 构建。
部署前备份原网关应用服务,验证实际页面、前端资源及 JSON 会话协议,避免 SPA 返回 200 的假正常。

可使用 systemctl --user status mirage-gateway-api.service 查看接口服务状态,
或执行 gateway/.venv/bin/python gateway/check_console.py http://192.168.188.3:8091 做只读入口检查。
本部署不使用 docker-compose.gateway.yml,不会创建新容器,也没有启用系统 linger;用户服务按用户会话生命周期运行。
本地开发可设置控制器地址、密钥、密码文件和配置文件环境变量后启动
uvicorn app:app --app-dir gateway --port 8091;Vue 开发服务器将 /api 代理到该端口。

历史连接与流量位于控制台的“历史流量”页(/#history)。支持最近 1 小时、24 小时、7 天和自定义时间段,以及用途、域名、来源 IP、转发节点、出网方式、入口分类。分类汇总可点击筛选连接明细,两个列表均有分页;连接从内核消失后仍保留最后观测时间和已采集用量。

用户级 mirage-gateway-history.service 独立每 2 秒读取 Mihomo /connections,浏览器和管理 API 关闭时也会继续记录。数据保存在被 Git 忽略的 gateway/data/history.sqlite3(SQLite WAL),默认保留 30 天;每小时清理旧记录,超过约 256 MB 的数据库使用量时逐步淘汰更早的数据。实际保留起点会在查询中体现。采集随用户服务管理器运行,不修改系统 linger。

时间段流量是连接累计计数的增量,按采样结束时刻归入半开区间 [开始, 结束)。首次快照以及采集断线、重启后的首次快照作为基线,不把之前的流量归到恢复时刻;这部分字节不会补算。连接计数回退也作为缺口处理。页面以斜纹和缺口列表标出未完整观测时段。连接短于采样周期时可能漏采,末尾字节数也可能低估,不能用于精确计费或推断业务请求是否成功。统计只覆盖经过 Mihomo 的流量。

“用途分类”按目标域名及子域名规则归类,仅描述目标用途,不认定调用方服务;共用来源 IP 的 Codex/Jev 仍无法可靠分开。记录只保存目标、来源、入口、实际节点、连接时刻和流量等网络元数据,不存 Cookie、订阅链接、请求参数或内容。

可使用 systemctl --user status mirage-gateway-history.service 查看采集状态。历史查询使用登录保护的 /api/history 接口;即使 Mihomo 当前不可达,仍可查看已有数据,并显示采集过期或中断。

后端校验:gateway/.venv/bin/python -m unittest discover -s gateway/tests -v。
真实内核隔离测试还覆盖手动选择在重启后保留,以及恢复自动模式。
前端浏览器检查在 gateway/frontend 中执行:

GATEWAY_TEST_URL=http://192.168.188.3:8091/ GATEWAY_TEST_READ_ONLY=1 node tests/smoke.mjs
GATEWAY_TEST_URL=http://192.168.188.3:8091/ node tests/history.mjs

GATEWAY_TEST_READ_ONLY=1 检查登录、实际状态、筛选、切换确认弹窗、断线提示与移动端布局,
不修改实际出口。仅在明确允许真实切换测试时去掉此变量;会临时固定当前节点并恢复原模式。
可通过 CHROMIUM_PATH 指定本机 Chromium。


设计理念

webmirage 不是一个 API 包装层,是一个 Cookie 驱动的反检测数据层。

市面上的工具要么用官方 API(要钱、要审批、有限速),要么用 Playwright 跑浏览器(重、慢、容易崩)。webmirage 走第三条路:用浏览器 Cookie + TLS 指纹模拟,直接调平台的内部 API——跟你在浏览器里打开网页一样的请求,AI 却能在终端里直接用。

🔌 每个平台都是独立插件

webmirage/
├── __main__.py              # 入口:python -m webmirage
├── server.py                # MCP 服务器 — 发现并注册平台工具
├── config.py                # 配置管理(环境变量 + YAML)
└── platforms/
    ├── base.py              # PlatformTools 接口(实现它就能加新平台)
    ├── twitter/             # 9 个工具 — GraphQL 内部 API + TLS 指纹模拟
    │   ├── graphql.py       #   queryId 管理(硬编码 → 社区源 → JS 扫描)
    │   ├── auth.py          #   Cookie 认证
    │   ├── client.py        #   curl_cffi 模拟 Chrome TLS 握手
    │   └── tools.py         #   工具定义
    ├── reddit/              # 5 个工具 — JSON API + 浏览器 Cookie 提取
    │   ├── client.py        #   urllib + CookieJar
    │   └── tools.py         #   工具定义
    ├── xueqiu/              # 5 个工具 — 公共 JSON API + 自选股
    │   ├── client.py        #   自动获取公共 Cookie
    │   └── tools.py         #   行情/搜索/热帖/热门股/自选股
    └── xianyu/              # 5 个工具 — mtop H5 签名直调 + 智能评分
        ├── client.py        #   MD5 签名 + Cookie 认证
        ├── scorer.py        #   评分系统 v3.0
        └── tools.py         #   搜索/评分/详情/我的商品/发货

反检测技术栈

层 技术 说明
TLS 指纹 curl_cffi 模拟 Chrome 的 JA3/JA4 握手指纹,平台看不出你不是浏览器
请求头 x-client-transaction-id Twitter 前端 JS 生成的事务 ID,每次请求自动生成
Cookie 完整转发 不是只发 auth_token + ct0,而是完整 Cookie 链
请求节奏 随机抖动 请求间随机延迟,模拟人类操作节奏
限速 指数退避 HTTP 429 自动重试,逐步退避

各平台技术路线

平台 路线 为什么这么选
Twitter/X 内部 GraphQL API 官方 API v2 要 $100/月;内部 API 跟网页前端用同一个
Reddit .json 端点 + Cookie 匿名接口被封(403);登录态 Cookie 是当前最稳路径
雪球 公共 JSON API 首页访问自动下发 Cookie,公共数据无需登录
闲鱼 mtop H5 API + MD5 签名 不需要 Playwright/Node.js,纯 HTTP 直调,签名 = md5(token&t&appKey&data)

📌 这些都是基于真机实测的当前选型。平台改了反爬我们跟着调,插件架构让换路线只改一个文件。


闲鱼智能评分系统

xianyu_score_search 工具实现了一套独特的、为人机协作设计的评分系统:

维度 分值 评分方 说明
时效性 30 代码自动 新鲜度 × 稀缺度组合矩阵,8 天后稀缺方向反转
基础合规 10 代码自动 有标题/价格/描述/图片/非垃圾
性价比 60 AI 评估 代码提供结构化规格,AI 做跨商品横向对比

时效性矩阵 — 新鲜度 × 稀缺度:

           0-3人想要   4-10人   11-20人   20+人
  今天       30          25       20       15    ← 新+人少=捡漏机会
  2-3天      27          22       17       12
  4-7天      20          16       12        8
  8天+       10          12       14       16    ← 反转:旧+人多=有真实需求
  • 新 + 想要人少 = 高分(刚上架还没被抢,捡漏机会)
  • 旧 + 想要人少 = 低分(挂了好几天没人要,可能有坑)
  • 旧 + 想要人多 = 中分(有真实需求,但可能已经被聊走了)

规格自动提取 — 从标题/描述中识别:

  • 芯片:Apple Silicon(M1-M4)、Intel(i3/i5/i7/i9)、AMD Ryzen、骁龙
  • 内存 + 存储:16+256 → 16G 内存、256G 存储
  • 成色:全新/99新/9成新/8成新
  • 电池健康度、循环次数、保修状态
  • 更多:颜色、配件、版本、屏幕规格、型号……

设计理念:代码做代码擅长的(提取、矩阵评分),把跨商品综合判断留给 AI。


扩展:添加新平台

  1. 创建 webmirage/platforms/<name>/ 包
  2. 实现 PlatformTools 子类:
from ..base import PlatformTools

class MyPlatformTools(PlatformTools):
    name = "myplatform"
    description = "My Platform"

    def is_available(self) -> bool:
        ...

    def get_tool_definitions(self) -> list[dict]:
        ...

    async def handle_call(self, tool_name, arguments) -> str:
        ...
  1. 在 webmirage/server.py 中注册:
ALL_PLATFORMS: list[PlatformTools] = [
    TwitterTools(),
    RedditTools(),
    XueqiuTools(),
    XianyuTools(),
    MyPlatformTools(),   # ← 在这里添加
]

安全性

措施 说明
🔒 凭据本地存储 Cookie 只存在你本机 ~/.webmirage/config.yaml 或 .env,不上传不外传
👀 完全开源 代码透明,随时可审查
🔍 无中间服务器 所有请求直接发往目标平台,不经过任何第三方
🧩 可插拔架构 不信任某个组件?换掉对应的 platform 文件即可
📦 公钥非密钥 源码中的 Twitter Bearer token 是 x.com 前端 JS 公开嵌入的,非密钥

⚠️ 封号风险: 使用 Cookie 的平台(Twitter、闲鱼等),建议使用专用小号。原因:1) 平台可能检测非浏览器 API 调用导致封号;2) Cookie 等同于完整登录权限,用小号可限制泄露影响范围。


依赖要求

  • Python 3.10+
  • 核心:mcp、curl_cffi、xclienttransaction、beautifulsoup4、loguru、pyyaml
  • 可选:browser-cookie3(Reddit / 雪球的浏览器 Cookie 自动提取)

License

MIT

原生低延迟与连接保留验证(仅临时回环服务、读取现有内核二进制,不新建容器):

MIHOMO_LATENCY_TEST=1 python3 -m unittest discover -s tests -p test_mihomo_latency_native.py -v

只读浏览器检测范围、冷却与进度验证(手动探测请求全部拦截为浏览器内模拟):

cd gateway/frontend
GATEWAY_TEST_URL=http://192.168.188.3:8091 node tests/health.mjs

Yorumlar (0)

Sonuc bulunamadi