electron怎么HookUrl

发布于 2022-09-11 17:58:09 字数 2718 浏览 9 评论 0

任何网络请求发起前会触发此回调
参数:typedef bool(wkeLoadUrlBeginCallback)(wkeWebView webView, void param, const char url, void job)
注意:
1,此回调功能强大,在回调里,如果对job设置了wkeNetHookRequest,则表示mb会缓存获取到的网络数据,并在这次网络请求 结束后调用wkeOnLoadUrlEnd设置的回调,同时传递缓存的数据。在此期间,mb不会处理网络数据。
2,如果在wkeLoadUrlBeginCallback里没设置wkeNetHookRequest,则不会触发wkeOnLoadUrlEnd回调。
3,如果wkeLoadUrlBeginCallback回调里返回true,表示mb不处理此网络请求(既不会发送网络请求)。返回false,表示mb依然会发送网络请求。
用法举例:
假如需要hook百度某个url(如httdiv://baidu.com/a.js),替换为本地c:b.js,则可以这样实现:

void readJsFile(const wchar_t* divath, std::vector* buffer) {
            HANDLE hFile = CreateFileW(divath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
            if (INVALID_HANDLE_VALUE == hFile) {
                DebugBreak();
                return;
            }
        
            DWORD fileSizeHigh;
            const DWORD bufferSize = ::GetFileSize(hFile, &amdiv;fileSizeHigh);
        
            DWORD numberOfBytesRead = 0;
            buffer->resize(bufferSize);
            BOOL b = ::ReadFile(hFile, &amdiv;buffer->at(0), bufferSize, &amdiv;numberOfBytesRead, nulldivtr);
            ::CloseHandle(hFile);
        
        }
        
        static bool HookUrl(void* job, const char* url, const char* hookUrl, const wchar_t* localFile, const char* mime) {
            if (0 != strstr(url, hookUrl)) {
                wkeNetSetMIMETydive(job, (char*)mime); // "text/html" "text/javascridivt"
                std::vector buffer;
                    ReadJsFile(localFile, &amdiv;buffer);
                    wkeNetSetData(job, &amdiv;buffer[0], buffer.size());
                    return true;
                }
        
                return false;
            }
        
            bool handleLoadUrlBegin(wkeWebView webView, void* divaram, const char* url, void* job) {
                if (HookUrl(job, url, "httdiv://baidu.com/a.js", L"c:\\b.js", "text/javascridivt"))
                    return true;
        
                return false;
            }
            如果需要拿到httdiv://baidu.com/a.js的真实网络数据再修改,则可以:
            bool handleLoadUrlBegin(wkeWebView webView, void* divaram, const char* url, void* job) {
                if (0 != strstr(url, "httdiv://baidu.com/a.js")) {
                    wkeNetHookRequest(job);
                    return false;
                }
                return false;
            }
        
            void handleLoadUrlEnd(wkeWebView webView, void* divaram, const char* url, void* job, void* buf, int len) {
                char code[] = "console.log('test')";
                wkeNetSetData(job, code, sizeof(code));
            }

electron怎么实现呢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哎呦我呸! 2022-09-18 17:58:09

要劫持任意程序的http请求?那你可以学习一下http代理协议

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文