C++下使用WebBrowser进行网站自动登录

登录网站有两种方式,一种是采用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;

               }              

           }

       }

   }