肥宅钓鱼网
当前位置: 首页 钓鱼百科

前端微信授权登录如何弄(纯前端JS解决微信公众号自动登录问题)

时间:2023-08-12 作者: 小编 阅读量: 1 栏目名: 钓鱼百科

公众号首页核心功能就两块,webview的preload插入js文件,js文件里面动态嵌入不同的账密。通过第一行的define,第一时间想到的是seajs,后来发现就是seajs,无他。现在要考虑的是,如何给webview组件带入不同的账密。这里使用Sync原因很简单,异步处理相对麻烦,调试用同步,高效快速。于是我们pass第一种方案,如果你成功了,务必告诉我下。

注意,本文实现功能不涉及任何后端,有后端搭伙的小伙伴可以不用看了哈。

微信

场景

这两天解决公众号广告分发平台项目(基于Electron)的一些棘手问题,其中之一就是微信公众号自动登录问题。

一个PC客户端,内嵌了一个webview,里面塞入的是微信公众号首页,即登录页:https://mp.weixin.qq.com/,拿Cookie,Token什么的不在本文内,较为敏感,这里只说一下实现自动登录功能。

公众号首页

核心功能就两块,webview的preload插入js文件,js文件里面动态嵌入不同的账密。


preload

Electron的webview允许开发者设计预插入一个js文件,具体官网描述如下:

preload

preload

<webview src="http://img.studyofnet.comhttps://www.github.com/" preload="./test.js"></webview>

指定一个脚本在访客页中其他脚本执行之前先加载。 该脚本的URL的协议必须是 file: asar:二者之一,因为在访客页中,它是通过“内部”的 require 去加载的

当访客页没有 node integration ,这个脚本仍然有能力去访问所有的 Node APIs, 但是当这个脚本执行执行完成之后,通过Node 注入的全局对象(global objects)将会被删除。

注意: 在为 will-attach-webview 事件指定 webPreferences 时,这个选项将作为 preloadURL 出现,而不是 preload。

所以,相对来说简单的想法就是在preload的js里面,我们做一下输入框内容的填充即可。

道理是这么个道理,但是实际操作起来会有一些问题,我们代码一步一步来,首先想到的是,input.value = x这种操作。

下面是账号input相关信息:

account

下面是密码input相关信息:

pwd

那么就可以通过querySelector方式获取两个输入框了:

// inputs.length === 2,刚好两个,不用担心其他的干扰了。let inputs = document.querySelectorAll('.weui-desktop-form__input')

再观察登录按钮下:

login

嘛,我个人是不喜欢使用a标签当提交按钮……

获取方式:

let a = document.querySelector('.btn_login')

很简单吧。

于是就有如下提交代码:

let inputs = document.querySelectorAll('.weui-desktop-form__input')// 随手放到数组里,不要较真,账密自己填写自己的let infos = ['account', 'password']for(let i = 0; i < inputs.length; i) { let input = inputs[i] input.value = infos[i] setTimeout(() => { let a = document.querySelector('.btn_login') a.click() }, 0)}

按说,逻辑没问题。但是,实际使用公众号平台会返回告诉你,没有输入账号(密码)。

只能抠下源码分析怎么回事了,源码所在位置(随机数你看到的与我未必一样):

源码

右侧复制下来,然后本地编辑器新建js,并且格式化后就可以看到比较清晰的源码,虽然命名被压缩后比较奇葩,如下:

源码格式化后

检索相关关键词(比如“你还没有输入帐号!”),或者login(查多了就知道了),就可以找到相关的逻辑所在。

通过第一行的define,第一时间想到的是seajs,后来发现就是seajs,无他。

再看到里面的,computed,watch,mounted之类的,也可以联想到是Vue,所以应当是seajs与Vue混合开发的公众号首页。

到这里,就相对清晰了,获取不到账密原因在于我们直接设置value的方式,并不能触发Vue实例的data修改,如下:

核心data值

此时,就该想到Vue的事件机制(不需要懂源码,用过就差不多),简单来说,就是事件函数驱动data变化,而不是外部手动修改DOM可以触发。

所以,增加一句话就可以混淆Vue的data机制,从而解决data值不响应变化的问题:

input.dispatchEvent(new Event('input'))

没错,神奇的Event函数,通过new对象的方式,让相应标签实例主动触发相关事件。

这里注意下,不是所有都是input事件,这个根据标签不同而不同,我们这里要解决的是微信公众号登录的问题,所以是输入框input标签,那么自然就是input事件(oninput)了。

