mike2002chen 2013-07-06 08:24 采纳率: 0%
浏览 3749

已知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();

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-05 08:46
    关注

    为了获取 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 的文档了解更多细节。

    评论

报告相同问题?

悬赏问题

  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用