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

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


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

    推荐阅读
  • 女人对喜欢她的男人什么表现(女人对喜欢她的男人的表现介绍)

    同时,这也是一种暗示,说明女人是真的喜欢上这个男人了。会主动做一些男人喜欢的事情:心理学家指出,女人从原始社会起,就是被动的一方。这种现象也一直被延续至今,所以,女人一般都是比较被动的,在异性交往中,她也更享受这种被追的感觉。所以,有的时候,不是女人小气,而是她觉得自己的地位受到了威胁,不得不采取了措施。更为重要的是,女人不舍得他不高兴,如果知道男人有烦恼,就会立刻出现在他的面前。

  • 羽毛球红黄牌(羽毛球比赛中也有黄牌)

    但是已被黄牌警告过的球员若再触犯规则时,裁判员将对有关球员出示红牌。除此以外,红牌警告已经开始直接影响比赛结果,受警告方丧失发球权,还会给对手加一分以示处罚。该场比赛直接判负,成绩为零。关于黑牌判罚迄今印象最为时刻的要数伦敦奥运会。

  • 人都有欲望学会控制(学会控制欲望)

    和拥有“无欲”心态的人相处,我们也能耳濡目染,发现生活不仅仅只有物质享受,更重要的是精神的升华和人生阶段的升华。诗仙李白,深受唐玄宗恩宠。成为“贪欲”的主人欲望是没有却想要,而欲望加深思想偏激往往则变成了贪婪,得到了一切却还想要更多。

  • 宋代诗人有哪些(宋代诗人介绍)

    隆兴元年调当阳尉。历知永平、广济县,通判阆州,知兴国军、吉州,广南西路、京西路转运判官。陆游生逢北宋灭亡之际,少年时即深受家庭爱国思想的熏陶。宋高宗时,参加礼部考试,因受秦桧排斥而仕途不畅。苏轼,字子瞻,又字和仲,号铁冠道人、东坡居士,世称苏东坡、苏仙。历任扬州签判、鄞县知县、舒州通判等职,政绩显著。南宋大臣,著名文学家、爱国诗人,与陆游、尤袤、范成大并称“南宋四大家”。

  • 捷途x90新款功能详解(发动机舱细节图)

    发动机舱细节图捷途X90发动机舱细节图 欢迎到店品鉴,。

  • 适合新手养的超可爱的小仓鼠(萌仓鼠的养成可以如此简单)

    萌仓鼠的养成可以如此简单最近有一些朋友问小编仓鼠是怎么养的如此肉肉,可爱的,小编今天就来写一下仓鼠的养成仓鼠对温度很是敏感,所以最适宜温度20-28℃,夏季最好不开空调,因为空调的开和关会使温差过大,容易感冒,冬天放在室外仓。

  • 曹国伟有没有微博(曹国伟以微博之力)

    在微博发展早期,人身攻击、虚假信息等问题已初见端倪。在实名制与社区公约的共同作用下,各类违规信息的传播阻力明显增大,用户和平台都成为实际受益者。后期会发布辟谣公告,最大程度扩大辟谣覆盖范围。目前,已有6000余个公益组织开通微博账号,超4000万微博网友参与捐助,“人人公益”理念在微博等具有公益属性平台的共同努力下正逐渐变为现实。

  • 一年级学生的家长意见怎么写(一年级家长意见怎么写)

    刘家长:恬恬在家比较任性,在幼儿园胆子小,希望老师能多提问她,锻炼她的胆量,让她变成一个勇敢的女孩。

  • 如何在照片里面提取文字(具体怎么操作)

    打开存储需要提取文字图片文件夹,对着图片右击鼠标——点击复制,打开word空白文档,在打开的word空白文档处右击鼠标——点击粘贴,这样就将图片粘贴到word文档中了,粘贴好就点击菜单栏“文件”,接下来我们就来聊聊关于如何在照片里面提取文字?在弹出对话框点击另存为,选好另存为地址后会弹出另存为对话框,在另存为对话框中,点击文件类型下拉箭头——点击“PDF”——点击“保存”这样图片就以PDF文件形式保存起来了。

  • 初学者玩沉香需要知道的六个要素(一颗珠子教你认识沉香)

    沉香以及沉香制品进入大家的视野和生活时间不久,尤其遍地偏远大家不易接触所以难以辨别真假,这就导致市场假货横行。那么我们首先要知道沉香的纹理结构是什么样子的。沉香最大的特点那就是沉香的「油线」人有血管树也有,人有动脉静脉树也有油线水线!沉水沉香是比钻石的产量还少的东西,但是骗的确实大多数人!