如何完成这个滑块验证码

lhzxymd2010 2018-07-09 02:20:53
1.网址 http://gkcf.jxedu.gov.cn/
2.用VB如何实现自动拖动,完成验证。

求源码
...全文
1773 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
脆皮大雪糕 2018-07-14
  • 打赏
  • 举报
回复
预览和最后发出去的不是一个东西。真丢技术网站的脸……
都不知道改版的目的是啥
lhzxymd2010 2018-07-14
  • 打赏
  • 举报
回复
感谢举杯邀明月的解答....操作成功啦
舉杯邀明月 2018-07-12
  • 打赏
  • 举报
回复
晕,“预览”时,代码块效果正常,我还以为CSDN恢复以前的那个“代码高亮”模块了呢。


结果提交后,发现“代码的行号”与代码还是“错位”的。
舉杯邀明月 2018-07-12
  • 打赏
  • 举报
回复
不知道楼主搞定没?
我倒是弄了个测试程序,验证成功了(“位置扫描”经过了多次验证无误,恐怕有“近百次”了)。

代码如下:
Option Explicit

Private Declare Sub mouse_event Lib "User32" (ByVal dwFlags As Long, _
ByVal dx As Long, _
ByVal dy As Long, _
ByVal dwData As Long, _
ByVal dwExtraInfo As Long)
Private Declare Function ClientToScreen Lib "User32" ( _
ByVal hWnd As Long, _
ByRef lpPoint As POINTAPI) As Long
Private Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As Long) As Long

Private Type POINTAPI
cx As Long
cy As Long
End Type

Private arrData(199, 99) As Long
Private mlGrayVal As Long
Private mlBlockX As Long
Private mlBlockY As Long
Private mlBaseX As Long
Private mlBaseY As Long


Private Sub GetImageData()
Dim cp#, cm As Double
Dim wx&, wy As Long
Dim i&, k&, w As Long

wx = 275 + (WebBrowser1.Width \ 15 - 817) \ 2 ' X坐标
wy = 436 ' 网页中“图片”位置在窗口客户区的 Y坐标
mlBaseX = wx
mlBaseY = wy
cm = 0
Call BitBlt(Picture1.hDC, 0&, 0&, 200&, 100&, Me.hDC, wx, wy, vbSrcCopy)
For wx = 0 To 199
For wy = 0 To 99
k = Picture1.Point(wx, wy)
w = 2775& * (255& And k): k = k \ 256&
w = w + 5448& * (255& And k): k = k \ 256&
cp = (w + 1058 * k) / 9281
cm = cm + cp
arrData(wx, wy) = cp
Next
Next
mlGrayVal = cm / 20000
End Sub

Private Sub MouseDrag()
Const MOUSEEVENTF_ABSOLUTE As Long = &H8000
Const MOUSEEVENTF_LEFTDOWN As Long = 2
Const MOUSEEVENTF_LEFTUP As Long = 4
Const MOUSEEVENTF_MOVE As Long = 1
Dim stcCP As POINTAPI
Dim w&, u As Long
Dim k As Double

stcCP.cx = 16& + mlBaseX
stcCP.cy = 111& + mlBaseY
Call ClientToScreen(Me.hWnd, stcCP)
k = 983040 / Screen.Width
w = stcCP.cx * k
u = stcCP.cy * 983040 / Screen.Height
DoEvents
Call mouse_event(MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE, w, u, 0&, 0&)
DoEvents
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0&)
DoEvents
w = w + k * mlBlockX
Call mouse_event(MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE, w, u, 0&, 0&)
DoEvents
Call mouse_event(MOUSEEVENTF_LEFTUP, 0&, 0&, 0&, 0&)
End Sub

Private Sub ScanPostion()
Dim arrBuffer(199, 99) As Long
Dim px&, py As Long
Dim wx&, wy As Long
Dim w&, u&, i&, k&, m As Long

mlBlockX = -1
u = mlGrayVal + 0.3 * (255& - mlGrayVal)
If (&HEC& < u) Then u = &HEC&
For wx = 0 To 199
For wy = 0 To 99
arrBuffer(wx, wy) = (u < arrData(wx, wy))
Next
Next
For wy = 20 To 75 Step 25
w = 0
For wx = 0 To 160
Do
m = arrBuffer(wx, wy)
If (w And Not m) Then
u = 39 + wx
For i = wx To u
If (arrBuffer(i, wy)) Then Exit For
Next
If (u > i) Then m = -1&: wx = i: Exit Do
w = wy - 25
If (0 > w) Then w = 0
For i = wy To w Step -1
If (arrBuffer(wx, i)) Then Exit For
Next
If (w > i) Then wx = u: Exit Do
w = 38& + wx
For k = wx - 1& To w
If (Not arrBuffer(k, i)) Then Exit For
Next
If (w > k) Then wx = u: Exit Do
u = wx - 1&
w = 39& + i
For k = i To w
If (Not arrBuffer(u, k)) Then Exit For
Next
If (w > k) Then Exit Do
mlBlockY = i
mlBlockX = u
wy = 100
Exit For
End If
Exit Do
Loop
w = m
Next ' Next wx
Next ' Next wy

