最近一个朋友在拍沪牌,多次不中,于是到网上买了一个软件,号称可以很大程度的提高中标率,果然用了之后,两次就中。然后。。。,他就走上了代拍这条不归路。。。还让我帮他去输验证码。看后发现,其实那个软件完全就是按键精灵制作,难度肯定不大。于是有了我也来仿做一个的想法(因为久闻按键精灵的方便,但从未使用过)。
首先,其主要功能为:
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的