本文不涉及AI相关知识。如果你是为人工智能而来的,那么你可能会感到失望。前段时间有个朋友来找我,问我能不能做一个微信自动加好友的软件。在我眼里,程序员就是专门写木马病毒插件软件的三流黑客。如果他不会写作,那他连三流的黑客都算不上。于是为了证明自己是三流黑客,随便给了他两个百度现成的。完了,不过本着探索的精神,想顺便了解下这个插件的原理,于是google了一下,最后也没找到原理,倒是找了几个有意思的github仓库,使用网页版的微信API来做。第三方微信。先来看看效果吧?看一下大致步骤获取UUID根据UUID获取二维码扫码登录,获取登录信息交换登录信息获取初始化数据初始化数据获取好友列表和消息列表发送消息下面是具体过程,不感兴趣的可以直接拉到最后查看源码仓库。需要注意的是,每一步请求使用的方法(POST/GET)和Content-Type是不同的。我在下面标记了它们。如果有请求不成功,请参考gtihub源码。1.获取UUID接口地址https://wx.qq.com/jslogin请求方式POST参数类型(content-type)application/x-www-form-urlencodedparameter{appid:'wx782c26e4c19acffb',fun:'new',lang:'zh_CN',_:newDate().valueOf()}除了最后一个当前时间戳不固定外,其他3个参数是硬编码的,直接复制即可。如果调用成功,则会返回一个字符串window.QRLogin.code=200;window.QRLogin.uuid="obizONtqZA==";,你需要想办法拦截window.QRLogin.uuid=后面的字符串,也就是UUID。二维码步骤非常简单。有了UUID后,我们可以直接请求'https://wx.qq.com/qrcode/'+UUID获取二维码。拿到二维码后,不要急于扫描二维码,因为我们需要先监控二维码的扫描状态,这样才能知道是什么时候登录的。请求方式GET不需要参数.三、监听二维码扫描结果接口地址https://wx.qq.com/cgi-bin/mmw...请求方式GET参数类型(content-type)申请/x-www-form-urlencoded参数{tip:0,uuid:'obizONtqZA==',_:newDate().valueOf(),loginicon:true}tip取值为0或1,有2个阶段监控,第一个阶段监控用户是否扫码,提示0。第二阶段监听微信是否点击确认登录,提示1。uuid为第一步获取的UUID_currenttimestamploginiconI猜测应该是扫码后,返回用户头像,填true即可。当你返回结果的时候,当你扫描二维码的时候,接口会返回一个这样的对象{'window.code':201,'window.userAvatar':头像的base64地址}得到的code是201,说明已扫码,但不代表已登录,需要继续监听是否点击了手机微信的确认登录按钮(重复以上步骤,将参数中的提示改为1)如果这一步成功,会返回一个对象如下{'window.code':'200','window.redirect_uri':'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARD37_ikx-Kakd2i0W-f-E7q@qrticket_0&uuid=4f6yOkV4AA==&lang=zh_CN&scan=1548300672'}}4.获取初始化数据(敏感数据)上一步获取的数据中的window.redirect_uri包含一个url还有一些查询参数,直接请求这个地址貌似不成功,需要把url和参数拆分,然后再添加其他参数。接口地址请是上面的url查找方法GET参数类型(content-type)application/x-www-form-urlencodedparameter{ticket:上面获取的ticket,uuid:上面获取的uuid,lang:'zh_CN',//固定扫描:上面获取的扫描,fun:'new'//fixed}这一步返回的header中会有一个cookie,需要保存,然后把cookie包含在请求头中,另外一个是xml格式的敏感信息,还有需要保存。提示:xml格式可以用xml2js转成json。5.初始化调用。至此,登录终于接近成功了。调用如下接口即可,初始化如下接口地址https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=${~(newDate().valueOf())}请求方式POSTparametertype(content-type)application/jsonparameter{BaseRequest:{DeviceID:'e747337466044216',//这个好像是随便填的。sid:上一步得到的wxsid,Uin:上一步得到的wxuin,Skey:上一步得到的skey}}这里有两个区别,第一个是地址后面必须跟时间戳,和时间戳必须一点一点地反转。二是请求参数放在BaseRequest下,而不是在对象的一级属性下。返回的数据中有2个数据需要保存,一个是data.SyncKey,一个是res.data.User.UserName,后面会用到完成登录。如果您不需要好友列表,您可以直接接收消息。6.检测新消息接口地址https://webpush.wx.qq.com/cgi...请求方式GET参数类型(content-type)application/json参数lettime=newDate().getTime()letsynckey=''让sk=data.SyncKey.List||[]//data.SyncKey就是上一步得到的for(leti=0;i