Сохранение текста страницы с помощью IHTMLDocument3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 находим ссылку и кликаем по ней
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
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= %d\n",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=%d\n",i); } else { // TRACE("hr=S_OK i=%d\n",i); IHTMLElement* pElem=NULL; if(ppvdispOption->QueryInterface(IID_IHTMLElement,(void**)&pElem)==S_OK) { // TRACE("IHTMLElement = TRUE\n"); 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=%S\n",s1); SysFreeString(s1); BSTR tagName; //получаем имя тега if(pElem->get_tagName(&tagName)==S_OK) { if(_bstr_t(tagName)==_bstr_t(L"A")) { TRACE("tagName=%S\n",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=%S\n",_bstr_t(atrVal).Detach()); pElem->click(); return; } } } } pElem->Release(); } else { TRACE("IHTMLOptionElement = FALSE\n"); } } } |
Инициализация и вывод на экран
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
// 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=%S\n",url); // if(pTr->get_LocationName(&url)==S_OK) /* { TRACE("begin! ddddddddddddddddddddddddddddddddddddd s=%S\n",url); /* ddd::DWebBrowserEvents2* pEv; m_brows->QueryInterface(__uuidof(ddd::DWebBrowserEvents2),(void**)&pEv);*/ // COleVariant v(url); // pEv->BeforeNavigate2( // pEv->NavigateComplete2(pTr,&v); /* TRACE("end! Dddddddddddddddddddddddddddddd\n"); }*/ } |
Заполняем форму и отправляем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
{ TRACE("x=%x\n",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= %d\n",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=%d\n",i); } else { TRACE("hr=S_OK i=%d\n",i); //получаем форму у нас одна форма, поэтому мы так ее и ищем IHTMLFormElement* pElem=NULL; if(ppvdispOption->QueryInterface(IID_IHTMLFormElement,(void**)&pElem)==S_OK) { TRACE("IHTMLFormElement = TRUE\n"); long d(0); pElem->get_length(&d); TRACE("pElem->get_length=%d\n",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=%S\n",_bstr_t(v).Detach()); } if(_bstr_t(tagName)==_bstr_t(L"INPUT")&&_bstr_t(v)==_bstr_t(L"login")) { TRACE("tagName=%S, name=%S\n",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 attribute\n");} } else if(_bstr_t(tagName)==_bstr_t(L"INPUT")&&_bstr_t(v)==_bstr_t(L"passwd")) { TRACE("tagName=%S, name=%S\n",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 attribute\n");} } pl->Release(); } pDis->Release(); } } //после заполнения кликаем по форме if(pElem->submit()==S_OK) { TRACE("submin=S_OK"); } pElem->Release(); ppvdispOption->Release(); } else { TRACE("IHTMLElement = FALSE\n"); } } } pdispTmpVal2->Release(); pdispTmpVal3->Release(); } } |
Создание браузера
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 находим событие в ссылке и кликаем по ссылке
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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=%S\n",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=%d\n",atr.vt); // TRACE("atr=%S\n",_bstr_t(atr).copy()); if(_bstr_t(atr)!=_bstr_t(L"")) TRACE("atr=%S\n",_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=%d\n",r); pElem->click(); m_pWeb2->get_ReadyState(&r); TRACE("r2=%d\n",r); return; } } } } } |
Находит изображение загруженное в браузере и сохраняет его в буфер, затем из буфера сохраняем в CBitmap и в img.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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=%d\n",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"); //------------------------------ |
Сделать прокрутку в конец страницы
1 2 3 4 |
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);//прокручивает вниз |