已知chrome的句柄,用VC如何获取整个网页的文本?
之前有找到IE获取整页文本的方法,代码如下。
如果想获得chrome的整页文本该怎么弄呢··
CoInitialize(NULL);
CComPtr pDoc2;
string strTemp="";
HINSTANCE hinst=::LoadLibrary("OLEACC.DLL");
if(hinst!=NULL) {
LRESULT lres;
UINT unMsg=::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
::SendMessageTimeout(hwndIE,unMsg,0L,0L,SMTO_ABORTIFHUNG,1000,(DWORD*)&lres);
LPFNOBJECTFROMLRESULT pfObjectFromLresult=(LPFNOBJECTFROMLRESULT)::GetProcAddress(hinst,_T("ObjectFromLresult"));
if(pfObjectFromLresult!=NULL) {
HRESULT hres;
hres=(*pfObjectFromLresult)(lres,IID_IHTMLDocument2,0,(void**)&pDoc2);
if(SUCCEEDED(hres)) {
CComPtr pHtmlElem;
hres=pDoc2->get_body(&pHtmlElem);
BSTR bstrText=NULL;
pHtmlElem->get_innerText(&bstrText);
_bstr_t _bstrTemp(bstrText,false);
//strTemp=(char*)_bstr_t(bstrText);
strTemp=(char*)_bstrTemp;
}
}
::FreeLibrary(hinst);
}
CoUninitialize();
为了获取 Chrome 的整页文本,你需要使用 Chrome 的 DevTools Protocol。
DevTools Protocol 是一种远程调试协议,它允许你使用编程语言(如 C++)连接到 Chrome 并控制它。你可以使用 DevTools Protocol 实现各种功能,例如获取网页的文本、执行 JavaScript 代码、模拟用户交互等。
你需要在 Chrome 中启用 DevTools Protocol。在 Chrome 的地址栏中输入 "chrome://flags#remote-debugging" 并启用 "远程调试" 选项。然后,打开 Chrome 的调试工具(在菜单中选择 "更多工具 > 开发者工具" 或者使用快捷键 F12),在 "设置" 标签页中勾选 "启用实验性的 DevTools Protocol API"。
之后,你就可以使用 DevTools Protocol API 来获取网页的文本了。DevTools Protocol API 通过 WebSocket 连接来交互,所以你需要使用 WebSocket 库(如 libwebsockets)来连接到 Chrome。
示例代码如下(使用 libwebsockets 库):
#include <iostream>
#include <string>
#include <libwebsockets.h>
void on_message(lws *wsi, char *message, size_t length) {
// 处理来自 DevTools Protocol 的消息
}
int main() {
// 初始化 WebSocket
lws_context_creation_info info;
memset(&info, 0, sizeof(info));
info.port = CONTEXT_PORT_NO_LISTEN;
info.protocols = protocols;
lws_context *context = lws_create_context(&info);
if (!context) {
std::cerr << "Failed to create WebSocket context" << std::endl;
return -1;
}
//连接到 Chrome 的 DevTools Protocol
lws_client_connect_info ccinfo;
memset(&ccinfo, 0, sizeof(ccinfo));
ccinfo.context = context;
ccinfo.address = "localhost";
ccinfo.port = 9222;
// DevTools Protocol 的默认端口为 9222
ccinfo.path = "/";
ccinfo.host = lws_canonical_hostname(context);
ccinfo.origin = "http://localhost";
ccinfo.protocol = "binary";
lws *wsi = lws_client_connect_via_info(&ccinfo);
if (!wsi) {
std::cerr << "Failed to connect to DevTools Protocol" << std::endl;
return -1;
}
// 发送请求获取网页文本的消息
std::string message = R"({"id":1,"method":"Runtime.evaluate","params":{"expression":"document.body.innerText"}})";
lws_write(wsi, (unsigned char *)message.c_str(), message.length(), LWS_WRITE_TEXT);
// 等待响应
while (true) {
lws_service(context, 0);
}
return 0;
}
上面的代码向 DevTools Protocol 发送了一条消息,请求执行 JavaScript 表达式 "document.body.innerText"。DevTools Protocol 会返回网页的文本。你可以在 on_message
回调函数中处理来自 DevTools Protocol 的响应消息,并从中获取网页文本。
注意:上面的代码仅作为示例,实际使用时需要更复杂的代码来处理 WebSocket 连接和 DevTools Protocol 消息。你还需要根据 DevTools Protocol 的文档了解更多细节。