已知chrome的句柄,用VC如何获取整个网页的文本?

已知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 的文档了解更多细节。