☰
anti-mage的assess包API完全参考:Evaluate与Decode两个入口的完整用法和示例
2026/10/9 1:43:39 网站建设 项目流程

anti-mage的assess包API完全参考:Evaluate与Decode两个入口的完整用法和示例

【免费下载链接】anti-mageFor detecting anti-detect browsers and spoofed profiles through runtime coherence analysis.项目地址: https://gitcode.com/gh_mirrors/an/anti-mage

本文带你一次性读懂anti-mage的assess包——这个包是整个反检测浏览器检测工具链中,做运行时一致性分析的进程内入口。它只暴露两个入口:assess.Evaluate把"你已采集到的观测数据"直接判定打分,assess.Decode则安全地解析来自被检测环境的 JSON 载荷。掌握这两个入口,你就能在自己的 Go 项目里嵌入一套无需特征库、只靠"自相矛盾"来抓异常环境的评分能力。

💡anti-mage用一个 0–100(步长为 10)的分数衡量"一个浏览器环境有多自洽":分数越高,说明该环境自我矛盾越多。全部源码见 readme.md。


🧭 一分钟看懂:两个入口分别解决什么问题

assess是"你手里已经有数据"时的入口。它把数据喂给底层引擎(位于 internal/scan/),换回一个判定 + 一个分数 + 一句人话解释。

入口你给它什么它还你什么典型场景
assess.Evaluate(env)进程内构造好的Environment结构体Assessment(判定/分数/说明)你自己采集完数据,直接打分
assess.Decode(b)被检测环境 POST 上来的 JSON 字节一个"只含安全字段"的Environment接收外部载荷,再交给Evaluate

两者常被串联使用:Decode负责"安全地读",Evaluate负责"正确地判"。


🔍 入口一:assess.Evaluate —— 从观测数据直接得到判定