完整处理代码如下,请注意与上方的对比:

let inputs = document.querySelectorAll('.weui-desktop-form__input')// 随手放到数组里,不要较真,账密自己填写自己的let infos = ['account', 'password']for(let i = 0; i < inputs.length; i) { let input = inputs[i] input.value = infos[i] // 修改input的值后,记得主动触发一次input事件。 input.dispatchEvent(new Event('input')) setTimeout(() => { let a = document.querySelector('.btn_login') a.click() }, 0)}

这样,a的click事件就生效了,至此,完成登录这个事情。


动态账密

上面解决了模拟登录问题,但是仅仅是模拟,因为账密是写死的,别忘了,我们现在在Electron的一个webview组件里面。

现在要考虑的是,如何给webview组件带入不同的账密。

  1. fs写入新的js,里面插入账密,再读取
  2. 通过其他webview文件信息插入

先说第一种,这个是有点node基础的小伙伴都会首先想到的,没错,我尝试了,然后,挂了。

原因很简单,沙盒内的文件路径与你启动前配置的文件路径不同,导致代码上写的读取路径(readFileSync)与写入路径(writeFileSync)不同,能写不能读,WTF……这里使用Sync原因很简单,异步处理相对麻烦,调试用同步,高效快速。

于是我们pass第一种方案,如果你成功了,务必告诉我下。

然后是第二种:

这里先说明下,个人觉得第二种有点侥幸,因为公众号后端验证没有严格到把ua(userAgent)也算进去,所以我找到这个方案。

首先查询了webview能够带入进去的所有属性,很幸运,有个ua,官网介绍如下:

官网ua

useragent

<webview src="http://img.studyofnet.comhttps://www.github.com/" useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko"></webview>

在访客页被导航(navigated)之前,为它设置 user agent,一旦这个页面加载之后,使用 setUserAgent 方法去改变这个页面的 user agent。

事实上,还有别的(主要受webview限制,即Electron限制),但是懒得找了,差不多意思就行。

可能已经有小伙伴想到方案了,所以我就不墨迹了,直接上代码处理,先是写入:

// 你也可以写成标签<webview useragent="['account', 'password']"></webview>,这里为了灵活而已webview.setAttribute('useragent', "['account', 'password']")

然后读取并赋值:

let infos = JSON.parse(navigator.userAgent)

由于ua我们写成了字符串的数组,所以这里自然可以解开成数组实例。

那么后面就简单了,不再赘述,直接看完整的核心代码即可,注意对比差异:

let inputs = document.querySelectorAll('.weui-desktop-form__input')// 从ua获取传入的值let infos = JSON.parse(navigator.userAgent)for(let i = 0; i < inputs.length; i) { let input = inputs[i] input.value = infos[i] // 修改input的值后,记得主动触发一次input事件。 input.dispatchEvent(new Event('input')) setTimeout(() => { let a = document.querySelector('.btn_login') a.click() }, 0)}

至此,我们就解决了纯前端模拟微信页面登录,并动态不同账号登录的问题了。

效果如下:

autologin


