在乐宁报名考试后,要参加在线学习, 上百个课时, 很多视频都是看过 或者没有什么用的,所以还是做了一个自动学习。
由于乐宁改版,这次这个自动学习 弄了一下午,还是 有点难度的 分享给大家。
1.先考虑用按键精灵自带的浏览器,做表单元素抓取,很可惜在视频播放的页面不兼容,吐槽一下按键精灵,2014后没有再更新过了。
//直接打开学习列表
RunApp "http://lening100.com/userStudy!listTrainCourse.action?xxx
Hwnd = Plugin.Window.Foreground()
TracePrint Hwnd
//激活最大窗口
Call Plugin.Window.Active(Hwnd)
Call Plugin.Window.Max(Hwnd)
2.没办法用元素,就只能前台抓取默认浏览器了,我笔记本装的是360急速,为了快速完成工具,我就没有做登录和句柄抓取,都是提前登录好,句柄直接定义好。
抓取页面的链接,这个很简单了,直接前台模拟查看源代码,然后正则匹配一下列表,把所有课程链接匹配出来,这中级也要比对一下学习进度,num就是页面中的学习进度,0到99的是没学习完,链接有效。
//抓取课程:
content = copycode()
TracePrint content
ul = Split(content, "<ul class=""list_show center-list-tab"">")
TracePrint ubound(ul)
for i=1 to ubound(ul)
str = ul(i)
num=regval(str," value=""(\d+)""")
If num >= 0 < 100 Then
link = regval(str, "<a href=""(.+?)"">")
gotolink( "http://lening100.com/"&link)
End If
Next
3.进入课程后,又是一个列表,做法和上一部一样,正则匹配出来有效链接。
'跳转链接
Function gotolink(link)
RunApp link
content = copycode()
tr = Split(content, "<tr>")
TracePrint ubound(tr)
for i=1 to ubound(tr)
str = tr(i)
num=regval(str," value=""(\d+)""")
If int(num) >= 0 and int(num)< 100 Then
link = regval(str, "<a href=""(.+?)"" target")
RunApp ("http://lening100.com/" & link)
times=gettime()
End If
Next
Delay 1000
KeyDown 17, 1
KeyPress 87, 1
KeyUp 17, 1
gotolink=1
End Function
4.进入视频播放学习界面,这部有些麻烦,也是唯一的难点,就是无法获取到视频的真实播放时间,头几年乐宁在列表页就标注好了视频的总时间和已学习时间,这次没有,要是抓取视频显示的时间很麻烦,位置不确定,准确度不高。
5.最后找了一下,发现一个思路是前台抓音频状态,这个可以 提前抓取好音频框的颜色,为了保证准确性做了10次循环 判断。
'获取声音
Function getsecond()
t=0
Do While t < 10
Delay 5000
//取窗口句柄(变量:Volume)窗口的客户区(坐标:83, 283)处的颜色
GetColor = Plugin.Bkgnd.GetPixelColor(Volume, 6, 127)
TracePrint GetColor
if GetColor= "EAEAE7 " then
t = t + 1
Else
t=0
End if
getsecond=t
//退出循环
Loop
End Function
6.虽然程序还是有时不太稳定,受网络波动影响,也不能后台执行,但如果投入更多精力去做工具就失去偷懒的意义了。
将代码片段分享给大家,有经验的同学,按照我的思路和代码很快就可以做好的。
7.总结一下,按键精灵虽然功能较弱,对硬件和底层调用能力太弱,也不能 对网络数据进行处理,但对于重复性,简单的需求,它还是最快的解决工具之一。
'比对时间,没声就关闭页面
Function gettime()
allsecond= getsecond()
If allsecond > 9 Then
Delay 1000
KeyDown 17, 1
KeyPress 87, 1
KeyUp 17, 1
End If
gettime=allsecond
End Function
'复制源码,就是复制到剪切板
Function copycode()
Delay 2000
KeyDown 17, 1
KeyPress 85, 1
KeyUp 17, 1
Delay 500
KeyDown 17, 1
KeyPress 65, 1
KeyUp 17, 1
Delay 500
KeyDown 17, 1
KeyPress 67, 1
KeyUp 17, 1
Delay 500
copycode = Plugin.Sys.GetCLB()
Delay 500
KeyDown 17, 1
KeyPress 87, 1
KeyUp 17, 1
End Function