Работа в Webbrowser

Рубрика: MFC, Дата: 17 August, 2015, Автор:

Сохранение текста страницы с помощью IHTMLDocument3

Показать »

CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument3> pADocument3;
IDispatch* pdispTmpVal3;

pIWeb->get_Document(&pdispTmpVal3);//получаем документ
pADocument3 = pdispTmpVal3;
IHTMLElement* html;
pADocument3->get_documentElement(&html);
BSTR temp;
html->get_innerHTML(&temp);
_bstr_t text2(L"<script  type="text/javascript">n");
text2+=_bstr_t(L"alert('hellow world!');n");
text2+=L"document.getElementById('ps_text').innerHTML="hellow soski";n";
text2+=L"$("#ps_text").html("+7 (923) 775-38-68, 8-383-375-38-68<br>");n";
text2+=L"</script>n";
_bstr_t b(temp);
b+=text2.copy();

std::string temp1=_com_util::ConvertBSTRToString(b.Detach());
std::ofstream ofss1("data2.html",std::ofstream::out);
ofss1 <<temp1<<"n";

IHTMLElement находим ссылку и кликаем по ней

Показать »

pIWeb->get_Document(&pdispTmpVal2);//получаем документ
pADocument2 = pdispTmpVal2;

CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument3> pADocument3;
IDispatch* pdispTmpVal3;

pIWeb->get_Document(&pdispTmpVal3);//получаем документ
pADocument3 = pdispTmpVal3;
				
//записываем в файЛ
IHTMLElementCollection* ptr;
pADocument2->get_all(&ptr);
long p(0);
ptr->get_length(&p);
TRACE("ptr->get_length= %dn",p);

IDispatch *ppvdispOption;
HRESULT hr;
_bstr_t s2;
std::ofstream ("text.html",std::ofstream::out);//удалить
for(int i=0;i<p;i++)
{

	_variant_t index = i;
	hr=ptr->item(index,index,&ppvdispOption);
	if(FAILED(hr)) 
	{
		TRACE("hr=failed i=%dn",i);
	}
	else
	{
	//	TRACE("hr=S_OK i=%dn",i);
		IHTMLElement* pElem=NULL;
		if(ppvdispOption->QueryInterface(IID_IHTMLElement,(void**)&pElem)==S_OK)
		{
		//	TRACE("IHTMLElement = TRUEn");
			BSTR s1=SysAllocString(L"");
			pElem->get_innerHTML(&s1);

			//запись в файл
			std::stringstream ss;
			ss <<"i= "<<i<<"-----------------------n";
			s2+=_com_util::ConvertStringToBSTR(ss.str().c_str());
			s2+=s1;
			s2+="--------------------------------n";
			std::string temp1=_com_util::ConvertBSTRToString(s2.Detach());
							
			std::ofstream ofss1("text.html",std::ofstream::app);
			ofss1 <<temp1<<"n";
			////
							
		//	TRACE("s1=%Sn",s1);
			SysFreeString(s1);
			BSTR tagName;

			//получаем имя тега
			if(pElem->get_tagName(&tagName)==S_OK)
			{
				if(_bstr_t(tagName)==_bstr_t(L"A"))
				{
					TRACE("tagName=%Sn",tagName);
					VARIANT atrVal;								
					if(pElem->getAttribute(L"href",0,&atrVal)==S_OK)
					{
						if(_bstr_t(atrVal)==_bstr_t(L"https://www.fl.ru/projects/"))
						{
							TRACE("atr=%Sn",_bstr_t(atrVal).Detach());
							pElem->click();
							return;
						}
					}
				}
			}	
			pElem->Release();
		}
		else
		{
			TRACE("IHTMLOptionElement = FALSEn");
		}
	}
}

Инициализация и вывод на экран

Показать »

	// TODO: добавьте дополнительную инициализацию
	pIWeb=NULL;
	
	CRect rectClient(10,10,500,500);
	
	
 
