在现有应用程序中“注入”JavaScript 以操纵 UI (qwebirc)

Posted

技术标签:

【中文标题】在现有应用程序中“注入”JavaScript 以操纵 UI (qwebirc)【英文标题】:"Inject" JavaScript in existing application to manipulate the UI (qwebirc) 【发布时间】:2012-10-16 12:53:50 【问题描述】:

我需要将一些 javascript 注入现有应用程序。

应用程序通常嵌入iframe,如下所示:

<html>
<body>
    <iframe src="http://webchat.quakenet.org/"  ></iframe>
</body>
</html>

它是一个基于 JavaScript 的开源 IRC 客户端 http://webchat.quakenet.org/ (source)。

现在我喜欢注入一些 JS 来突出显示特殊消息。为此,我已经找到要覆盖的 HilighterClass。

问题是,我该怎么做?我猜想将 JS 注入 iFrame 不是现代浏览器“允许”的,或者?

如果iFrame 有问题,也许我可以像他们一样添加客户端:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <base />
  <title>QuakeNet Web IRC (qwebirc)</title>
 ...
  <script type="text/javascript">
    var ui = new qwebirc.ui.Interface("ircui", qwebirc.ui.QUI, "appTitle":"QuakeNet Web     IRC","dynamicBaseURL":"/dynamic/leibniz/","baseURL":"http://webchat.quakenet.org/","validateNickname":false,"networkServices":["Q!TheQBot@CServe.quakenet.org"],"nickValidation":    "maxLen":15,"validSubChars":"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_[]`^\\|0123456789-","validFirstChar":"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_[]`^\\|","minLen":2,"staticBaseURL":"/static/leibniz/","loginRegex":"^You are now logged in as [^ ]+\\.$","networkName":"QuakeNet");
  </script>
</head>
<body>
  <div id="ircui">
    <noscript>
      <div id="noscript">Javascript is required to use IRC.</div>
    </noscript>
  </div>
</body>
</html>

要求:

客户端应该连接到 quakenet.org 服务器。由于某些跨站点脚本限制,这可能是个问题。 如果我的用户不需要其他插件,那最好。

【问题讨论】:

【参考方案1】:

您可以使用像 Privoxy 这样的代理服务器,它可以将 JavaScript 注入页面。不幸的是,您的用户必须通过 Privoxy 进行所有浏览,所以这可能不是一个选择。

或者您在中继之前设置自己的反向代理(例如 Squid)和 change the contents。您可以将对 JavaScript 库的请求替换为对您自己的库的调用,该库包含原始 JavaScript 加上您的突出显示代码。

你肯定听说过Greasemonkey,这是一个可以做到这一点的浏览器插件——注入内容。

【讨论】:

我认为 Greasemonkey 真的是我唯一的选择 :(【参考方案2】:

您不能操纵 iframe 的内容。跨站点脚本不是这里的问题。

【讨论】:

【参考方案3】:

为了使注入最简单,您可以使用 Gatejs SPDY/HTTP proxy 并使用 the injection gatejs opcode - 它适用于正向和反向代理。

Gatejs 注入会尝试将您的 html 代码添加到 HTML (text/html) 类型的内容中。

下面是一个使用注入的正向代理示例。

var serverConfig = function(bs)  return(
    hostname: "testServer0",
    runDir: "/tmp/gatejs",
    dataDir: "/path/to/dataDir",
    logDir: "/var/log/gatejs",

    http: 
        testInterface: 
            type: 'forward',
            port: 8080,
            pipeline: 'pipetest'
        ,
    ,
    pipeline: 
        pipetest: [
            ['injection', 
                 code: "<h1>w00t injection</h1>"
            ],
            ['proxyPass',  mode: 'host', timeout: 10 ]
        ],
    
);

mk-

【讨论】:

我是 *** 的新手,我才意识到我做了什么 :) 另一个人也这么说。

以上是关于在现有应用程序中“注入”JavaScript 以操纵 UI (qwebirc)的主要内容,如果未能解决你的问题,请参考以下文章

在 Blazor 应用程序中自动注入 javascript

在 asp.net mvc 中处理 javascript 注入

如何将一行代码注入现有函数?

将javascript注入WebChromeClient

在Chrome扩展程序中,您可以强制在一切之前注入一些javascript吗?

如何声明对现有命名空间的引用,该命名空间可在运行时从 JavaScript 包中获得