利用HTTP自动访问技术提高网络管理效率
- 来源:计算机世界 smarty:if $article.tag?>
- 关键字: smarty:/if?>
- 发布时间:2009-12-01 11:23
HTTP协议的浏览器是人们访问互联网常用的主要手段。目前使用程序自动访问Web网页尚属于黑客技术范畴,经常用于自动点击网页广告、自动抢注册等活动,很多网页设置验证码试图阻止机器登陆。随着互联网的普及,大量专业应用以及网络通信设备都使用Browser/Server界面实现,操作人员使用浏览器往往需要做大量简单重复、相对固定的操作,利用程序自动访问可以大幅提高操作效率和操作正确性。
对照图1,在浏览器接口实现自动访问,实质是由程序代替操作人员操作浏览器,优点是直观,可参照人工浏览器操作和响应编程,易于处理网络不稳定、服务器响应延迟等情况;缺点是编程较为复杂。
在服务器接口实现自动访问,实质是由程序取代浏览器直接和服务器交互,优点是编程简单,但要求对HTTP协议有较深入的了解,详细分析页面动作。
我们可以针对不同应用,根据实际情况,选择合适的方法。
自动修改认证服务器用户数据1.1.1
介绍一个实际应用案例:某企业要通过电信提供的Web界面的用户信息管理系统,管理上万个用户账号,人工操作操作复杂、错误率高、响应不及时,尤其在要求限时更新全部用户账号时,人工操作根本不可能完成。为此,某企业开发了一个自动管理用户程序.本应用Windows系统VC++模拟人工浏览器操作实现,由于找到成熟网页操作函数库比较困难,该企业找到了网络佚名作者的WebAuto(1.0.0.1)提供的一些简单易用的网页基本操作函数,刚好满足项目的需要,开发要点如下:
(1)网页操作
VC支持MicroSoftWebBrowserActiveX控件,在系统自动产生的事件处理函数DocumentCompleteExplorer1()中可获取服务器响应的(IHTMLDocument2*)类型的HTML文档,并可在该文档上实现浏览器交互操作,浏览器控件可直观显示操作结果。WebAuto.dll提供了几个基本的网页操作函数:
WEBInputValue():在指定名字的文本框输入文本值
WEBExecScriptFunc():执行指定函数名的JavaScript函数
WEBElemClick():可点击单选按钮
WEBFormSubmit():模拟点击表单提交,IE控件完成实际提交动作
(2)判断返回结果
根据控件的get_LocationURL()判断是否转到目的网页。
WEBGetFrameDoc():从含有Frame框架文档中读取Frame内含文档
WEBGetSource():读取目的文档源码,判断是否有预期结果
(3)点击弹出窗口
有些网页用alert()弹出Message窗口,提示输入错误和返回结果,并一直等待人工输入。调用WEBDlgClick()函数自动点击弹出窗口,结束等待。也可根据函数返回值判断返回文本,确定操作结果成功或失败,或者超时无响应,即没有弹出预期的窗口。在网络不稳定的情况下,应在定时延迟进程中执行自动点击操作。
(4)验证码
网站的验证码用于防止程序自动登录。验证码在网页中用动态URL表示,WEBVerifyCode函数调用验证码URL,在屏幕显示出来,等待人工查看并输入。关于如何自动识别验证码,随不同网站验证码图像复杂程度不同差异很大。
通过自动访问Web技术能够实现用户账号全程自动管理,并且在批量修改时可达到40条/分钟的处理速度,几个小时即可完成上万条数据修改,从而满足批量修改的需求。
网页操作函数库的开发1.1.1.
某企业利用WebAuto.dll满足了该项目开发要求,思路是将网页的操作分解为基本动作,基本动作开发相应的函数,既大大降低了应用程序编程工作量,又避免了库函数开发过于复杂。但它还很不完善,为满足自动访问,一般网页要求至少需要增加和完善以下函数或功能:
(1)自动登陆需要使用基本验证保护的网站,即在弹出窗口自动输入用户和密码;
(2)增加设置SELECT对象,即选择点击选择下拉菜单的函数;
(3)增加对多Frame网页和多表单文档的支持;
(4)支持点选单选按钮组,即同一名字多个值输入。
其中自动登陆和点击确定窗口属于利用Windows系统函数实现,其他都是利用VC的浏览器对象类对HTML文档交互操作。
以下举例说明库函数开发要点:
(1)自动登陆使用基本身份认证
需要在弹出登陆窗口输入用户名、密码,点击确定。应在访问网页前设置定时程序,在定时程序中调用自动登陆程序。自动登陆是嵌套窗口结构。注意弹出登陆窗口不是浏览器的子窗口,故先调用FindWindow()根据窗口标题找到登陆窗口的句柄,再调用FindWindow()根据窗口类名或标题找到各个子窗口,再SendMessage()向各窗口发送消息,设置记忆选择为“不记忆”。
(2)点击选择SELECT对象的实现
VC定义了各种HTML对象。
实现方法是调用各文档对象的get_forms()获得表单集合,再依次调用各对象的item(),QueryInterface,get_name()获得目标SELECT对象,最后调用SELECT的put_selectedIndex()方法设置选择的值。支持多表单的就是get_forms(),读出包含所有表单的集合,逐一读出表单名称,取出与目标表单名称相符的表单即可。
Web操作函数库虽然每条函数只有几十条语句,主要使用各种系统定义各种类型参数调用各种系统函数,编程和调测还是相对繁杂。将访问网页行为分解为十几个对应函数,简单用表单对象名字做参数,接口简单易用,把复杂的系统函数调用封装到函数内,开发自动访问Web应用程序就比较容易了。
Linux系统设备自动设置网络设备1.1.1
上文提到的某企业还有一些分散各地的办公网点,需要自动设置ADSLPPPOE拨号连接。绝大多数路由器仅提供Web界面设置,只有开发HTTP自动访问程序,才能满足动态自动配置的需要。
在Linux环境下,无须理会可视操作界面和弹出窗口、网络延迟等,采用服务器接口比较适宜。“Haxx”的开源项目libcurl提供了Linux和Windows等平台下客户端和Web服务器间用于实现HTTP协议交换数据的函数库。但是由于该企业系统对存储空间要求苛刻,无法使用功能丰富的libcurl库函数,必须转而寻找尽量简单实现基本HTTP协议的函数库。BenCampbell开发的开源软件happyHTTP仅用一个C++源文件就可实现简单的HTTP协议。
以下介绍用happyHTTP实现自动设置路由器的开发要点:
(1)程序结构:
HTTP协议客户端请求和服务器响应基本结构如图2(服务器响应无请求头):
happyHTTP定义一些基本类实现构造和发送请求,接收和分析响应的功能。
调用happyHTTP的:Connection对象的request函数发送GET/POST,调用Connection的pump()函数处理来自服务器的响应。在定义的CALLBACK函数中获取服务器响应文档的相关信息。
(2)基础认证:
绝大多数路由器用基础认证,登录时要求输入用户名和密码,RFC2617描述了基础认证过程:
①客户端发送URL请求;
②服务端发送401文档(无权限),并在HEADER加入”WWW-Authenticate”属性,声明要求basicauthentication;
③客户端重新发送请求,并在以后发送请求HEADER加入”Authorization”属性,设置为经过base64编码的用户名和密码。
这个过程在上一个应用由浏览器控件自动处理。在本应用调用request模拟浏览器发送认证响应,在设置完成前保持连接会话。Base64是简单将二进制数据编码为ASCII码的编码方法,可在libcurl源码中找到该函数。
极少数路由器采用动态网页登陆,不需要基本验证,登陆操作就是普通提交表单操作。
(3)确定请求发送内容和响应处理:
设置一个网页在提交时需要将设置内容发送到路由器。Request请求头目标URL表单ACTION指向。如上所述,HEADER应有身份验证属性和保持连接属性.BODY则是提交网页需要发送的参数。
通过分析网页文件,确定发送的项目和如何处理服务器的响应,这是比较的复杂过程。好在有HTTP协议监控器,可记录请求和响应的详细内容。实际编程时可借助HTTP协议监控器,如EffeTechHttpSniffer,人工进行网页操作,参照EffeTech记录结果,设计发送和接收内容。注意在设置结束前,在请求头中设置Connection“属性为”Keep-Alive“,保持会话连接,准确模拟人工执行连续操作结果。
(4)判断操作执行结果:
①用重定向地址判断。服务器执行完操作后,转向相应网页,或转向错误网页,服务器给出303(重定向)文档,在HEADERLocation属性中可判断是否转向正确网页。
②如需要判断网页内容,可查找文档BODY中指定信息,用于监控路由器状态,如是否已拨号连接成功。
③超时无响应情况下,响应处理函数pump()会超时退出,抛出异常。
应用happyHTTP实现了自动配置功能,正确模拟了人工操作结果,目标代码只有80KB左右,可满足存储空间苛刻的要求。
(5)happyHTTP的不足和改进。
happyHTTP1.0对HTTP协议处理不完善,存在BUG,需要原作者改进。在对存储和内存要求不严格的应用中,推荐使用较为成熟的开源项目libcurl。
随着Web应用不断增加和相关工具不断完善,通过HTTPWeb界面自动访问系统将成为提高网络管理效率的重要手段。
……
对照图1,在浏览器接口实现自动访问,实质是由程序代替操作人员操作浏览器,优点是直观,可参照人工浏览器操作和响应编程,易于处理网络不稳定、服务器响应延迟等情况;缺点是编程较为复杂。
在服务器接口实现自动访问,实质是由程序取代浏览器直接和服务器交互,优点是编程简单,但要求对HTTP协议有较深入的了解,详细分析页面动作。
我们可以针对不同应用,根据实际情况,选择合适的方法。
自动修改认证服务器用户数据1.1.1
介绍一个实际应用案例:某企业要通过电信提供的Web界面的用户信息管理系统,管理上万个用户账号,人工操作操作复杂、错误率高、响应不及时,尤其在要求限时更新全部用户账号时,人工操作根本不可能完成。为此,某企业开发了一个自动管理用户程序.本应用Windows系统VC++模拟人工浏览器操作实现,由于找到成熟网页操作函数库比较困难,该企业找到了网络佚名作者的WebAuto(1.0.0.1)提供的一些简单易用的网页基本操作函数,刚好满足项目的需要,开发要点如下:
(1)网页操作
VC支持MicroSoftWebBrowserActiveX控件,在系统自动产生的事件处理函数DocumentCompleteExplorer1()中可获取服务器响应的(IHTMLDocument2*)类型的HTML文档,并可在该文档上实现浏览器交互操作,浏览器控件可直观显示操作结果。WebAuto.dll提供了几个基本的网页操作函数:
WEBInputValue():在指定名字的文本框输入文本值
WEBExecScriptFunc():执行指定函数名的JavaScript函数
WEBElemClick():可点击单选按钮
WEBFormSubmit():模拟点击表单提交,IE控件完成实际提交动作
(2)判断返回结果
根据控件的get_LocationURL()判断是否转到目的网页。
WEBGetFrameDoc():从含有Frame框架文档中读取Frame内含文档
WEBGetSource():读取目的文档源码,判断是否有预期结果
(3)点击弹出窗口
有些网页用alert()弹出Message窗口,提示输入错误和返回结果,并一直等待人工输入。调用WEBDlgClick()函数自动点击弹出窗口,结束等待。也可根据函数返回值判断返回文本,确定操作结果成功或失败,或者超时无响应,即没有弹出预期的窗口。在网络不稳定的情况下,应在定时延迟进程中执行自动点击操作。
(4)验证码
网站的验证码用于防止程序自动登录。验证码在网页中用动态URL表示,WEBVerifyCode函数调用验证码URL,在屏幕显示出来,等待人工查看并输入。关于如何自动识别验证码,随不同网站验证码图像复杂程度不同差异很大。
通过自动访问Web技术能够实现用户账号全程自动管理,并且在批量修改时可达到40条/分钟的处理速度,几个小时即可完成上万条数据修改,从而满足批量修改的需求。
网页操作函数库的开发1.1.1.
某企业利用WebAuto.dll满足了该项目开发要求,思路是将网页的操作分解为基本动作,基本动作开发相应的函数,既大大降低了应用程序编程工作量,又避免了库函数开发过于复杂。但它还很不完善,为满足自动访问,一般网页要求至少需要增加和完善以下函数或功能:
(1)自动登陆需要使用基本验证保护的网站,即在弹出窗口自动输入用户和密码;
(2)增加设置SELECT对象,即选择点击选择下拉菜单的函数;
(3)增加对多Frame网页和多表单文档的支持;
(4)支持点选单选按钮组,即同一名字多个值输入。
其中自动登陆和点击确定窗口属于利用Windows系统函数实现,其他都是利用VC的浏览器对象类对HTML文档交互操作。
以下举例说明库函数开发要点:
(1)自动登陆使用基本身份认证
需要在弹出登陆窗口输入用户名、密码,点击确定。应在访问网页前设置定时程序,在定时程序中调用自动登陆程序。自动登陆是嵌套窗口结构。注意弹出登陆窗口不是浏览器的子窗口,故先调用FindWindow()根据窗口标题找到登陆窗口的句柄,再调用FindWindow()根据窗口类名或标题找到各个子窗口,再SendMessage()向各窗口发送消息,设置记忆选择为“不记忆”。
(2)点击选择SELECT对象的实现
VC定义了各种HTML对象。
实现方法是调用各文档对象的get_forms()获得表单集合,再依次调用各对象的item(),QueryInterface,get_name()获得目标SELECT对象,最后调用SELECT的put_selectedIndex()方法设置选择的值。支持多表单的就是get_forms(),读出包含所有表单的集合,逐一读出表单名称,取出与目标表单名称相符的表单即可。
Web操作函数库虽然每条函数只有几十条语句,主要使用各种系统定义各种类型参数调用各种系统函数,编程和调测还是相对繁杂。将访问网页行为分解为十几个对应函数,简单用表单对象名字做参数,接口简单易用,把复杂的系统函数调用封装到函数内,开发自动访问Web应用程序就比较容易了。
Linux系统设备自动设置网络设备1.1.1
上文提到的某企业还有一些分散各地的办公网点,需要自动设置ADSLPPPOE拨号连接。绝大多数路由器仅提供Web界面设置,只有开发HTTP自动访问程序,才能满足动态自动配置的需要。
在Linux环境下,无须理会可视操作界面和弹出窗口、网络延迟等,采用服务器接口比较适宜。“Haxx”的开源项目libcurl提供了Linux和Windows等平台下客户端和Web服务器间用于实现HTTP协议交换数据的函数库。但是由于该企业系统对存储空间要求苛刻,无法使用功能丰富的libcurl库函数,必须转而寻找尽量简单实现基本HTTP协议的函数库。BenCampbell开发的开源软件happyHTTP仅用一个C++源文件就可实现简单的HTTP协议。
以下介绍用happyHTTP实现自动设置路由器的开发要点:
(1)程序结构:
HTTP协议客户端请求和服务器响应基本结构如图2(服务器响应无请求头):
happyHTTP定义一些基本类实现构造和发送请求,接收和分析响应的功能。
调用happyHTTP的:Connection对象的request函数发送GET/POST,调用Connection的pump()函数处理来自服务器的响应。在定义的CALLBACK函数中获取服务器响应文档的相关信息。
(2)基础认证:
绝大多数路由器用基础认证,登录时要求输入用户名和密码,RFC2617描述了基础认证过程:
①客户端发送URL请求;
②服务端发送401文档(无权限),并在HEADER加入”WWW-Authenticate”属性,声明要求basicauthentication;
③客户端重新发送请求,并在以后发送请求HEADER加入”Authorization”属性,设置为经过base64编码的用户名和密码。
这个过程在上一个应用由浏览器控件自动处理。在本应用调用request模拟浏览器发送认证响应,在设置完成前保持连接会话。Base64是简单将二进制数据编码为ASCII码的编码方法,可在libcurl源码中找到该函数。
极少数路由器采用动态网页登陆,不需要基本验证,登陆操作就是普通提交表单操作。
(3)确定请求发送内容和响应处理:
设置一个网页在提交时需要将设置内容发送到路由器。Request请求头目标URL表单ACTION指向。如上所述,HEADER应有身份验证属性和保持连接属性.BODY则是提交网页需要发送的参数。
通过分析网页文件,确定发送的项目和如何处理服务器的响应,这是比较的复杂过程。好在有HTTP协议监控器,可记录请求和响应的详细内容。实际编程时可借助HTTP协议监控器,如EffeTechHttpSniffer,人工进行网页操作,参照EffeTech记录结果,设计发送和接收内容。注意在设置结束前,在请求头中设置Connection“属性为”Keep-Alive“,保持会话连接,准确模拟人工执行连续操作结果。
(4)判断操作执行结果:
①用重定向地址判断。服务器执行完操作后,转向相应网页,或转向错误网页,服务器给出303(重定向)文档,在HEADERLocation属性中可判断是否转向正确网页。
②如需要判断网页内容,可查找文档BODY中指定信息,用于监控路由器状态,如是否已拨号连接成功。
③超时无响应情况下,响应处理函数pump()会超时退出,抛出异常。
应用happyHTTP实现了自动配置功能,正确模拟了人工操作结果,目标代码只有80KB左右,可满足存储空间苛刻的要求。
(5)happyHTTP的不足和改进。
happyHTTP1.0对HTTP协议处理不完善,存在BUG,需要原作者改进。在对存储和内存要求不严格的应用中,推荐使用较为成熟的开源项目libcurl。
随着Web应用不断增加和相关工具不断完善,通过HTTPWeb界面自动访问系统将成为提高网络管理效率的重要手段。
关注读览天下微信,
100万篇深度好文,
等你来看……