Electron开发 - 如何在主进程Main中让node-fetch使用系统代理

背景

开发过程中,用户设置的系统代理是不同的,比如公司内的服务器,所以就要动态地使用系统代理来访问,但是主进程默认为控制台级别的请求,不走系统代理,除非你指定系统代理配置,这个就就有了这篇内容

思路

网上其实已经有了一篇文章写了这块,这里权当总结

  1. 通过 electron 自带 session 请求来判断是否走了代理,这里的 session 相当于一个渲染进程的 session,所以走的是系统代理;

  2. 通过 electron 执行 cmd 命令来返回系统代理配置,这个兼容性比较麻烦,mac,windows 各不相同,不推荐;

  3. 通过内部通信,委派渲染进程来干这件事,但是这个如果来回传递 10M 左右的数据,则会造成内存溢出,原因不详,总之通信不能进行大数据传输,electron 的 bug

  4. 综上所述,还是自带的 session 方式比较靠谱,但是遇上 mac socks5 有账号密码时,返回的不清楚是啥,还未尝试

代码实现

Electron 主进程获取系统代理代码

复制代码
async function getSystemProxy() {
    const proxyUrl = await session.defaultSession.resolveProxy('https://www.baidu.com');
    if (proxyUrl.startsWith('PROXY')) {
        const [host, port] = proxyUrl.split(' ')[1].split(':');
        console.log(proxy)
    }
}

node-fetch 使用系统代理需要借助库 `https-proxy-agent`

复制代码
const {HttpsProxyAgent} = require('https-proxy-agent');

(async () => {
    const fetch = (await import('node-fetch')).default;

    // 使用 fetch 发送请求
    fetch("https://crashlogs.whatsapp.net/wa_fls_upload_check?type=crashlog&access_token=1063127757113399%7C745146ffa34413f9dbb5469f5370b7af", {
        "headers": {
            "accept": "*/*",
            "accept-language": "zh-CN",
            "content-type": "multipart/form-data; boundary=----WebKitFormBoundary0liYTCH2BoYgSkZz",
            "sec-ch-ua": "\"Not?A_Brand\";v=\"8\", \"Chromium\";v=\"108\"",
            "sec-ch-ua-mobile": "?0",
            "sec-ch-ua-platform": "\"Windows\"",
            "Referer": "https://crashlogs.whatsapp.net/wa_fls_upload_check",
            "Origin": "https://web.whatsapp.com",
        },
        "body": "------WebKitFormBoundary0liYTCH2BoYgSkZz\r\nContent-Disposition: form-data; name=\"from_jid\"\r\n\r\nunknown-9799517833\r\n------WebKitFormBoundary0liYTCH2BoYgSkZz\r\nContent-Disposition: form-data; name=\"agent\"\r\n\r\nWhatsApp/2.3000.1014589209 Web/Chrome 108.0.5359.215 Device/Windows\r\n------WebKitFormBoundary0liYTCH2BoYgSkZz\r\nContent-Disposition: form-data; name=\"app_id\"\r\n\r\n167028690535322\r\n------WebKitFormBoundary0liYTCH2BoYgSkZz\r\nContent-Disposition: form-data; name=\"build_id\"\r\n\r\n0\r\n------WebKitFormBoundary0liYTCH2BoYgSkZz\r\nContent-Disposition: form-data; name=\"support_exception_only_upload\"\r\n\r\ntrue\r\n------WebKitFormBoundary0liYTCH2BoYgSkZz\r\nContent-Disposition: form-data; name=\"reason\"\r\n\r\n[ErrorPubSub] ServerJS based data-sjs payload content length mismatch\r\n------WebKitFormBoundary0liYTCH2BoYgSkZz--\r\n",
        "method": "POST",
        "agent": new HttpsProxyAgent('http://127.0.0.1:7890')
    }).then((response) => {
        return response.json();
    }).then((data) => {
        console.log(data);
    }).catch((e) => {
        console.error(e);
    });
})();
相关推荐
雪芽蓝域zzs18 分钟前
从零搭建【pnpm+Vue3+TS+Setup+VueRouter4+Pinia+Axios+ElementPlus (unplugin 按需)】仿若依后台
前端·vue.js
燕落南枝25 分钟前
HTML 列表标签详解:有序列表、无序列表与描述列表
前端·html
派小心.1 小时前
DAU和MAU怎么计算?先确定活跃事件、用户键和统计窗口
大数据·服务器·前端·人工智能·数据分析
代码猎人1 小时前
前端怎么配合后端完成bug修复
前端
叫我铁汁儿吧1 小时前
JS作用域
前端·面试
定栓1 小时前
Webpack迁到Vite第七节(四):全家桶移除 — 保留项、脚本与数据收尾
前端·webpack·node.js
VimorphTech1 小时前
React 任务轮询,为什么不能只写一个 setInterval?
javascript·typescript
代码猎人1 小时前
前端怎么优化首屏加载速度
前端
代码猎人1 小时前
前端怎么保障项目稳定上线与运行
前端
数据掘金1 小时前
小程序埋点方案的埋点文档怎么自动生成?
前端