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

前端微信授权登录如何弄(纯前端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


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

    推荐阅读
  • 韩国有什么牌子护肤品比较好(仙女们必知的韩国护肤品品牌)

    韩国女人的好皮肤也并非与生俱来,而是和她们十多岁就开始进行皮肤保养分不开的。今天我们就来了解下韩国化妆品(护肤品)品牌吧。很多MM分不清韩国护肤品的等级,只听说过韩国化妆品的一些大众牌子,以下是韩国护肤品的基本等级,大家可以作为参考。

  • 黑枸杞泡出来水什么颜色是正确的(黑枸杞用不同的水泡会有不同颜色)

    最近几年,黑枸杞越来越受到追捧,价格也比普通枸杞高出很多。之所以是黑色的,是因为黑枸杞含有大量的花青素。黑枸杞区别于普通枸杞的地方就是花青素含量,其它没有差别。因此,尽可能保留花青素就成为冲泡黑枸杞的关键环节。花青素在高温下不稳定,所以冲泡黑枸杞水温不能太高,最好用五六十度的温水冲泡,开水冲泡花青素损失会比较多。另外大家可能注意到了,用不同的水冲泡黑枸杞,会有不同的颜色。

  • 衣物柔顺剂的使用方法(衣物柔顺剂的适用范围)

    衣物柔顺剂的使用方法衣物柔顺剂的使用方法:先用洗衣液,洗衣粉等产品把衣服清洗干净。柔顺剂兑水,柔顺剂的外包装上有比例说明,按照说明兑入清水稀释。时间到了,就可以把衣服拧干,然后正常的晾晒就可以了。衣物柔顺剂的适用范围:主要是需要蓬松柔软的衣物,如羊毛衫、羊绒衫、毛毯、毛巾被、浴巾以及一些内衣等。有时为了使居氛围更加温馨,家庭中的一些纺织品如窗帘、沙发套等等也会使用柔软剂处理。

  • 男士乳房怎么清洗(男人私处黑状况多)

    ▌包皮龟头炎包皮龟头炎也可能导致男人丁丁发黑,主要是由于丁丁被传染细菌,长期的炎症刺激引发。2非器质性因素男人黑色素沉淀是主要因素,除此之外,很多男人朋友随着年龄的增长,丁丁的颜色会发生变化,属于正常状况,不影响男人的健康。频繁的使用洗剂会破坏丁丁的酸碱性,也会刺激娇嫩的皮肤。食物也有自身的酸碱性和刺激性,盲目乱用偏方,很可能导致丁丁过敏,或是因为酸碱失衡导致生病哦!

  • 企业如何做好绩效管理(企业做好绩效管理的方法)

    所谓无规矩不成方圆,所以需要明确企业各部门员工岗位的职责范围,用制度管人,避免考核中的争议,提高工作效率。完善工作管理流程企业绩效管理并不是单独的工作的主体,而是要求对工作程序和流程,包括各个环节的衔接要科学规范。真正意义的让绩效管理实施有效。绩效考核是整个企业的事,单靠人力资源管理部门是不容易完成的。对考核结果有异议的,有不同的意见,需要及时加以解决。

  • 豆花鱼的清淡做法(特色菜豆花鱼的做法)

    新鲜内酯豆腐搭配新鲜鱼片做出来是如此的光滑,热和美味。龙利鱼口感鲜美,肉质高,口感光滑,无刺,耐煮,无腥味。这是一种高蛋白,营养丰富的鱼,即使是新手有办法做到。

  • 白沟汽车站通了没(白沟汽车站发布最新通告)

    白沟汽车站通了没白沟汽车站最新班线发车信息随着疫情防控形势积极向好,出行的乘客数量也在提升。为满足旅客出行需求,有力支撑企业复工复产和经济平稳运行,白沟汽车站逐步有序的恢复客运班线。旅客乘车须知:1、乘客需提供身份证明登记信息,方可乘车。

  • 酱油鸡的做法 酱油鸡的做法 酱油鸡的家常做法

    步骤1准备材料:鸡肉半只、红椒5克、生姜1块、小葱2根、生抽4汤匙、料酒3汤匙、胡椒粉2汤匙。步骤3洗净的鸡肉加入胡椒粉,淋入料酒,再将调料里外抹匀,封上保鲜膜腌制1小时。步骤5锅中倒入少量油,放入姜末、葱花、红椒,加入生抽,搅匀成酱汁,待用。步骤6取出蒸好的鸡,斩成小块后装盘,浇上酱汁即可。

  • 高铁车次变动时间(新通高铁动车组列车票价公布)

    高铁车次变动时间12月27日,中国吉林网从中国铁路沈阳局集团有限公司获悉,新通高铁动车组列车票价方案公布。自12月27日开始发售过渡期动车组列车车票。新通高铁开通运营后,所属各车站将对旅客提供互联网购票后持二代居民身份证直接进出站服务,届时沈阳局集团公司管内共有66个车站提供此项服务。为满足旅客不同乘车需求,部分动车组列车还设有特等座席。

  • 知道爱你没有结局(简介是什么)

    《文爱》歌曲原唱:CG,贺敬轩,接下来我们就来聊聊关于知道爱你没有结局?以下内容大家不妨参考一二希望能帮到您!