12306抢票助手代码分析:
文件组成:
mainfest.json
script.js 所有脚本集中区域
主要模块:
UI界面
initUIDisplay:初始化界面入口
injectStyle:注入css
injectDom:插入 注入的显示 界面,初始化其中的控件事件
--------------------------------------------------------------------------
执行环境兼容:
此块代码主要包括了->常用工具类,非安全调用动态脚本,浏览器兼容性 以及相应的 脚本程序主入口
主要类
utility:
isWebKit 校验是否为 webkit的内核
trim 使用jquery 进行字符串trim(去除首尾空格啦) ,还通过正则表达式替换所有句子(所谓的句子,就是以\n换行符号来分隔的形式)中的首尾空格
getTopWindow 获取顶层窗口,用来从子iframe 或者是enframe中获取 其顶层窗口,采用了递归获取的方法
init
包括了对jquery的函数扩展:
any(对数组中不符合指定函数要求return false,并停止继续遍历,返回最后的boolean值) ,
first(与any类似,不过返回的是函数调用的值,所判定遍历的准则为返回的结果不为空)
同时对内置的 toJSON(将值转化成json格式字符串), evalJSON (字符串到json的转化),secureEvalJSON(对字符串进行转化,安全解析字符串到json),quoteString(为字符串添加 "**") 进行扩展
runningQueue 存放日志结构数据的队列,其实就是一个数组啦
appendLog 将日志结构数据添加到队列runningQueue中
showLog 展示相应的日志结构数据 到控制台(runningLog)中 runningLog中
showLoginIE 显示登录的cookie数据到 IE控制台(LoginIECode)中
formatData 主要用来对日志对象进行格式化为 {"key:value"} 其中对value中的 \r \n " 进行转义处理,怕出现 显示问题
notify 提示信息接口,设定信息和关闭的时间
notifyOnTop 存储值中设定提醒信息
closeNotify 关闭提醒
setPref 设定存储值
getPref 获取存储值
unsafeCallback 不安全回调
getTimeInfo 获取当前时间 hh:mm:ss
savePrefs 保存用户输入数据 到 存储值 key :prefix_输入框id value:则为输入的值
reloadPrefs 重新载入用户的输入数据 从存储值中获取值 最后还保存一次
getErrorMsg 格式化 错误信息字符串 显示
delayInvoke 延迟调用 主要用于 有界面提示的 函数调用
saveList 以制表符 \t的方法 组织 列表选项到存储中
loadList 从存储中 组织 列表选项
addOption 添加 新的选项到 列表中
getOptionArray 获得选项的数组格式
inOptionList 判断指定的值是否在列表中
getAudioUrl 获得音乐地址
getFailAudioUrl 获取错误声音地址
playFailAudio 播放错误的声音
resetAudioUrl 恢复音乐地址为默认
parseDate 解析相应的 yyyy-MM-dd 为日期格式 也可以 yyyy/MM/dd
getDate 获得指定日期的天单位
formatDate 将日期转化成 yyyy-MM-dd
formatDateShort 将日期转化成 MM-dd
formatTime 格式化时间 到 dd hh:mm:ss
addTimeSpan 计算指定日期的 偏移时间
serializeForm 按照 表单中的name进行 值的归并
getSecondInfo 将传入的秒 转化成 **小时**分**秒 的格式
post 对jquery ajax 的post的封装
get 对jquery ajax 的get的封装
showDialog 使用 传入jquery 对象的元素 搭建一个 对话框
fishTab 渲染 tab
getLoginRetryTime 获取重新尝试登陆时间
showOptionDialog 配置tab 的显示 和 对话框的显示
addCookie 添加 cookie数据
getCookie 获取cookie数据
setSnInfo 在存储值 和cookie中 name sn ,用来作为注册校验
verifySn 验证 注册
verifySn2 通过sn校验 注册
allPassengers 乘客信息 集合
getAllPassengers 获取所有乘客信息
regCache 正则表达式 缓存
getRegCache 获取缓存中的 正则表达式
preCompileReg 对选项列表 采用 | 的方法 编译成 正则表达式
enableLog 开启 日志 对所有的 ajax请求 加入拦截
enableLoginIE 获取登录到IE的代码
analyzeForm 分析表单 获取其中的 action input tourflag 其实保存在一个 json里面
selectionArea 选择区的 选项操作集合(添加,存储,清空,删除)
getUpdateUrl 根据不同的浏览器 获取更新的地址 具体包括 遨游,火狐 ,猎豹等
unsafeInvoke: 不安全调用 非沙箱模式下的回调
buildCallback: 校验是否 有组建冲突 以及添加 动态脚本
buildObjectJavascriptCode: 将指定的Javascript对象编译为脚本
余下的代码是校验当前的浏览器的 如果校验成功 则初始化所有脚本:
1.记录更新 utility.setPref("updates", updates.join("\t"))
2.初始化界面显示 initUIDisplay
3.不安全注入 dom元素 (我怀疑12306,可以在这个地方做文章进行封杀) unsafeInvoke(injectDom)
4.调用程序入口 entryPoint
--------------------------------------------------------------------------
入口
entryPoint:所有页面逻辑调用的入口 包括的步骤有->
1.页面错误自动刷新
2.登陆页面 自动登录
3.注册码和登录账号 绑定
4.各个模块页面的入口 调用
--------------------------------------------------------------------------
未完成订单查询页面
initNotCompleteOrderPage:通过获取 name=cache_tour_flag中的值,获取订单的状态
--------------------------------------------------------------------------
提交页面
initSubmitOrderQuest: 提交错误页面,如果 有错误信息 直接重新提交父表单,
主要用来查询车票出错的时候,重复提交查询的表单
--------------------------------------------------------------------------
订票页面,声音提示
initPagePayOrder: 从utility中获取声音的地址,进行播放
--------------------------------------------------------------------------
出错自动刷新
autoReloadIfError:根据页面的错误 ,提示出错,并且2秒后刷新页面->用来刷新页面
--------------------------------------------------------------------------
主框架
injectMainPageFunction:校验 页面地址, 检查提示框, 设定播放音乐的函数
--------------------------------------------------------------------------
自动提交 (插件的核心功能模块)
initAutoCommitOrder: 初始化 自动提交订单 和查询的界面 以及初始化
里面包括的有:
显示内部的选择上下铺
自动定位到随机码中
获取乘客信息
自动选择联系人、自动选择上次选择的人
其中将两个界面的 余票信息 和 排队信息数据 集成 ,得到订票的情况判定
autoCommitOrderInSandbox:在沙箱内 进行订票页面的提示
--------------------------------------------------------------------------
自动刷新
initDirectSubmitOrder: 该函数已经失效
--------------------------------------------------------------------------
自动登录
initLogin:初始化 登陆页面
包括:
登陆校验
全屏支持
页面注入
插入登陆标记
记录历史账号密码进行自动登录
对验证码输入事件进行监控,方便自动提交
还有一些用于登陆的函数:包括获取验证码,重新登录,登陆结果判定
initPayOrder:自动重新支付
compareVersion:版本比较 通过按照优先级 比对 .中分隔的 数据
这一块代码中包括了对当前插件版本的比对,从而提示更新的方法