早些天,因项目需要做了一个自动登陆网站的ActiveX插件。主要功能就是通过这个插件启动一个IE实例或者使用插件所在的浏览器,
打一个网站(即通过Navigate导航),通过IHTMLDocument2接口找到相关元素,并填入相应的值,最后模拟点击登陆按钮,完成登陆。这种
方法简单,而且理论上属于模拟人工登陆,受限性比较小。但是它有一个缺点,就是有打开登陆页面,填入值的过程,没有直接进入登陆
后的页面看上去更自然。
再次查看MSDN,IWebBrowser2::Navigate声明:
HRESULT Navigate( BSTR url,
VARIANT *Flags,
VARIANT *TargetFrameName,
VARIANT *PostData,
VARIANT *Headers
);
第四个参数是PostData,那是否可以附带PostData数据直接登陆进去呢?向下看
PostData:
[in] Pointer to data to send with the HTTP POST transaction. For example, the POST transaction is used to send data gathered
by an HTML form. If this parameter does not specify any post data, IWebBrowser2::Navigate issues an HTTP GET transaction.
意思是说在这里指定PostData参数与通过 HTML form提交是一样的。当然是可行了。
这个参数的类型是VARIANT,MSDN:
The post data specified by PostData is passed as a SAFEARRAY Data Type structure. The VARIANT should be of type VT_ARRAY and point
to a SAFEARRAY Data Type. The SAFEARRAY Data Type should be of element type VT_UI1, dimension one, and have an element count equal
to the number of bytes of post data.
看明白了,PostData是一个一维的,元素类型是VT_UI1的数组,长度为PostData的字节长。我们首先来产生这个数组:
Code
HRESULT GetPostData(CComVariant &vPostData,LPCSTR szPostData)
{
HRESULT hr;
LPSAFEARRAY psa;
psa = SafeArrayCreateVector(VT_UI1, 0, strlen(szPostData));
if (!psa) {
return E_OUTOFMEMORY;
}
LPSTR pPostData;
hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, szPostData, strlen(szPostData));
hr = SafeArrayUnaccessData(psa);
vPostData.vt = VT_ARRAY | VT_UI1;
vPostData.parray = psa;
return S_OK;
}
关于SafeArrayCreateVector,SafeArrayAccessData等函数的更多用法,请参考。
第五个参数Headers设定为"Content-Type: application/x-www-form-urlencoded"很熟悉吧,和HTTP协议头一样的。用个简单例了结束她吧:
Code
int LoginWebByIE(LPCSTR szUrl,LPCSTR szHeaders,LPCSTR szPostData)
{
HRESULT hr;
CComQIPtr<IWebBrowser2> pWebBrower;
hr = pWebBrower.CoCreateInstance(CLSID_InternetExplorer);
pWebBrower->put_Visible(VARIANT_TRUE);
CComBSTR bstrURL(szUrl);
CComVariant vHeaders;
vHeaders.vt = VT_BSTR;
vHeaders.bstrVal = SysAllocString(CComBSTR(szHeaders).Detach());
CComVariant vFlags;
vFlags.vt = VT_I4;
vFlags.lVal = navNoReadFromCache | navNoWriteToCache;
CComVariant vTargetFrameName;
//加上下面这段浏览器就会在一个新的窗口打开页面,几个参数都试过,
//效果都一样,还没清楚是什么原因。
// vTargetFrameName.vt = VT_BSTR;
//vTargetFrameName.bstrVal= SysAllocString(L"_SELF");
CComVariant vPostData;
GetPostData(vPostData,szPostData);
hr = pWebBrower->Navigate(bstrURL, &vFlags,
&vTargetFrameName, &vPostData, &vHeaders);
pWebBrower.Release();
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(0);
CComVariant vUrl("http://www.iteye.com/login");
char postData[36] = "name=anranran&password=hehe";
LoginWebByIE("http://www.iteye.com/login","Content-Type: application/x-www-form-urlencoded\r\n",postData);
CoUninitialize();
return 0;
}
其中Navigate可以换成Navigate2,唯一需要改的是Navigate2第一个参数类型。
分享到:
相关推荐
### Switch-and-Navigate: 控制数据摆渡在有界消息延迟下的移动性 #### 概述 本研究探讨了在高度分区的网络中控制移动数据摆渡(数据摆渡指的是在网络断开连接的不同域之间传输数据的移动节点)的问题。传统上,...
刷新插件的目标是通过自动ajax调用页面的任何元素来简单地刷新。 消息 使用旧版 jquery-navigate 的网站获得了 2012 年谷歌移动网站分发领域的谷歌奖,主要是因为网站的速度。 属性 以下是将调用 refresh() 方法的...
使用易语言实现的IE下载功能可以应用于各种场景,如批量下载工具、网页资源抓取、自动更新软件等。通过理解和修改源码,开发者可以根据需要扩展功能,例如添加断点续传、多线程下载、进度显示等。 综上所述,这个...
easy-navigate.vim Vim常用的导航键盘映射将它们存储在这样的单独插件中,以保持.vimrc干净安装使用插件管理器Plugin 'NLKNguyen/easy-navigate.vim' 或手动将easy-navigate.vim复制到~/.vim/plugin/按键图在缓冲区...
easy-navigate.vim Vim常用的导航键盘映射将它们存储在这样的单独插件中,以保持.vimrc干净安装使用插件管理器Plugin 'NLKNguyen/easy-navigate.vim' 或手动将easy-navigate.vim复制到~/.vim/plugin/按键图在缓冲区...
FCU-Navigate是一个面向对象编程的最终项目,主要用于FCU(可能是某个大学或机构的缩写)的学生或教师,提供导航服务。项目基于Java技术栈,这表明它使用了Java语言进行开发,可能还涉及了Java相关的框架和库。在这...
本程序"C#控制IE自动访问网站的程序"旨在提供一个解决方案,使用C#编程语言来实现这一功能。C#是一种强大的、面向对象的编程语言,特别适合开发Windows应用程序,包括与Internet Explorer(IE)浏览器交互的应用。 ...
const navigatePlugin = require ( 'mineflayer-navigate' ) ( mineflayer ) ; const bot = mineflayer . createBot ( { username : 'Player' } ) ; // install the plugin navigatePlugin ( bot ) ; // optional ...
苗条+ Vite 该模板将帮助您开始在Vite中使用Svelte进行开发。推荐的IDE设置 + 。需要一个正式的Svelte框架吗? 查看 ,它也由Vite提供支持。 通过无服务器优先的方法在任何地方进行部署,并适应各种平台,并提供对...
盖茨比极简启动器 :rocket: 快速开始 创建一个Gatsby网站。 使用Gatsby CLI创建一个新站点,并指定最小的启动器。 # create a new Gatsby site using the minimal starter npm init gatsby 开始开发。...
语言:English (UK) 此扩展在chrome中添加了一个上下文菜单,该菜单允许将base64字符串直接编码和解码到剪贴板中。… 此扩展在chrome中添加了一个上下文菜单,该菜单允许将base64字符串直接编码和解码到剪贴板中。...
自动填表的IE面板插件 使用Delphi开发IE按钮扩展 使用Delphi开发IE右键菜单扩展 IE异步可插入协议扩展 Delphi开发IE下载扩展 创建3721样式的Google搜索扩展 HTML代码过滤技术 GetDefaultBrowser 得到的HTML代码的IE...
导航画板(不建议使用) 该插件不再维护。 Sketch现在支持带有本机快捷方式的画板导航! 按fn和向上/向下箭头可循环浏览画板。 一个Sketch插件,可在Sketch中的画板之间导航。 使用⌘]转到下一个画板, ⌘[转到上一...
编码,参加和导航 概述 Tensorflow的实现,TS,Deudon M.,Cournut P.,Lacoste A.,Adulyasak Y.和Rousseau LM 要求 用法 要从头开始训练模型(动态生成数据),请使用Jupyter Notebook(Neural_Reinforce.ipynb...
导航缩进包使用以下键盘映射快速浏览缩进: ctrl-shift-down转到具有相同缩进级别的下一行ctrl-shift-up移到具有相同压痕级别的上一行ctrl-shift-left转到具有更多缩进的下一行ctrl-shift-right减少缩进到下一行(多...
element.post() fix, see: https://sciter.com/forums/topic/virtual-list-vlist-navigate-issue/ WM_INPUT handling fix (might causing non-handled exceptions); Windows: UIAutomation support is back, but ...
《C++控制IE浏览器技术详解》 在信息技术领域,C++是一种强大且灵活的编程语言,而Internet Explorer(IE)作为曾经广泛...这个项目"Fire-IE-master"提供了一个良好的起点,供开发者探索和学习C++与IE结合的无限可能。
- 加载登录页面:使用WebBrowser控件的`Navigate()`方法打开百度的登录URL。 - 监听导航事件:通过`DocumentCompleted`事件,当登录页面完全加载后,进行下一步操作。 - 提取和填充表单:使用HTML解析找到用户名...
标题中的“自动关闭ie的弹出窗口”是指在使用Internet Explorer(简称IE)浏览器时,通过编程方式自动处理和关闭那些不必要的弹出式窗口。在Web开发或日常使用中,弹出窗口可能会带来不便,尤其是在自动化测试或者...