聚合頁做的比較好的教育網(wǎng)站軟件定制開發(fā)
背景
開發(fā)過程中,用戶設置的系統(tǒng)代理是不同的,比如公司內的服務器,所以就要動態(tài)地使用系統(tǒng)代理來訪問,但是主進程默認為控制臺級別的請求,不走系統(tǒng)代理,除非你指定系統(tǒng)代理配置,這個就就有了這篇內容
思路
網(wǎng)上其實已經(jīng)有了一篇文章寫了這塊,這里權當總結
-
通過?electron?自帶?session?請求來判斷是否走了代理,這里的?session?相當于一個渲染進程的?session,所以走的是系統(tǒng)代理;
-
通過?electron?執(zhí)行?cmd?命令來返回系統(tǒng)代理配置,這個兼容性比較麻煩,mac,windows?各不相同,不推薦;
-
通過內部通信,委派渲染進程來干這件事,但是這個如果來回傳遞?10M?左右的數(shù)據(jù),則會造成內存溢出,原因不詳,總之通信不能進行大數(shù)據(jù)傳輸,electron?的?bug
-
綜上所述,還是自帶的?session?方式比較靠譜,但是遇上?mac?socks5 有賬號密碼時,返回的不清楚是啥,還未嘗試
代碼實現(xiàn)
Electron 主進程獲取系統(tǒng)代理代碼
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 使用系統(tǒng)代理需要借助庫 `https-proxy-agent`
const {HttpsProxyAgent} = require('https-proxy-agent');(async () => {const fetch = (await import('node-fetch')).default;// 使用 fetch 發(fā)送請求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);});
})();