electron加载第三方网站到自己项目中

一、需求说明

主要用于加载自己的其他项目页面时用iframe和webview等方法无法操作cookie和localstorage等页面缓存,因此用electron来显示并且实现免密登录,主要是免密登录在不同场景下需要用不同的方法来实现。
注意:切记在未获取第三方网站前将别人的网站抓过来显示,容易引发不必要的问题。

二、实现方法

1. 可以通过设置登录令牌的页面

(1)后台通过请求后台接口或者其他方法获取到对应网站的令牌(能调接口的话尽量不要用selenium的方式,非常不稳定)
(2)electron实现免密登录(重点来了)
a.通过cookie保存令牌的情况

function addCookies(cookies){
let setCookies=mainWindow.webContents.session.cookies;
setCookies.set(cookie).then(()=>{
			//dosomething
			console.log('设置成功');
        },(error)=>{
        	//dosomething
            console.error(error);
        })
}

需要注意的地方:
1.传入的cookie在构建时要把url和domain都设置上
2.要在主进程访问链接前就添加cookie,也就是mainWindow.loadURL(‘url’)前,不然会导致添加cookie失败
3.最好在添加cookie后稍等2-3秒,可以用setTimeout方法添加个计时器

b.网站是通过localStorage保存令牌
这种只能通过注入js的方法来添加,代码如下

mainWindow.webContents.executeJavaScript(
`localStorage.setItem('` + key + `','` + value + `');`
+`window.location.href = 'yourUrl';`).then((result) => {
		//dosomething
                        });

需要注意的地方:
1. 由于主进程不能直接获取到localStorage,因此只能通过注入js的方法来设置值,
2. 设置完后如果通过mainWindow.loadURL()方法来访问会导致网页读取localStorage失败,具体原因未知,但是可以通过注入js的方法来让网页重新跳转一次来实现。

2. 不能通过设置登录令牌的页面

这种情况只能通过注入js的方法来实现免密登录,具体思路为通过javascript来获取到页面里的登录信息的输入框dom,模拟用户点击登录的方式来实现。
具体注意的问题:
	(1)需要等待网页完全加载完后再进行js注入方法
	(2)有些网站会进行多次重定向导致无法确定是否进入到了登录页面
	(3)由于需求要求不显示登录页面,所以需要在打开页面前添加一个等待加载页面,并且登录后的标题也要进行修改,因此要添加许多的定时器,所以在登录成功后要清除这些定时器
	   (4)仅限于不需要验证码的页面,如果需要验证码的则需要进行查看页面验证码的加载方法(是前端根据后端返回的字符串还是直接返回的图片流),可以通过接入图片识别或者直接计算验证码的值,过于复杂的验证码考虑检查登录令牌的保存位置来实现。
	   (5) 由于部分网页含有表单校验,所以需要在每个dom赋值后执行
	   document.getElementsByClassName('el-input__inner')[1].dispatchEvent(new Event('input', { bubbles: true }));
	代码如下:
	let winFlag = 0;
	createWindow(){
	mainWindow = new BrowserWindow({
            show: false,
            title: baseData.title,
            // width: 800,
            // height: 600,
            webContents: {
                openDevTools: true   //不想要控制台直接把这段删除
            },
            resizable: true,  // 窗口是否可以改变尺寸 开启后maximizable失效
            movable: true,  // 窗口是否可以移动
            webPreferences: {
                preload: path.join(__dirname, 'main-process/preload.js'), //预加载脚本
                nodeIntegration: true, // 设置开启nodejs环境
                enableRemoteModule: true,// enableRemoteModule保证renderer.js可以可以正常require('electron').remote,此选项默认关闭
                contextIsolation: true,     //隔离开主进程和渲染进程
            },
        });
	}
		mainWindow.loadURL('yourUrl'); // 加载指定第三方网址
        mainWindow.webContents.on('did-finish-load', () => {
            winFlag++;
            var jsFlag = true;
            console.log(winFlag);
            if (winFlag === 1) {

                for (let i = 0; i < 10; i++) {
                    (function (j) {
                        let timeId = setTimeout(function timer() {mainWindow.webContents.executeJavaScript(`document.getElementsByClassName('el-input__inner')[1].value='` + username + `';`)
                                .then((res) => {
                                    mainWindow.webContents.executeJavaScript(`document.getElementsByClassName('el-input__inner')[1].dispatchEvent(new Event('input', { bubbles: true }));`)
                                    mainWindow.webContents.executeJavaScript(`document.getElementsByClassName('el-input__inner')[2].value='` + baseData.password + `';`);
                                    mainWindow.webContents.executeJavaScript(`document.getElementsByClassName('el-input__inner')[2].dispatchEvent(new Event('input', { bubbles: true }));`)
                                    mainWindow.webContents.executeJavaScript(`document.getElementsByClassName('el-form-item__content')[2].getElementsByTagName('button')[0].click();`)
                                    jsFlag = false;
                                }).catch((error) => {
                                console.error(">>>" + error + "<<<")
                            });
                            //如果执行js成功  则清除全部的定时器
                            if (!jsFlag) {
                                winFlag++;
                                list.forEach((id) => {
                                    clearTimeout(id);
                                });
                            }
                            if (winFlag === 2) {
                                setTimeout(() => {

                                    destoryLoading()
                                }, 1000)
                            }
                        }, 1000 * i);
                        list.push(timeId)
                    })(i);
                }
            }
        });