感谢大家的阅读,欢迎交流。

    推荐阅读
  • 电饭煲蛋糕蒸几分钟好(电饭煲蛋糕蒸熟的时间)

    电饭煲蛋糕蒸几分钟好20-30分钟。电饭煲蛋糕对于时间的把控很重要,时间长了蛋糕会出现扁塌的情况,口感不好,时间短了蛋糕不会熟,不能食用,根据人们的生活经验来说,用电饭煲做蛋糕按煮饭键后煮20-30分钟左右为宜。蛋糕是一种古老的西点,一般是由烤箱制作的,蛋糕是用鸡蛋、白糖、小麦粉为主要原料。以牛奶、果汁、奶粉、香粉、色拉油、水,起酥油、泡打粉为辅料。经过搅拌、调制、烘烤后制成一种像海绵的点心。

  • 心中若有桃花源全诗(心中若有桃花源全诗介绍)

    接下来我们就一起去了解一下吧!心中若有桃花源全诗一痴一念一个缘,牵动红尘情万千。几世轮回与辗转,只为今生手相牵。一情一爱一场缘,惊艳岁月和流年。纵然天涯各两端,难阻彼此心相连。情到深处苦为甜,不问别难见亦难。遥遥相望心也暖,不问今夕是何年。

  • 偏旁部首识字思维导图(什么是偏旁部首)

    偏旁是将一个合体字进行分切之后得到的某一部分称为偏旁。在古代的时候偏旁也分为两部分,右边的称为旁,左边的为偏。把形旁相同的字归类在一起成为部,开头的第一个字就成为部首。最早出现在《说文解字》。说文解字共540部,始一终亥,也就是说《说文解字》许慎在编著这本书的时候,将一部做为开始,亥部做为结尾。一共有540个部首。我整理了带注音的《说文》540部首歌诀,有兴趣的可以互相学习交流,一起共勉。

  • 人心不足蛇吞象的经典语录(人心不足蛇吞象)

    花斑蛇几番催促,王妄只好流着眼泪照办了。王妄听后非常高兴,可他毕竟和蛇有了感情,不忍心下手。满朝文武从没见过这么奇异的宝珠,赞不绝口,皇帝也非常高兴,封王妄为大官,并赏了他很多金银财宝。不得已,宋仁宗再次下令寻找宝珠,并许诺第二个献宝的人可以当丞相。于是,王妄再次找大蛇商量。碍于情面,大蛇又把剩下的一只眼睛化作宝珠给了王妄,于是王妄如愿当上了丞相。

  • 明月照我心在哪个台播出(明月照我心电视剧简介)

    以下内容希望对你有帮助!明月照我心在哪个台播出《明月照我心》在腾讯视频播出。《明月照我心》是由企鹅影视、腾讯影业出品,李阳执导,由方逸伦、凌美仕领衔主演,涵、周紫馨、董岩磊、倪寒尽、廖慧佳、李金阳、关畅、王浩歌、文渝淇等主演的国风爱情剧。该剧改编自动漫《王爷不要啊》,讲述了前来和亲的汐月公主李明月和北宣资王李谦经历种种坎坷,由彼此厌恶到相互喜欢,最后成长起来,相伴一生的故事。

  • 野生牛肝菌怎么焯水(市民花几百元买的牛肝菌炒出来不敢吃)

    原来,当天买回牛肝菌后,刘女士选出了一部分进行烹饪,可出锅后的"卖相"却让一家人"望而却步",不敢下口。得知自己没花"冤枉钱",刘女士总算安了心。为了避免市民逛市场时见到,误采误食,工作人员立即将菌子收走。今年野生菌上市以来,市场方通过巡查,已经发现了三种不知名品种的野生菌,经专家鉴定后,其中两种野生菌无毒,一种有毒,均进行了销毁。

  • 慢性肾脏病四期能吃黄瓜吗(慢性肾脏病患者慎吃的食物-蔬果类)

    慢性肾脏病患者慎吃的食物-蔬果类点击上方“血透室古戎”可以订阅哦!作为慢性肾脏病患者,除了要积极配合医生的治疗方案之外,还要管住嘴,科学挑食那怎么合理地吃呢?今天特地给广大肾脏病患者选择两部分内容做饮食指导1蘑菇蘑菇营养丰富,味道鲜。

  • 人流后不能吃什么东西(不适合人流后吃的食物)

    人流后应禁忌烟酒,吸烟及喝酒不利于子宫内膜的修复,刺激子宫兴奋,会加重出血的情况,长期的阴道流血会加重感染。继发其他的妇科病。术后一星期内脂肪控制在每日80克左右。因人工流产后,完全休息,高脂肪食物,会降低食欲减少蛋白、糖类、维生素的摄人,也易致胖。因人工流产后食物均以温补为上,这些食物不利于恢复健康。人流后不能吃热性如油炸及辛辣刺激性的食物,以免加重流血。

  • 烫伤后抹牙膏还是酱油(烫伤后可以涂牙膏)

    【烫伤后,可以涂牙膏、蜂蜜、酱油?】健康提示杯子没放稳,开水全烫在手上。相信不少人都有过被烫伤的经历,一旦被烫伤了,该如何紧急处理?“赶紧拿牙膏涂伤口”“牙膏加蜂蜜,双管齐下更管用”“酱油能保护皮肤,快准备起来”……若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。

  • 带烘干功能洗衣机能杀菌吗(衣服不再只有暴晒可消毒)

    应用臭氧除菌的洗衣机,内部的臭氧发生器可注入适量臭氧,对衣物进行消毒,比紫外线除菌效果强10倍。部分洗衣机有“消毒”功能,需配合消毒液,一般在洗衣前对衣物进行消毒,再将液体排出。但其会使微生物产生抗性,损害人的嗅觉器官,衣服漂洗次数也需要增加。如果家中只有常规模式的洗衣机,不具备除菌功能,建议添加除菌洗衣液或衣物消毒液。