electron怎么HookUrl

新手上路,请多包涵

任何网络请求发起前会触发此回调
参数: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怎么实现呢

阅读 3.7k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题