You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在旧版iMacros(v8.9.7)中异步加载FingerprintJS并获取visitor ID

问题根因
  • 旧版iMacros v8.9.7的JS脚本运行在浏览器扩展的特权沙箱上下文,和当前页面的window上下文相互隔离
  • 你动态插入到页面的FingerprintJS脚本加载完成后,FingerprintJS对象只会挂载到页面的window对象上,不会暴露到iMacros的脚本运行上下文,直接访问自然会报未定义错误
  • 控制台运行正常是因为控制台默认绑定当前页面上下文,可直接读取到页面挂载的全局对象
解决方案

核心思路是将所有依赖FingerprintJS的逻辑注入到页面上下文执行,需要在iMacros上下文使用结果时,将结果挂载到页面window的自定义属性,再通过wrappedJSObject(老火狐扩展访问页面自定义属性的规定写法)读取。

修改后可直接在iMacros中运行的代码如下:

function get_fingerprint() {
    // 注入指纹获取逻辑到页面上下文
    const injectLogic = window.document.createElement("script");
    injectLogic.textContent = `
        window._fpPending = true;
        // 加载FingerprintJS
        const fpLib = document.createElement("script");
        fpLib.src = "https://cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs@3/dist/fp.min.js";
        fpLib.onload = () => {
            FingerprintJS.load()
                .then(fp => fp.get())
                .then(res => {
                    window._fpVisitorId = res.visitorId;
                    window._fpPending = false;
                })
                .catch(err => {
                    window._fpError = err;
                    window._fpPending = false;
                });
        };
        fpLib.onerror = () => {
            window._fpError = "指纹库加载失败";
            window._fpPending = false;
        };
        document.head.appendChild(fpLib);
    `;
    window.document.head.appendChild(injectLogic);

    // 轮询等待指纹结果,适配旧版iMacros不支持async/await的环境
    const checkTimer = setInterval(() => {
        const isPending = window.wrappedJSObject._fpPending;
        if (!isPending) {
            clearInterval(checkTimer);
            const error = window.wrappedJSObject._fpError;
            const visitorId = window.wrappedJSObject._fpVisitorId;
            if (error) {
                console.error("指纹获取失败:", error);
            } else {
                // 此处visitorId即为获取到的结果,可直接使用
                console.log("获取到的visitorId:", visitorId);
            }
            // 清理页面挂载的临时属性
            delete window.wrappedJSObject._fpPending;
            delete window.wrappedJSObject._fpError;
            delete window.wrappedJSObject._fpVisitorId;
        }
    }, 100);
}

get_fingerprint();
注意事项
  • 不要直接在iMacros脚本上下文调用页面加载的第三方库全局对象,两类上下文隔离无法直接互通
  • 如果不需要在iMacros侧处理指纹结果,可把所有逻辑都写在注入的脚本内,不需要额外轮询读取结果

内容的提问来源于stack exchange,提问作者Rapiera Agnay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 11:27:05