/*	if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, _T("Window"),
	 WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))*/
	 
	if (!m_wndBrowser.CreateControl(__uuidof(ddd::WebBrowser), _T("Window"),
	 WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))
	{
		DestroyWindow();
	}
	if (m_brows = m_wndBrowser.GetControlUnknown())
	{
		m_brows.QueryInterface(__uuidof(ddd::IWebBrowser2),(void**)&pIWeb);
	//	m_brows->Getsi
	//	m_brows->
		ddd::IWebBrowser2* pTr;
		m_brows->QueryInterface(__uuidof(ddd::IWebBrowser2),(void**)&pTr);
		pTr->put_Silent(TRUE);
		BSTR url=L"http://fl.ru";

	//	pTr->Navigate(url, NULL, NULL, NULL, NULL);
		pTr->Navigate2(COleVariant(url),NULL,NULL,NULL,NULL);
		TRACE("bifore if url=%Sn",url);
	//	if(pTr->get_LocationName(&url)==S_OK)
	/*	{
			TRACE("begin! ddddddddddddddddddddddddddddddddddddd s=%Sn",url);
	/*		ddd::DWebBrowserEvents2* pEv;
			m_brows->QueryInterface(__uuidof(ddd::DWebBrowserEvents2),(void**)&pEv);*/
			
			
		//	COleVariant v(url);
		//	pEv->BeforeNavigate2(
		//	pEv->NavigateComplete2(pTr,&v);
	/*		TRACE("end! Ddddddddddddddddddddddddddddddn");
		}*/

		
		
		
	}

Заполняем форму и отправляем

Показать »

{
	TRACE("x=%xn",pIHTML);
	BSTR s=NULL;
	CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> pADocument2;
	IDispatch* pdispTmpVal2;

	pIWeb->get_Document(&pdispTmpVal2);//получаем документ
	pADocument2 = pdispTmpVal2;

	CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument3> pADocument3;
	IDispatch* pdispTmpVal3;

	pIWeb->get_Document(&pdispTmpVal3);//получаем документ
	pADocument3 = pdispTmpVal3;
				
	//ищем форму, заполняем и кликаем по кнопке
	IHTMLElementCollection* ptr;
				
	pADocument2->get_forms(&ptr);//получаем все формы
	long p(0);
	ptr->get_length(&p);
	TRACE("ptr->get_length= %dn",p);

	IDispatch *ppvdispOption;
	HRESULT hr;
	for(int i=0;i<p;i++)
	{

		_variant_t index = i;
		hr=ptr->item(index,index,&ppvdispOption);
		if(FAILED(hr)) 
		{
			TRACE("hr=failed i=%dn",i);
		}
		else
		{
			TRACE("hr=S_OK i=%dn",i);
			//получаем форму у нас одна форма, поэтому мы так ее и ищем
			IHTMLFormElement* pElem=NULL;
			if(ppvdispOption->QueryInterface(IID_IHTMLFormElement,(void**)&pElem)==S_OK)
			{
				TRACE("IHTMLFormElement = TRUEn");
				long d(0);
				pElem->get_length(&d);
				TRACE("pElem->get_length=%dn",d);
							
				//заполняем форму
				_variant_t v(L"input");
				IDispatch* pDis=NULL;
				for(int i=0;i<d;i++)
				{
					_variant_t index=i;
					if(pElem->item(index,index,&pDis)==S_OK)
					{
						IHTMLElement* pl=NULL;
						if(pDis->QueryInterface(IID_IHTMLElement,(void**)&pl)==S_OK)
						{
										
							BSTR tagName;
							pl->get_tagName(&tagName);
							_variant_t v;
							HRESULT hr1;
							hr1=pl->getAttribute(L"name",0,&v);
							if(!FAILED(hr))
							{
								TRACE("v=%Sn",_bstr_t(v).Detach());
							}
							if(_bstr_t(tagName)==_bstr_t(L"INPUT")&&_bstr_t(v)==_bstr_t(L"login"))
							{
								TRACE("tagName=%S, name=%Sn",tagName,_bstr_t(v).Detach());
								_variant_t v_set(L"ks...");
								hr1=pl->setAttribute(L"value",v_set,1);
								if(FAILED(hr1)){TRACE("bad set attributen");}
							}
							else if(_bstr_t(tagName)==_bstr_t(L"INPUT")&&_bstr_t(v)==_bstr_t(L"passwd"))
							{
								TRACE("tagName=%S, name=%Sn",tagName,_bstr_t(v).Detach());
								_variant_t v_set(L"nin..");
								hr1=pl->setAttribute(L"value",v_set,1);
								if(FAILED(hr1)){TRACE("bad set attributen");}
							}
							pl->Release();
						}
						pDis->Release();
					}
				}
				
				//после заполнения кликаем по форме
				if(pElem->submit()==S_OK)
				{
					TRACE("submin=S_OK");
				}
				
							


				pElem->Release();
				ppvdispOption->Release();
			}
			else
			{
				TRACE("IHTMLElement = FALSEn");
			}
		}
	}
				
				

	pdispTmpVal2->Release();
	pdispTmpVal3->Release();
}			  
}

 

