|
|
C++下使用WebBrowser进行网站自动登录 |
作者:洛羽叶 点击率:3222 发布时间:2013-01-17 |
登录网站有两种方式,一种是采用URL提交的方式,另外一种采用POST数据的方式,鉴于很多网站的登陆在提交后有多站认证及多次跳转,采用HTTPOPENREQUEST等API的方式无法满足要求,还是要采用WebBrowser的方式模拟登陆。
本文是WTL方式的WebBrowser。
1.定义浏览器变量
CAxWindow browserWindow;
CComPtr<IWebBrowser2> browser;
2.初始化WebBrowser组件
browserWindow = GetDlgItem(IDC_EXPLORER_MAIN);
browserWindow.QueryControl (&browser);
browser->put_Silent(VARIANT_TRUE);
browser->put_Offline(VARIANT_FALSE);
3.访问登陆页面
browser->Navigate(CComBSTR("http://www.test.com/login.php"),&v,&v,&v,&v);
4.在WebBrowser的事件DocumentComplete中进行登录,防止页面未加载完成进行登录
void __stdcall CMainDlg::DocumentCompleteExplorerMain(LPDISPATCH pDisp, VARIANT* URL)
5.获取登陆表单,填写用户名、密码,提交表单,注意要判断登陆成功后的页面完成
CComVariant v;
HRESULT hr;
CComPtr<IDispatch> pdispDocment;
CComQIPtr<IHTMLDocument2> pDocument;
IHTMLElement *pHtmlElement;
CComPtr<IDispatch> pDisp = NULL;
CComVariant vValue = "";
CComDispatchDriver pInputElement;
CComDispatchDriver pInputElement1;
CComPtr<IHTMLElementCollection> pElementCollection;
CComQIPtr<IHTMLFormElement> pFormElement;
IHTMLWindow2 *pWindow;
bool bResult=false;
char buf[256]={0};
hr = browser->get_Document(&pdispDocment);
if(hr==S_OK)
{
pDocument = pdispDocment;
hr = pDocument->get_activeElement(&pHtmlElement);
hr = pDocument->get_parentWindow(&pWindow);
if(hr==S_OK)
{
hr = pDocument->get_forms(&pElementCollection);
if(hr==S_OK)
{
/* 获取表单,如果不止一个表单要做判断 */
hr = pElementCollection->item(CComVariant(0), CComVariant(), &pDisp);
pFormElement = pDisp;
if(pFormElement!=NULL)
{
/* 填写用户名 */
hr =pFormElement->item(CComVariant("username"), CComVariant(), &pInputElement);
m_Account.GetWindowText(buf,sizeof(buf));
vValue = buf;
hr = pInputElement.PutPropertyByName(L"value",&vValue);
/* 填写密码 */
hr =pFormElement->item(CComVariant("password"), CComVariant(), &pInputElement1);
m_Password.GetWindowText(buf,sizeof(buf));
vValue = buf;
hr = pInputElement1.PutPropertyByName(L"value",&vValue);
/* 提交表单 */
hr = pFormElement->submit();
bResult=true;
}
}
}
}
|
|
|
|
|
|