- 网页自动化两种方式:通过 IE 操作网页(进程外)和内嵌 IE 控件到 AHK GUI 中(进程内,请参阅 GUI 控件类型中的示例):
两者在操作网页 DOM 上是一致的。 - 一楼:良好的网页操作示例,包含修改网页内容、检测网页事件等,以本论坛登录页面为例。
- 四楼:网页操作基础入门,通过分析源码说明了基本网页元素的操作方法,以老官方论坛搜索页面为例(似乎打不开?)。
- 五楼:网页操作基础入门,使用 ahk web recorder 快速获取网页信息,以百度登录页为例,部分代码基于 AutoHotkey Classical。
- linpinger 的教程:操作网页、使用wget模拟http的get/post来模拟登录并获取资源等,并回复了大量网页操作的问题。
JScript 代码注入网页:以后可能会扩展这部分内容
学习 DHTML,与 DOM 的关系
网页操作辅助工具:iWB2 Learner、ahk web recorder
网页调试工具:一般浏览器自带或作为扩展,如 Firefox 中的 Firebug。
抓包分析工具:HttpWatch/HTTP Debugger Pro/HttpFox(Firefox)
外部操作网页工具:curl、wget(自动化网页的第三种方式)
参考一些现成的工具:网页自动操作通用工具、网页点击专家、网页幽灵、网页自动提交监控工具等
注:以上内容由 amnesiac 补充。
写着玩的
Code: Select all
; DOM示例.ahk
; DOM 文档:
; http://www.w3school.com.cn/xmldom/xmldom_reference.asp
; http://www.w3schools.com/jsref/dom_obj_all.asp
; http://www.w3school.com.cn/htmldom/htmldom_reference.asp
#NoEnv
#SingleInstance Force
SetBatchLines -1
ListLines Off
ComObjError(False)
; =================================
; 界面
; =================================
Gui, Margin, 0, 0
Gui Add, ActiveX, w800 h500 vWB, Shell.Explorer
Gui, Show
; =================================
; 打开网页,并等待加载完毕
; =================================
OpenLoginPage:
WB.Navigate("http://ahkscript.org/boards/ucp.php?mode=login")
While WB.readystate != 4 or WB.busy
Sleep 10
; 如果已经登录则退出
if !InStr(WB.LocationUrl, "login")
{
Gui, +OwnDialogs
MsgBox, 36, 确认退出登录, 脚本需要退出论坛的登录,是否允许?(因为此脚本是在登录页面进行演示的)
IfMsgBox, No
{
MsgBox, 好吧。请手工退出登录后再运行此脚本。再见!
ExitApp
}
; 退出登录
WB.document.getElementById("menubar").all.tags("a")[0].Click()
While WB.readystate != 4 or WB.busy
Sleep 10
Goto, OpenLoginPage
}
; =================================
; 修改网页
; =================================
doc := WB.doc
doc.getElementById("username").Disabled := True ; 禁用【用户名输入框】
doc.getElementById("password").Disabled := True ; 禁用【密码输入框】
doc.getElementById("username").style.backgroundColor := "A0FABF" ; 修改【用户名输入框】背景色
doc.getElementById("password").style.backgroundColor := "FDCAAE" ; 修改【密码输入框】背景色
doc.getElementById("login").value := "点击登录 :)" ; 修改【登录按钮】文字
doc.getElementById("login").style.Color := "Red" ; 修改【登录按钮】文字颜色
doc.getElementById("login").style.backgroundColor := "FFFF00" ; 修改【登录按钮】背景颜色
doc.images[0].src := "http://t1.qpic.cn/mblogpic/7d0ba55a04cb2e504246/2000.jpg" ; 修改 logo 图片
; =================================
; 监测事件
; =================================
; 监测 doc 事件
ComObjConnect(doc, doc_events)
; 监测登录按钮所在 form 的事件
form := doc.forms[0]
ComObjConnect(form, "LoginForm_")
; 监测登录按钮事件
LogInBtn := doc.getElementById("login")
ComObjConnect(LogInBtn, "LogInBtn_")
; 监测登录按钮上级<TD>事件
LogInBtnPTD := LogInBtn.parentNode
ComObjConnect(LogInBtnPTD, "LogInBtnPTD_")
; =================================
; 设置定时移动登录按钮
; =================================
LogInBtn.style.position := "relative" ; 按钮位置设为相对位置
MoveStep := -50 ; 按钮移动步伐
BtnW := LogInBtn.offsetWidth ; 按钮宽度
BtnPW := LogInBtn.parentNode.offsetWidth ; 按钮的上级元素的宽度
SetTimer, Move_LogInBtn, 200
Return
; =================================
; 移动登录按钮
; =================================
Move_LogInBtn:
x += MoveStep
LogInBtn.style.left := x
BtnX := LogInBtn.offsetLeft
MoveStep := ( BtnX < Abs(MoveStep) || (BtnX + BtnW >= BtnPW) ) ? -MoveStep : MoveStep
Return
; =================================
; 关闭界面则退出脚本
; =================================
GuiClose:
ExitApp
; ================================================== 以下是函数 ==================================================
; =================================
; 整个 wb 文档的事件
; =================================
Class doc_events
{
oncontextmenu(doc) {
doc.parentWindow.event.returnvalue := False ; 取消事件的动作
MsgBox, 右键被禁用了
}
OnClick(doc) {
if doc.parentWindow.event.srcElement.name in username,password
doc.parentWindow.event.srcElement.value := doc.parentWindow.event.srcElement.name
}
ondblclick(doc) {
MsgBox, 检测到双击
}
}
; =================================
; 登录按钮所在 form 的事件
; =================================
LoginForm_onsubmit(form) {
form.document.parentWindow.event.returnvalue := False ; 取消事件的动作
form.document.getElementById("login").value := "点击登录 :)" ; 按钮文字会被网页恢复,这里重新修改【登录按钮】文字
MsgBox, 登录动作被取消了
}
; =================================
; 登录按钮上级 <TD> 的事件
; =================================
; 鼠标悬停
LogInBtnPTD_onmouseover(LogInBtn) {
SetTimer, Move_LogInBtn, Off ; 停止移动按钮
}
; 鼠标移开
LogInBtnPTD_onmouseout(LogInBtn) {
SetTimer, Move_LogInBtn, 200 ; 恢复移动按钮
}
; =================================
; 登录按钮的事件
; =================================
; 鼠标悬停
LogInBtn_onmouseover(LogInBtn) {
LogInBtn.style.backgroundColor := "FDD0FD"
}
; 鼠标移开
LogInBtn_onmouseout(LogInBtn) {
LogInBtn.style.backgroundColor := "FFFF00"
}