小工具开发笔记—IE自动填表器 -- 第二篇:执行一段JavaScript脚本
系列导航:
- 小工具开发笔记—IE自动填表器 -- 第零篇:序
- 小工具开发笔记—IE自动填表器 -- 第一篇:你好,世界
- 小工具开发笔记—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,然后在当前页面上下文里执行。
看一下2.0的文件结构
- athena.dll: 填表器主程序(智慧女神雅典娜?)
- athena.js: 主配置脚本
- jquery.js: 工具脚本
- *.js: 针对某个页面的自动化脚本
首先看一下athena.js配置脚本文件,
以上是athena.js配置脚本,是一个JSON格式的文件。里面有两部分信息:preload是一个string array,每一个成员指向一个js脚本,作用是在执行bot之前先执行这些脚本;pages是一个JSON array,每个成员有url和bot两个属性,url用来和当前页面url匹配,如果匹配成功,则执行bot里面的js文件(会先执行preload里面的每一个js,这样就可以用jquery的方法啦)
然后再看一下cmbchina.js主程序,这个脚本负责自动填表招商银行在线支付页面,
以上则是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对象填表。其核心代码如下:
2. CKaleidoscope类(万花筒?嗯),没有ProgID,要实现IOleCommandTarget接口。这个类用来在IE工具栏上内嵌一个按钮,并且处理点击事情。其核心代码如下:
好吧,看到这里也许会发现,我把核心逻辑实现压入到一个叫做Autobot的类里面。是的,这里Autobot不是汽车人的意思,而是自动填表机器人,其方法run的大致逻辑如下:
- 检查上下文,获取当前window和document对象
- 加载athena.js配置脚本
- 获取当前页面url,检查athena对象里是否有与之匹配的预定义信息
- 若无,则结束
- 若有,则分别加载并执行preload里的js文件,然后执行匹配的bot文件
其实把逻辑说清楚了就没什么太多技术含量了,我在这里贴出两处核心代码,一是如何找到当前的window和document,二是如果执行一段JS脚本
尾声
行文至此,基本上阐述了填表器2.0的工作原理和主要功能实现,希望对读者能有所帮助。最后献上一段视频吧,用来充分演示填表器2.0的强大功能。
[补充] 由于实在没有时间测试并且进一步优化,此程序目前只能保证在IE9+Win7环境正常运行。(Win8+IE10基本上不能工作:( )