Создание браузера

Показать »

pIWeb=NULL;
	
CRect rectClient(10,10,500,900);
	 
if (!m_wndBrowser.CreateControl(__uuidof(ddd::WebBrowser), _T("Window"),
 WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))
{
	DestroyWindow();
}
if (m_brows = m_wndBrowser.GetControlUnknown())
{
	m_brows.QueryInterface(__uuidof(ddd::IWebBrowser2),(void**)&pIWeb);;	
}

IHTMLElement находим событие в ссылке и кликаем по ссылке

Показать »

std::smatch m;
std::regex rv ("href="/contacts/"");   // matches words beginning by "sub"

if (std::regex_search (s,m,rv)) 
{
	AfxMessageBox(L"Авторизован");
	CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pDoc2;
	pDoc2=pDisp;
	IHTMLElementCollection* pColl=NULL;
	if(pDoc2->get_all(&pColl)!=S_OK){AfxMessageBox(L"not pColl");exit(1);}
	long n(0);
	pColl->get_length(&n);

	IDispatch* ppvdispOption=NULL;
	for(int i=0;i<n;i++)
	{
		_variant_t index = i;
		if(pColl->item(index,index,&ppvdispOption)!=S_OK){AfxMessageBox(L"not ppvdispOption");exit(1);}
		IHTMLElement* pElem=NULL;
		if(ppvdispOption->QueryInterface(IID_IHTMLElement,(void**)&pElem)!=S_OK)
		{AfxMessageBox(L"not pElem");exit(1);}
		BSTR tagName;
		//получаем имя тега
           if(pElem->get_tagName(&tagName)==S_OK)
           {
		//	TRACE("tagName=%Sn",tagName);
			if(_bstr_t(tagName)==_bstr_t(L"A"))
			{
				//Смотрим класс
				VARIANT onClick;
				VARIANT atr;
		//		if(pElem->get_onclick(&onClick)==S_OK&&(onClick.vt==8))
				if(pElem->getAttribute(L"onclick",4,&atr)==S_OK)
		//		if(pElem->get_className(&className)==S_OK)
				{	
				
				//	TRACE("atr.vt=%dn",atr.vt);
				//	TRACE("atr=%Sn",_bstr_t(atr).copy());
					if(_bstr_t(atr)!=_bstr_t(L""))
						TRACE("atr=%Sn",_bstr_t(atr).copy());
						
					rv.assign("Bar_Ext\.logout\(\);");   // matches words beginning by "sub"
					std::string temp=_com_util::ConvertBSTRToString(_bstr_t(atr).copy());
					if (std::regex_search (temp,m,rv))
					{
						TRACE("search=%Sn",_bstr_t(atr).Detach());
						
						m_pWeb2->get_ReadyState(&r);
						TRACE("r1=%dn",r);
							
                           pElem->click();
                       
						m_pWeb2->get_ReadyState(&r);
						TRACE("r2=%dn",r);
						return;
                       }
                   }
         	}
	}
}

Находит изображение загруженное в браузере и сохраняет его в буфер, затем из буфера сохраняем в CBitmap и в img.png

Показать »

IHTMLDocument2* pDoc = NULL;
IHTMLElement* pelmBody = NULL;
IHTMLElement2* pelmBodyTwo = NULL;
IDispatch* pdispImgElement = NULL;
IDispatch* pdispCtrlRange = NULL;
IHTMLElementCollection* pColl = NULL;
IHTMLControlElement* pCtrlElement = NULL;
IHTMLControlRange* pCtrlRange = NULL;

VARIANT_BOOL vbReturn;
VARIANT vEmpty;
VariantInit(&vEmpty);

// 1. получаем pDoc
if(pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc)!=S_OK){AfxMessageBox(L"net pDoc");return;}
// 2. получаем pColl
if(pDoc->get_images(&pColl)!=S_OK){AfxMessageBox(L"net pCol");return;}
long n(0);
pColl->get_length(&n);
TRACE("n=%dn",n);
_variant_t index=5;
// 3. получаем IDispatch* pdispImgElement = NULL;
if (FAILED(pColl->item(index, vEmpty, &pdispImgElement)) || pdispImgElement == NULL) 
{AfxMessageBox(L"net pdispImgElement");return;}
// 4. получаем IHTMLElement* pelmBody = NULL;
if(FAILED(pDoc->get_body(&pelmBody)) || pelmBody == NULL)
{AfxMessageBox(L"net pelmBody");return;}
// 5. получаем IHTMLElement2* pelmBodyTwo = NULL;
if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo)) || pelmBodyTwo == NULL)
{AfxMessageBox(L"net pelmBodyTwo");return;}
// 6. получаем IDispatch* pdispCtrlRange = NULL;
if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange)) || pdispCtrlRange == NULL) 
{AfxMessageBox(L"net pelmBodyTwo");return;}
// 7. получаем IHTMLControlRange* pCtrlRange = NULL;
if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange)) || pCtrlRange == NULL)
{AfxMessageBox(L"net pCtrlRange");return;}
// 8. получаем IHTMLControlElement* pCtrlElement = NULL;
if (FAILED(pdispImgElement->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement)) || pCtrlElement == NULL) 
{AfxMessageBox(L"net pCtrlElement");return;}
// 9. добавляем элементв Control
if(FAILED(pCtrlRange->add(pCtrlElement))){AfxMessageBox(L"not pCtrlRange->add(pCtrlElement)");}
// 10. выполняем команду (походу коппирует в буфер изображение в браузере)
if(FAILED( pCtrlRange->execCommand(L"Copy", VARIANT_FALSE, vEmpty, &vbReturn) ))
{AfxMessageBox(L"net execCommand");return;}

// 11. читаем из буфера битмеп
if ( !OpenClipboard() )//открываем буфер
{AfxMessageBox( _T("Cannot open the Clipboard") );return;}
HGLOBAL hGlob=NULL;
hGlob=::GetClipboardData(CF_BITMAP);
if(hGlob==NULL)AfxMessageBox(L"hGlob==NULL");
CloseClipboard();//закрываем буфер
//------------------------------

// 12. сохраняем изображение из буфера в виде png файла
CBitmap* m_pBitmap=(CBitmap*)hGlob;
CImage img;
img.Attach(HBITMAP(m_pBitmap));
img.Save(L"img.png");
//------------------------------

Сделать прокрутку в конец страницы

Показать »

CComQIPtr<IHTMLWindow2,&IID_IHTMLWindow2> pWind2;
if(pDoc2->get_parentWindow(&pWind2)!=S_OK){AfxMessageBox(L"net pWin2");exit(1);}
long begin=100000000;
pWind2->scrollTo(100,begin);//прокручивает вниз