小工具开发笔记—IE自动填表器 -- 第二篇:执行一段JavaScript脚本

系列导航:

引子

时刻三年,我原本无心继续更新这篇博文。恰巧近日招商银行网站全新改版,导致我之前开发的小工具无法正常使用,故萌生念头动手开发自动填表器2.0版本。此文将作为博文的一个延续以及补充,不过内容将会围绕2.0版本来讲解。之前的博文也会更新下载2.0填表器。

简介

首先啰嗦一下为什么1.0填表器不能工作于新版招行。原因很简单,因为1.0只支持有限HTML标签(如HtmlInput, HtmlImage等)。全新改版后的招行“不但”支持了Webkit浏览器,“而且”在页面里面嵌入了frame -- 这是1.0填表器所不能支持的一个控件,也是1.0填表器当时的一个backlog。受限于C++开发的缓慢节奏,我并不打算将这些HtmlElement一一用C++的类来实现,为了一劳永逸解决这个问题,2.0版本引入了动态执行JavaScript脚本的功能 -- 用JS脚本来解决实际业务问题,开发快速,灵活,简单。

OK,再用一句话概括一下2.0填表器:这是一个IE插件,会在IE的工具栏上面添加一个按钮,点击后根据预配置信息以及当前URL自动寻找一段预编辑的JS,然后在当前页面上下文里执行。

image

看一下2.0的文件结构

image

  • athena.dll: 填表器主程序(智慧女神雅典娜?)
  • athena.js: 主配置脚本
  • jquery.js: 工具脚本
  • *.js: 针对某个页面的自动化脚本

首先看一下athena.js配置脚本文件,

image

以上是athena.js配置脚本,是一个JSON格式的文件。里面有两部分信息:preload是一个string array,每一个成员指向一个js脚本,作用是在执行bot之前先执行这些脚本;pages是一个JSON array,每个成员有url和bot两个属性,url用来和当前页面url匹配,如果匹配成功,则执行bot里面的js文件(会先执行preload里面的每一个js,这样就可以用jquery的方法啦)

然后再看一下cmbchina.js主程序,这个脚本负责自动填表招商银行在线支付页面,

image

以上则是cmbchina.js,用来自动化操作招行在线支付页面。JS代码就不做多解释了,本文主要讲C++实现。需要一提的是JS里面有一句话 var bot = new ActiveXObject("Noria.Bot"); 这是创建一个COM对象,用来操作招行本身的ActiveX控件。这个COM对象也是C++开发的,我会在下文介绍。

功能实现

现在开始介绍C++代码。首先,这里会出现两个C++类,更准确的说是两个ATL Simple Object。

1. CBot类,ProgID=Noria.Bot,暴露一个Fill方法,输入参数是HTMLElement, BSTR, LONG,输出参数无,作用是对ActiveX对象填表。其核心代码如下:

image

2. CKaleidoscope类(万花筒?嗯),没有ProgID,要实现IOleCommandTarget接口。这个类用来在IE工具栏上内嵌一个按钮,并且处理点击事情。其核心代码如下:

image

好吧,看到这里也许会发现,我把核心逻辑实现压入到一个叫做Autobot的类里面。是的,这里Autobot不是汽车人的意思,而是自动填表机器人,其方法run的大致逻辑如下:

  1. 检查上下文,获取当前window和document对象
  2. 加载athena.js配置脚本
  3. 获取当前页面url,检查athena对象里是否有与之匹配的预定义信息
  4. 若无,则结束
  5. 若有,则分别加载并执行preload里的js文件,然后执行匹配的bot文件

其实把逻辑说清楚了就没什么太多技术含量了,我在这里贴出两处核心代码,一是如何找到当前的window和document,二是如果执行一段JS脚本

image

image

尾声

行文至此,基本上阐述了填表器2.0的工作原理和主要功能实现,希望对读者能有所帮助。最后献上一段视频吧,用来充分演示填表器2.0的强大功能。

<程序下载地址>

[补充] 由于实在没有时间测试并且进一步优化,此程序目前只能保证在IE9+Win7环境正常运行。(Win8+IE10基本上不能工作:( )

<在线浏览代码>

posted @ 2013-03-10 16:24  Miles Chen  阅读(5184)  评论(6编辑  收藏  举报