最近一个朋友在拍沪牌,多次不中,于是到网上买了一个软件,号称可以很大程度的提高中标率,果然用了之后,两次就中。然后。。。,他就走上了代拍这条不归路。。。还让我帮他去输验证码。看后发现,其实那个软件完全就是按键精灵制作,难度肯定不大。于是有了我也来仿做一个的想法(因为久闻按键精灵的方便,但从未使用过)。
首先,其主要功能为:
1、定时出价
2、识别当前的最低可成交价,从而来确定点击出价的时间
3、放大验证码
第一步,也是最烦锁的一步,就是找各个需要点击的点的从标位置,因为是在浏览器中,所以我们记录下的相对于浏览器里的位置放在 .ini文件中
配置文件格式以这种形式:
[小节名]
#后面跟注释
变量名 = 值
[default]
#系统参数
#位置坐标文件版本和更新时间
Base_Pos_X =8
Base_Pos_Y =55
代码中读取
//基准坐标
Base_Pos_X = Plugin.File.ReadINI("default", "Base_Pos_X", "cc.ini") + 0
Base_Pos_Y = Plugin.File.ReadINI("default", "Base_Pos_Y", "cc.ini") + 0
第二步,需要打IE,输入指定网扯,再调整IE的大小和位置,因为这样才能使网页中按钮在屏幕的指定位置(按键精灵使用的是屏幕坐标),这里我使用的是361度窗口插件,这个地方用系统方法也可以达到同样的效果,我是因为后面用到,所以一并用这个插件了。
这里先做了检测IE是否已经打开,已经打开就跳过了这一步
HwndEx = Plugin.Window.Search(IE_Search_String)
Hwnd = 0
MyArray = Split(HwndEx, "|")
If UBound(MyArray) >= 0 Then
Hwnd = Clng(MyArray(0))
End If
If Hwnd <> 0 Then
MessageBox("检测到IE已经打开")
Else
RunApp (IE_EXE_Path&" "& Bid_Path)
Delay 1000
HwndEx = Plugin.Window.Search(IE_Search_String)
MyArray = Split(HwndEx, "|")
If UBound(MyArray) >= 0 Then
Hwnd = Clng(MyArray(0))
End If
End If
Call Plugin.WndEx7_20.SetWindowStyle(Hwnd,6)
//Call Plugin.Window.Move(Hwnd, 0, 0)
Call Plugin.WndEx7_20.MoveWindow(Hwnd, 0, 0)
//Call Plugin.Window.SetClientSize(Hwnd, IE_Width, IE_Height)
Call Plugin.WndEx7_20.SetWindowSize(Hwnd, IE_Width, IE_Height)
//Call Plugin.Window.Top(Hwnd, 1)
Call Plugin.WndEx7_20.SetWindowZOrder(Hwnd,0)
第三步,这里还需要显示很多提示信息到窗口上,可以继续用361度插件的函数,这里我用的是大漠插件
1、注册大漠,这里我用的 regsvr32 用注册,要不然总是不成功,我看别人不用这一句也可以,不知道为什么(?)
//注册大漠
Sub register()
temp_path = Plugin.sys.GetDir(3)
PutAttachment temp_path,"dm.dll"
Set ws = createobject("Wscript.Shell")
ws.run "regsvr32 atl.dll /s"
ws.run "regsvr32 dm.dll /s"
Delay 1000
Set ws = nothing
call Plugin.RegDll.Reg (temp_path&"dm.dll")
Set dm = createobject("dm.dmsoft")
ver = dm.ver()
If len(ver) = 0 Then
MessageBox "插件注册失败,检查系统是否禁用了vbs脚本权限"
EndScript
End If
End Sub
2、绘制提示窗口到指定位置
//画提示窗口///
foobar_hotkey_tip = dm.CreateFoobarRoundRect(0, tip_top_X, tip_top_Y, tip_width, tip_height, 10, 10)'画圆角窗口
dm_ret = dm.FoobarSetFont(foobar_hotkey_tip,"宋体",12,1)'设置文本字体大小,加粗
dm_ret = dm.FoobarFillRect(foobar_hotkey_tip, 0, 0, 800, 400, "67599d")'设置矩形条颜色
dm_ret = dm.FoobarDrawText(foobar_hotkey_tip, 10,10,tip_width-20,tip_height-20, "助手版本V 1.0.0", "FFFFFF", 1)
dm_ret = dm.FoobarUpdate(foobar_hotkey_tip)'刷新
3、更新配置文件 , 一般这种坐标信息,可能会经常需要变动,因为每次启动程序后需要更新。这里更新时,主要遇到了编码问题,使用官方接口更改编码并没有什么卵用。于是我修改一下
//下载文件
Sub downloadFile(url, savePath)
//说明:支持远程获取文本内容,如:MsgBox lib.网络.获得网页源文件("http://www.anjian.com/test.txt")
//例子:MsgBox lib.网络.获得网页源文件("http://www.anjian.com")
Dim xmlUrl
Dim ThisCharCode ,NextCharCode ,BytesToBstr
If InStr(url, "http://") = 0 Then
xmlUrl = "http://" & url
Else
xmlUrl = url
End If
Dim xmlHttp
Set xmlHttp = CreateObject("Microsoft.XMLHTTP")
xmlHttp.Open "Get", xmlUrl, False
xmlHttp.Send
xmlBody = xmlHttp.ResponseBody
Set xmlHttp = Nothing
Set ObjStream = CreateObject("Adodb.Stream")
With ObjStream
.Type = 1
.Mode = 3
.Open
.Write xmlBody
.Position = 0
.Type = 2
.Charset = "GB2312"
BytesToBstr = .ReadText
.Close
End With
Set ObjStream = Nothing
result = BytesToBstr
If len(result) > 0 Then
If Plugin.File.IsFileExist(savePath) Then
Plugin.File.DeleteFile(savePath)
End If
ret = Plugin.File.WriteFileEx(savePath , result)
ret = Plugin.WndEx7_20.MsgBoxEx(Plugin.Window.Foreground() ,"更新配置文件成功!","更新",1,3000,4096)
Else
ret = Plugin.WndEx7_20.MsgBoxEx(Plugin.Window.Foreground() ,"更新配置文件失败!","更新",1,3000,4096)
End If
// MessageBox result
downloadFile = result
End Sub
这样前面准备算是完成了,启动窗口,位置和大小都固定好了。
后面可以新建一个脚本,按下快捷键启动后,进行时间判断,到时间后,将相应的鼠标操作,比较简单,就不再罗列了。
然后就是一个放大验证码功能,我也是找了很久才找到这个方法,使用了361度插件
我这里做的是,先找到是否有一个取消按钮,只有在验证码弹出窗口才会有取消按钮。
Plugin.WndEx7_20.SetPictureRgnImage 通过这个函数的适配窗口大小来放大验证码。
verify_foobar = 0
Sub scaleImg()//放大验证码
FindPic IE_Width/2,IE_Height/2,IE_Width,IE_Height,"plugin/Cancel.bmp",0.8,intX,intY
If intX > 0 And intY > 0 Then //找到取消按钮则出验证码
dm_ret = dm.Capture(Cap_Code_TopLeft_X, Cap_Code_TopLeft_Y, Cap_Code_RightBottom_X, Cap_Code_RightBottom_Y, "Log/verify_code.bmp")
//画验证码窗口///
ver_width = Cap_Code_RightBottom_X - Cap_Code_TopLeft_X
ver_height = Cap_Code_RightBottom_Y - Cap_Code_TopLeft_Y
If verify_foobar = 0 Then
//verify_foobar = dm.CreateFoobarRect(0, 200, nScrHeight - 200, ver_width*2, ver_height*2)'画圆角窗口
verify_foobar = Plugin.WndEx7_20.CreatePictureRgn(0, Verify_Scale_Pos_X, nScrHeight + Verify_Scale_Pos_Y, ver_width*Verify_Scale, ver_height*Verify_Scale)
Call Plugin.WndEx7_20.SetPictureRgnStyle(verify_foobar,1)
End If
Call Plugin.WndEx7_20.SetPictureRgnImage(verify_foobar,"Log/verify_code.bmp")
Call Plugin.WndEx7_20.SetWindowZOrder(verify_foobar,0)
Else
If verify_foobar <> 0 Then
Call Plugin.WndEx7_20.SetWindowState(verify_foobar,0)
verify_foobar = 0
End If
End If
End Sub
识别我就做的比较随意了,都是用的人家现成的字库,现成长配置
调用大漠的 dm.Ocr() 这个函数
然后就基本上完成了那个软件的主要功能了
一次使用按键,发现其真心的方便,写个辅助什么的,基本上可以很快完成。虽然我主要用的是源码模式,他的普通模式,那种接近口语编程方式还也是我第一次接触到,挺牛X的