3.最后附加依赖配置

“devDependencies”: {
“@electron-forge/cli”: “^7.4.0”,
“@electron-forge/maker-deb”: “^7.4.0”,
“@electron-forge/maker-rpm”: “^7.4.0”,
“@electron-forge/maker-squirrel”: “^7.4.0”,
“@electron-forge/maker-zip”: “^7.4.0”,
“@electron-forge/plugin-auto-unpack-natives”: “^7.4.0”,
“@electron-forge/plugin-fuses”: “^7.4.0”,
“@electron/fuses”: “^1.8.0”,
“electron”: “^30.0.1”
},

<think>好的,我现在需要帮用户解答关于紫微斗数中“天干飞星禄遇到生年禄”的问题。首先,我得确认自己对这两个术语的理解是否正确。 用户提到的“天干飞星禄”应该是指根据宫位天干飞出的禄存星,而“生年禄”则是出生年天干带来的禄存星。当这两者在同一宫位相遇时,可能产生某种叠加效应。不过,我需要回忆一下紫微斗数中禄存的飞星法则,以及生年四化的应用。 接下来,我需要考虑这两者的相互作用。禄存代表财富、福气,但飞星禄和生年禄相遇时,是不是意味着双倍的吉利?或者有没有可能因为星曜之间的冲突而产生变化?比如,如果宫位本身有煞星,或者主星不同,结果可能不同。 然后,还要注意宫位的重要性。比如,财帛宫遇到这种情况可能主财运旺盛,而夫妻宫可能影响感情关系。同时,天干飞星禄是否属于流年或大运的范畴,而生年禄是先天命盘的因素,两者的时间维度叠加可能会有不同的应期。 另外,用户可能想知道具体的案例或者如何判断吉凶。需要提醒他们结合整个命盘来分析,比如其他星曜的分布、四化的引动等。避免过于简化的结论,强调综合分析的必要性。 最后,确保语言通俗易懂,避免使用过多专业术语,但必要时解释清楚。结构上分点说明,先解释概念,再分析相遇的情况,最后给出实际建议。同时,提醒可能存在不同流派的解释差异,建议咨询专业人士。</think>在紫微斗数中,“天干飞星禄遇到生年禄”是一个需要结合飞星四化与生年四化综合分析的特殊情况,其意义需从以下层面逐步理解: --- ### 一、基础概念解析 1. **生年禄** 指出生年天干所化出的禄存星,代表命主先天福报与机遇,反映一生中较稳定的福气、财源或人缘优势。 2. **天干飞星禄** 指根据宫位天干飞化出的禄存星(如某宫天干为甲,则甲廉贞化禄),主后天环境或事件引发的增益机会,常与流年、大运、特定事件相关。 --- ### 二、二者相遇的象征意义 当某宫位同时存在 **生年禄** 与 **天干飞星禄** 时,形成“双禄交驰”,通常体现为: - **吉象叠加**:财富、人缘、机遇的强化,可能带来双重助力(如贵人相助、财源广进)。 - **动态联动**:先天福报与后天努力共振,易触发实质收益(如投资获利、合作成功)。 - **宫位特性放大**:若在财帛宫则财运亨通,在夫妻宫则感情和谐,在迁移宫则外出顺利。 --- ### 三、需注意的变量 1. **星曜组合** 若该宫主星为财星(如武曲、太阴),吉象更显;若主星弱或逢煞忌(如擎羊、陀罗),则可能“禄逢冲破”,需防利益纠纷或昙花一现。 2. **时间维度** - **生年禄**:贯穿一生,但需大运、流年引动方显效。 - **飞星禄**:时效性强,常应验于特定事件或阶段(如某年合作项目获利)。 3. **四化交互** 若其他天干化出权、科、忌与此宫关联,需综合判断。例如: - 逢化权:机遇伴随竞争或需主动争取。 - 逢化忌:需防乐极生悲或因得利招妒。 --- ### 四、实例说明 **案例**:某人命盘夫妻宫有生年禄(甲干廉贞化禄),流年夫妻宫天干为癸引发破军化禄(癸干破军化禄)。 - **解释**:双禄强化感情关系,可能促成婚恋或修复矛盾,但若破军化禄与擎羊同度,需注意激情后的稳定性。 --- ### 五、总结建议 1. **把握机遇**:双禄叠加期宜积极行动,尤其在相关宫位领域(如财帛宫宜投资)。 2. **防范风险**:检视宫位煞忌,避免盲目乐观。 3. **结合全盘**:需参考本宫主星、三方四正及大运流年,建议咨询专业命理师详析。 若需进一步分析,请提供命盘具体信息(如宫位、星曜分布)。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值