如何在 3rd 方应用中基于 API 调用和回调触发函数

Posted

技术标签:

【中文标题】如何在 3rd 方应用中基于 API 调用和回调触发函数【英文标题】:How to trigger function based on API call and callback in 3rd party app 【发布时间】:2021-01-09 11:38:00 【问题描述】:

我正在尝试在我的网站上侦听来自第 3 方应用程序的 javascript 回调。该应用程序已缩小,因此很难进行逆向工程。但是,使用 Chrome 调试器后,我想捕获的回调如下,有什么方法可以在触发“CollectEvent”回调时触发一个函数,并访问“email”变量?您可以在控制台中看到,正在窗口上创建回调,当然每次代码运行时它们的名称都不同。

认识到我无法直接编辑该代码,因为它是第 3 方库的一部分。

!function() 
    var _0x14bdc8 = 
        'CollectEvent': function(_0x4a9e64, _0x3ac5b7) 
            if (_0x4a9e64) 
                _0x14bdc8[_0x304d('0xa7')] && (_0x30053a('COUPON_CODE_COOKIE_NAME', _0x4a9e64[_0x304d('0xd7')], 0x1),
                _0x14bdc8[_0x304d('0x6a')]());
                var _0x562cf7 = 
                    'shopId': _0x14bdc8[_0x304d('0xc2')],
                    'campaignId': _0x14bdc8[_0x304d('0x79')],
                    'email': encodeURIComponent(_0x4a9e64[_0x304d('0x23')]),
                    'code': _0x4a9e64['code'],
                    'customFields': encodeURIComponent(JSON[_0x304d('0x3')](_0x3ac5b7)),
                    'domain': window[_0x304d('0x73')][_0x304d('0x4a')],
                    'currentUrl': window[_0x304d('0x73')][_0x304d('0x6b')]
                ;
                _0x14bdc8[_0x304d('0xa0')](_0x986b46 + '/api/wheelioapp/collectemail', _0x562cf7, function(_0xea4ea9) 
                    _0xea4ea9[_0x304d('0x89')] && _0x14bdc8[_0x304d('0x8f')](!0x1, !0x1, !0x0, !0x1);
                );
             else
                alert(_0x304d('0x80'));
        ,
    ...
    

您可以在这里看到控制台中的 Wheelio 应用程序对象和已创建的回调(尽管每个会话的名称不同)。

【问题讨论】:

什么“第三方应用程序”?那是一个插件,比如 jQuery 插件之类的吗?你首先想做什么? @JeremyThille 这是我的 Shopify 网站上的一个弹出窗口,它会在人们订阅我们的时事通讯时收集他们的电子邮件地址。我们希望将会话监控和电子邮件捕获联系起来,因此从我们的分析工具中,我们可以说电子邮件 xyz@xyz.com 与浏览会话 abc 匹配。 “第 3 方应用程序”不使用 JQuery。 哦,我明白了:/ 不幸的是,我对 Shopify 的了解绝对是 0!但是,如果您可以编辑上面的代码,您可以通过将_0x562cf7 对象设为全局对象来破解这个东西:window["dataYouNeed"] = _0x562cf7,然后您可以从任何地方访问它:window.dataYouNeed.email。编辑:忘记这一点,您说您无法编辑此代码。然后我看不到解决方案:( @JeremyThille 好的,感谢您的关注。我想我想知道是否有一个异步模式来识别回调将如何生成,然后将一个 Promise 类型链链接到它的后面。 您想要什么:阅读电子邮件(将其记录在某处)或在此回调中更改它? 【参考方案1】:

我只需要记录它

好吧,好吧。我们无法更改即时创建的函数,但我们可以更改其他 window 函数。

例如我们可以使用encodeURIComponent。看到这一行:

'email': encodeURIComponent(_0x4a9e64[_0x304d('0x23')]),

这意味着电子邮件将以某种方式进入encodeURIComponent。很好,因为我们可以在那里阅读:

/* At the beginning */
// This is helper function, detects correct email:
function validateEmail(email) 
    const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$/;
    return re.test(String(email).toLowerCase());

// Keep old function
let oldEncodeURIComponent = window.encodeURIComponent;
// Crete new one
window.encodeURIComponent = (data) => 
  if (validateEmail(data)) 
    // Gotcha!
    console.log('[encodeURIComponent]', data);
  
  return oldEncodeURIComponent(data);


/* Here program works as normal, but creates lots of logs... */

/* In the end */
// If we can understand when we need to stop looking for email,
//   we will disconnect our function:
window.encodeURIComponent = oldEncodeURIComponent;

所以我们的想法是读取通过encodeURIComponent 传递的所有数据。

附:电子邮件验证器is here

【讨论】:

真的很整洁 - 谢谢。我会看看我能不能让它工作:) 这是一个巧妙的解决方案!另一种类似方式的可能解决方案是覆盖 XMLHttpRequest API 或在您自己的站点上安装一个服务工作者来审查出站流量。仍然是一种拦截器,只是它更通用,在不使用encodeURIComponent 时起作用。

以上是关于如何在 3rd 方应用中基于 API 调用和回调触发函数的主要内容,如果未能解决你的问题,请参考以下文章

在 3rd 方 iPhone 应用程序中支持照片和视频的 AirPlay

如何配置 3rd-party 应用程序?

将多个 3rd 方 GraphQL API 包装在单个 GraphQL 端点中

Apollo 服务器多个 3rd 方 API

谁在 Linux 系统中调用了我的 DBus API

我如何使用 websocket 让我了解 3rd 方 api 中的实时数据