首页
社区
课程
招聘
[原创]IE浏览器之页面模拟操作(非注入)
发表于: 2017-6-5 10:20 6645

[原创]IE浏览器之页面模拟操作(非注入)

2017-6-5 10:20
6645

很粗浅的一点知识,献丑了。

需求就是在页面上做点击和输入操作:1.登录,如果登录成功就切换页面,在新页面上进行点击,执行固定的操作,比如输入一段话。2.登录不成功,则获取下一组账号重复步骤1。

在思考如何做的时候,首选使用SetCursorPos,还有模拟点击的win32 api来搞,因为简单。


一。首先遇到一个问题,也是最主要的问题:如果判断页面加载成功呢?因为网速总是会波动的把,如果用sleep的方式,万一网页没有加载完毕sleep就返回了,此时点击函数执行不会有任何效果!所以sleep是绝不能用在判断网页是否加载完成,必须想一个其他的辙才行。

       很是纠结了一会,翻翻msdn,问问度娘,也没个结果(也许是我打开的方式不对)。于是乎,慢慢观察IE。发现状态栏可以为我解决这个问题,请看下面的图,以论坛为例子

当鼠标在页面的空白处时,从图中可以看到状态栏是空的,一旦将鼠标移动到任意一个图片,按钮,文本等等上,则状态栏就会出现对应的说明字符。看下图,鼠标放在“论坛版务”上,

状态栏有文字内容了。

经过反复观察,发现状态栏确实可以作为判断网页是否加载完毕的依据。理由如下:

a.如果我们的目标位置有说明文字,则一旦鼠标移动过去,检查状态栏没有任何文字内容,说明页面没有加载完毕,当前不具备点击条件,需要等待。

b.如果我们的目标位置没有说明文字,则就向下找一个比目标位置更晚加载的网页元素(有说明文字的),且移动鼠标过去,如果状态栏有文字内容,说明网页具备点击条件了,因为比目标位置更晚加载的都可以显示说明文字了,说明目标位置一定是准备好了。否则需要等待

c.如果需要等待,就在等待的过程中,将鼠标移动到屏幕任意位置,等待一会儿比如2秒,再重新移动到目标位置去检查状态栏的变化


二。那如何获取IE状态栏的文字说明呢

SPY++提供了一些线索,打开SPY++,这工具还是很好使的。

当前进程信息都有,找到IE,会看到2个,只关心带+号的(为啥下面还有1个?这个是不是主进程,然后带加号的是IE真正的工作线程?有大牛能告知一二不?)

弹开+号,逐级向下找会找到状态栏的窗口句柄,看下面的图,"msctls_statusbar32"就是他的类名

到这里,基本上就有眉目了,状态的的句柄和类名都看到了,SPY++能获取到它,则我们应该也能。因此剩下的就是在代码中获取它,然后通过WM_GETTEXT消息就能获得文本内容了。


三.实际代码操作

   a.获得IE的句柄  

    FindWindow()就可以了。不多说

   b.枚举IE子窗口,直到获得状态栏的句柄,下图代码就是获取状态栏句柄的枚举回调,这也比较简单。

      

   c.获取状态栏的文本内容,如下图,就是一句sendmessage的事,ie还是很尽职的,消息发过去就会告诉我们文本内容了。同时设置N个控制位,获取的状态栏文字就在此做比对,标志位不同,比对数据不同,这样就可以判断目标位置是否准备完毕可以点击了

     

   d.输出的操作,涉及到输出英文和中文,在网上抄一点,自己再写一点,折腾出一个自定义的input类,既用到了sendinput也用到了keybd_event。基本也够用了,见附件。

   e.点击

    


四。以上问题都解决好,再考虑好适当的延时,基本上在实际代码执行点击的时候还是很顺的. 如果是在虚拟机里运行,呵呵,就是一后台执行了,压根也不会管。不足之处就是,碰到验证码的话就得找打码平台解决了,搞不定。


欢迎指点!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
为什么不试试com呢?
2017-6-5 10:42
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
纯按键的啊,缺点是只能同时操作一个,还有可以被检测到。
2017-6-5 10:49
0
雪    币: 26
活跃值: (79)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
是滴,同时只能玩一个。IE检测我干嘛?
2017-6-5 10:53
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
该上cef了
2017-6-5 11:13
0
雪    币: 7
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Jquery的ready方法

复制代码
//:  判断网页是否加载完成         
                      document.onreadystatechange  =  function  ()  {           
                              if(document.readyState=="complete")  {                       
                                      document.getElementById('divprogressbar').style.display='none';           
                              }         
                      } 
可以用jQuery的代码来检查DOM元素是否都加载完成,按键精灵有个网页操作插件里头有完整的函数,可以直接操作html对象,用来刷论坛金币速度那个快,就是插件是用vb生成的ActiveX  DLL弄了一星期也没用VS2010调用成功,有兴趣楼主可以研究一下,插件名字叫:WebOperation.dll。可以去按键精灵的论坛搜,如果楼主成功用VC调用成功了记得发站内信告诉我。
2017-6-5 11:31
0
雪    币: 8
活跃值: (277)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
  WebBrowser  可以通过DocumentCompleted事件来判断网页是否加载完毕
2017-6-5 11:49
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
无边 纯按键的啊,缺点是只能同时操作一个,还有可以被检测到。
不要因为按键不被检测,尤其是mouse_event这种不正规的操作。
2017-6-8 08:29
0
雪    币: 7515
活跃值: (5347)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
大家都有年轻的时候,最后一句,如果是在虚拟机里运行,呵呵,就是一后台执行了,压根也不会管。你要后台操作IE,直接7楼说的Document,啥毛病都没有!!
2017-6-8 09:17
0
游客
登录 | 注册 方可回帖
返回
//