End Sub

Private Sub Command1_Click()
WebBrowser1.Navigate "http://gkcf.jxedu.gov.cn/"
End Sub

Private Sub Command2_Click()
Call GetImageData
Call ScanPostion
If (-1& = mlBlockX) Then
Call MsgBox("识别失败。", 64)
Else
Picture1.Line (mlBlockX - 2, mlBlockY)-(mlBlockX - 20, mlBlockY), vbRed
Picture1.Line (mlBlockX, mlBlockY - 2)-(mlBlockX, mlBlockY - 20), vbRed
Picture1.Line (mlBlockX + 2, mlBlockY)-(mlBlockX + 20, mlBlockY), vbRed
Picture1.Line (mlBlockX, mlBlockY + 20)-(mlBlockX, mlBlockY + 2), vbRed
Call MouseDrag
End If
End Sub

Private Sub Form_Load()
Picture1.AutoRedraw = True
Picture1.ScaleMode = 3
End Sub

Private Sub Form_Resize()
WebBrowser1.Width = Me.ScaleWidth
WebBrowser1.Height = Me.ScaleHeight
End Sub


注意上面代码“第40行”,那个Y坐标,可能需要按实际情况进行调整。
我的代码中,WebBrowser1.Top = 480 ,对应的 y是436(反正这个值不能差异太大)
当然,那个“图片位置”可以用其它方法来确定(动态获取、处理),那就能适应各种情况了。
主要注意的是,窗口、WebBrowser控件不能太小:宽度要足够宽、高度要够大,必须要把整个区域显示出来。

运行程序,点Command1访问网站(重复点它,可以刷新图片),成功“访问完成”后,点Command2开始识别、验证。
贴张效果图:

lhzxymd2010 2018-07-11
  • 打赏
  • 举报
回复
谢谢你们的回答,我是新手,很多知识不够。我是用WebBrowser 控件,怎样才能获得图片?
舉杯邀明月 2018-07-11
  • 打赏
  • 举报
回复
用 API函数:BitBlt( ) “拷贝窗口图像”,就可以了。
反正那“一块图像区域”也不大,可以Copy到PictureBox上,进行处理。
WebBrowser控件必须是“可见”的,窗体也必须是“显示出来”了的。
WebBrowser控件和窗体的宽度、高度不能太小,必须把那一块“操作区域”显示出来。

然后就是扫描那个“方块”的位置了。
确定位置之后,计算“坐标”参数,用 mouse_event这个API模拟操作鼠标就行了。
舉杯邀明月 2018-07-10
  • 打赏
  • 举报
回复
那个还好,直接把“缺口”显示出来了。
我看到有几个网站的,需要鼠标点住、拖动一点儿,才显示出该拖到哪部位。
并且有些是矩形,也有“五角星”形的。
脆皮大雪糕 2018-07-10
  • 打赏
  • 举报
回复
注意我的嘴型:截图!
这种拖滑块的方式,背景图都是被分割成小块乱序排列组成的。而且你仔细看代码,小图是用base64编码的方式直接写进去的,所以你下载不到图片。有效的办法是获取浏览器的句柄,然后获取界面的图片,再到确定坐标内取到你现在看到的背景图。扫描背景图,找到方框位置,计算滑块需要划动的距离,然后用鼠标消息模拟拖曳操作拖过刚才计算出来的距离。
lhzxymd2010 2018-07-10
  • 打赏
  • 举报
回复
谢谢楼上提供的思路,我试了下,可连图都下载不了。能给点代码吗?
脆皮大雪糕 2018-07-09
  • 打赏
  • 举报
回复
截图,获取那个正方形的位置,计算需要划动的距离,模拟鼠标操作,拖曳滑块到相应的位置
# tencent_crack_captcha 腾讯滑块验证码缺口坐标识别,基于opencv-python ## 腾讯滑块 以下三个文件均为识别腾讯滑块缺口距离的方案,都基于opencv-python完成,使用模板匹配或者轮廓检测方案。具体的效果没有测试过,不过比很多网上的代码应该好一些。欢迎大家测试后给我反馈。 1. findContours.py 2. threshold.py 3. matchTemplate.py ## 网易滑块 以下文件为网易易盾滑块的缺口识别方案,同样欢迎大家测试效果。 1. wangyi/yd_hk.py ## 环境 python 3.x opencv-python 4.x.x numpy 1.20.x -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