Evaluate是一个纯函数:没有全局状态、不读时钟、不碰文件系统、不发网络请求,对恶意输入也是"总能返回、绝不 panic"的。签名如下(见 assess/assess.go#L115):

a := assess.Evaluate(env)

1. 构造 Environment

核心是Observations:一张以"探针 id"为键的观测表,每条观测带一个状态和一段原始 JSON 值(见 assess/assess.go#L21-L24)。

env := assess.Environment{ Observations: map[string]assess.Observation{ "scope.main": {Status: assess.StatusOK, Value: mainThreadFacts}, "native.tostring": {Status: assess.StatusOK, Value: accessorSources}, "font.resolved": {Status: assess.StatusUnsupported}, }, FontControls: controls, // 由你在"提问前"选定 OffsetDates: dates, // 由你在"提问前"选定 ElapsedMS: int(time.Since(issued) / time.Millisecond), }

⚠️ 只有StatusOK会被当作证据;StatusUnsupported、StatusError、空状态一律不计入打分(见 assess/assess.go#L14-L19)。浏览器"没答上来"永远不会被扣分。

三个状态常量一览:

状态含义是否计入证据
assess.StatusOK成功读到✅ 是
assess.StatusUnsupported该环境不支持此接口❌ 否
assess.StatusError读取出错❌ 否

2. 用 Findings 补充"库没采集的证据"

Findings让你把自己算出来的结论并入同一个分数(见 assess/assess.go#L40-L44)。每个Finding带一个名字和一个Verdict:

Verdict含义
assess.Consistent一致,不加分
assess.Contradiction矛盾,显著抬分
assess.Modified表面被改写,抬分
assess.Unverified参考数据缺失,不进分母
assess.Inconclusive读不出结论,只降低置信度

📌Findings与Observations会被折叠进同一个分数;一个Contradiction带来的抬升,和库自己发现的矛盾等价。

3. 读回判定:有序、可比较、可当策略用

Evaluate返回的Assessment携带有序的Determination(见 assess/assess.go#L59-L113),因此"策略"就是一次比较:

if a.Determination.AtLeast(assess.Discrepant) && a.Score >= 30 { reject() // 已出现矛盾且分数越过阈值 } if !a.Determination.Established() { tooLittleWasRead() // 读到的太少,任何方向都不敢下结论 }

Determination从弱到强共 5 级:

等级常量直觉
0NotEvaluated什么都没读到,此判定不代表任何结论
1Insufficient没有矛盾,但证据太少,两个方向都不敢说
2Coherent读到的部分与"它自称的平台"全部吻合
3Discrepant出现一处"不可能同时为真"的矛盾
4Instrumented环境看起来被改写了(隐私/无障碍/内容拦截工具也会落到这一档)

📥 入口二:assess.Decode —— 安全解析外部 JSON 载荷

当观测数据以 JSON 形式从被检测环境传来时,用Decode读取(见 assess/decode.go#L12-L56):

env, err := assess.Decode(body) if err != nil { // 只有"不是 JSON 对象"才返回 ErrNotAnObject } a := assess.Evaluate(env)

它的安全边界是这个包的设计精髓:

  • ✅ 只读nonce(顶层)与probes/observations两个字段(二者视为同一字段,见 assess/decode.go#L10)。
  • ❌绝不从载荷里取走elapsedMs、offsetDates、fontControls、findings——这些"提问、时钟、补充证据"必须由调用方自己选定,不能由被检测环境自证。
  • 🧯 对乱码/截断载荷"能读多少算多少",不 panic;只有整体不是 JSON 对象时才返回ErrNotAnObject。

💻 最小可运行示例

下面两段取自官方示例 assess/example_test.go,可直接照搬:

① 进程内直接判定

a := assess.Evaluate(assess.Environment{ Observations: map[string]assess.Observation{ "scope.main": {Status: assess.StatusOK, Value: mainThreadFacts}, "native.tostring": {Status: assess.StatusOK, Value: accessorSources}, }, FontControls: controls, OffsetDates: dates, ElapsedMS: int(time.Since(issued) / time.Millisecond), }) fmt.Println(a.Determination, a.Score, len(a.Supplied))

② 解析外部载荷再判定

body := []byte(`{"v":1,"nonce":"n1", "probes":{"auto.residue":{"status":"ok","value":{"webdriver":true}}}}`) env, _ := assess.Decode(body) fmt.Println(assess.Evaluate(env).Determination) // → instrumented

⚖️ 分数 Score 意味着什么

Score是一个 0–100、步长为 10 的估计值(见 assess/assess.go#L240-L248),衡量的是一组独立证据而非单项检查:

  • 单调:只有证据能抬升它,没有任何证据能降低它;
  • 量化:步长固定为 10,你设的阈值不会漂移;
  • 保守:从不因"缺少某功能"而给分;0只表示"没有读到矛盾",绝不等于"未被改写"。

评分细节由底层引擎实现,完整分节顺序见 internal/scan/scan.go。


📁 相关源码与模块路径

想继续深入,从这几处入手即可:

  • 进程内入口与打分:assess/assess.go
  • 载荷安全解析:assess/decode.go
  • 官方示例(可直接运行):assess/example_test.go
  • 底层一致性分析引擎:internal/scan/
  • 经过核实的常量参考表:reference/
  • 字体族解析(作为"下限"而非结论):osfont/
  • 回环 HTTP 服务(选输入、守时钟):server/

🔁 如需获取完整代码:git clone https://gitcode.com/gh_mirrors/an/anti-mage,项目要求Go 1.24+且零外部依赖。

掌握Evaluate与Decode这两个入口,你就拥有了把"运行时一致性分析"嵌进任意 Go 服务的全部钥匙:Decode保证"只读该读的",Evaluate保证"只判该判的"。

【免费下载链接】anti-mageFor detecting anti-detect browsers and spoofed profiles through runtime coherence analysis.项目地址: https://gitcode.com/gh_mirrors/an/anti-mage

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

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

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

立即咨询