应用网页版微信API做一个微信机器人

本文不涉及到 AI 的学问,假如你是冲著 AI 来的,那末能够会让你扫兴了.

前一阵子一个朋侪找我,问我能不能搞一个微信自动加挚友的软件,(在一般人眼里,程序员就是特地写木马病毒外挂软件的三流黑客.不会写那就连三流都不是.

所以为了证实我是三流黑客,我随意百度了两个现成的给他.原本事变到这里应当完毕了的,不过本着探究的精力,想趁便相识一下这类外挂的道理,因而百歌谷度了一下,
终究道理没找到,却是找到几个有意思的 github 堆栈,应用网页版的微信 API 做第三方微信.

先看个效果?

<img src=”https://raw.githubusercontent…; width=”300″ />
<img src=”https://raw.githubusercontent…; width=”300″ />

步骤

我们看看大抵步骤

  1. 猎取 UUID
  2. 依据 UUID 猎取二维码
  3. 扫码上岸, 猎取上岸信息
  4. 拿上岸信息换初始化数据
  5. 拿数据初始化
  6. 猎取挚友列表和音讯列表
  7. 发送音讯

以下为详细历程,不感兴致的能够直接拉到末端检察源码堆栈

须要注重的是,每一步的要求所运用的要领(POST/GET) 和 Content-Type 都是不一样的,下面我都有标注,假如有要求不通的请参考 gtihub 源码.

一、猎取 UUID

接口地点 https://wx.qq.com/jslogin

要求要领 POST

参数范例(content-type) application/x-www-form-urlencoded

参数

{
    appid: 'wx782c26e4c19acffb',
    fun: 'new',
    lang: 'zh_CN',
     _: new Date().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) application/x-www-form-urlencoded

参数

{
    tip: 0,
    uuid: 'obizONtqZA==',
    _: new Date().valueOf(),
    loginicon: true
}

tip 取值 0 或 1, 监听分2个阶段,第一阶段,监听用户是不是扫码,tip 为 0,第二阶段,监听用户是不是在微信上点确认上岸,tip 为 1.

uuid 就是第一步猎取到的谁人 UUID

_ 当前时刻戳

loginicon 我猜应当是不是扫码完返回用户头像,都填 true 即可.

返回效果,当你扫描二维码的时刻,接口会返回你一个如许的对象

{
    'window.code': 201,
    'window.userAvatar': 头像的 base64 地点
}

获得的 code 是 201, 申明已扫码,但并不代表已上岸,还须要继续监听是不是在手机微信上点击 确认上岸 按钮(反复上面步骤,把 参数里的 tip 改成 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' }
}

四、猎取初始化数据(敏感数据)

上一步猎取到的数据内里的 window.redirect_uri 里包括了一个 url 和一些 查询参数,直接要求这个地点彷佛没办法胜利,须要将 url 和 参数拆分,然后到场其他参数

接口地点 就是上面的 url

要求要领 GET

参数范例(content-type) application/x-www-form-urlencoded

参数

{
    ticket: 上面获得的 ticket,
    uuid: 上面获得的 uuid,
    lang: 'zh_CN',  // 牢固
    scan: 上面获得的 scan,
    fun: 'new' // 牢固
}

这一步的返回的头部内里,会有个 cookie ,须要存起来,接来来获得要求头内里要带上这个 cookie,别的就是一个 xml 花样的 敏感的信息,也是要存起来.

tip: xml 花样能够用
xml2js 转换成 json.

五、初始化

呼,到这一步,终究靠近上岸胜利了,只需再挪用以下接口,初始化以下

接口地点 https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=${~(new Date().valueOf())}

要求要领 POST

参数范例(content-type) application/json

参数

{
    BaseRequest: {
        DeviceID: 'e747337466044216', // 这个彷佛随意填都能够
        Sid: 上一步猎取到的 wxsid,
        Uin: 上一步猎取到的 wxuin,
        Skey: 上一步猎取到的 skey
    }
}

这里有 2 个处所跟之前差别的,第一是地点背面要跟一个时刻戳,而且这个时刻戳还要按位取反,第二个是要求参数是放在 BaseRequest 下面,而不是对象的一级属性下面.

返回的数据内里有 2 个数据须要保存起来,一个是 data.SyncKey, 一个是 res.data.User.UserName,背面都邑用到

到此才真正完成上岸,下面假如你不须要挚友列表的话,能够直接收取音讯了

六、检测新音讯

接口地点 https://webpush.wx.qq.com/cgi…

要求要领 GET

参数范例(content-type) application/json

参数

let time = new Date().getTime()

let synckey = ''

let sk = data.SyncKey.List || []   // data.SyncKey 就是上一步猎取到的谁人

for (let i = 0; i < sk.length; i++) {
    synckey += `${sk[i].Key}_${sk[i].Val}`
    if (i !== sk.length - 1) synckey += '|'
}

// 通报的参数
{
    r: time,
    sid: 第四步拿到的 wxsid,
    uin: 第四步拿到的 wxuin,
    skey: 第四步拿到的 skey,
    deviceid: 'e747337466044216', // 同上一步
    synckey: synckey,
    _: time
}

返回内容的 data 内里 包括以下内容

window.synccheck={retcode:"0",selector:"2"}

假如 selector 是 2, 申明有新音讯,走下一步,猎取音讯内容

七、猎取音讯内容

接口地点 https://wx.qq.com/cgi-bin/mmw…

要求要领 POST

参数范例(content-type) application/json

参数

{
    BaseRequest: {
        Uin: 第四步拿到的 wxuin,
        Sid: 第四步拿到的 wxsid,
        Skey: 第四步拿到的 skey,
        DeviceID: 'e747337466044216', // 同上一步
    },
    SyncKey: data.SyncKey, // 还记得上一步我们费尽历尽艰辛转换这个数据吗? 你没看错,这里不须要转换,就是这么奇异
    rr: ~(new Date().valueOf())
}

返回效果内里有个 data.AddMsgList 就是音讯列表了,另有个 data.SyncCheckKey 就是下次要求的时刻用的 SyncKey, 每次都邑变的.

AddMsgList 是一个数组,内里能够包括多条音讯,音讯的自动比较多,就不逐一申清楚明了,这里说说 2 个比较主要的字段,其他的字段有兴致的能够本身打印出来看一下.

FromUserName 对方的微信名,说是微信名,实际上是一个 @ 或 @@ 开首的内部的id, 完全不可读,据我猜想 @ 开首的应当是一般挚友, @@ 开首的是群或许民众号之类的

Content 音讯内容

有了音讯内容,和发音讯的人,我们就能够复兴对方,不过复兴什么? 固然不能够写一大堆 if else 或许 switch case 去顺应各种情况,无妨网上搜刮一下 代价一个亿的ai代码 哈哈哈

八、猎取自动复兴内容

这边我用的是图灵机器人的 API 地点,固然你也能够用其他的.

接口地点 http://openapi.tuling123.com/…

要求要领 POST

参数范例(content-type) application/json

参数

{

perception: {
    inputText: {
        text: '待复兴的音讯'
    }
},
userInfo: {
    apiKey: tulingApiKey,  // 在图灵官网请求
    userId: tulingUserId   // 同上

}

你如果懒得去请求的话,能够在我的项目内里复制, 在 src/global.js 内里,在返回的内容内里 data.results[0].values.text 下面能够看到图灵给你天生的自动复兴内容(results是一个数组,支撑一次复兴多条)

九、复兴音讯

拿到自动复兴今后,我们只须要把它发给你的挚友,即完成一次自动对话.

接口地点 https://wx.qq.com/cgi-bin/mmw…

要求要领 POST

参数范例(content-type) application/json

参数

let timeStamp = new Date().getTime() + '' + (9000 * Math.random() + 1000)
{
    BaseRequest: {
      Uin: 同上,
      Sid: 同上,
      Skey: 同上,
      DeviceID: 同上
    },
    Msg: {
      Type: 1,  // 音讯范例 1 是笔墨音讯,其他的临时没用过
      Content: '复兴的内容',
      FromUserName: '你的用户名,在第五步有拿到',
      ToUserName: '对方的微信名 第七步的 FromUserName',
      LocalID: timeStamp,
      ClientMsgId: timeStamp
}

发送胜利的话,会返回以下内容

{
    BaseResponse: { Ret: 0, ErrMsg: '' },
    MsgID: '2033517278669301361',
    LocalID: ''
}

好了,如许我们的一个自动复兴机器人就完成了.完全的代码在这里

广告时刻

我们40人的前端团队终年招兵买马中,在厦门的和想来厦门的童鞋们,不要怜惜你的简历,用力砸过来 邮箱:atob('bnVveWFAZ2FvZGluZy5jb20='), 期待你一起来稿

对本文有看法或许发起,请只管在 github 上提 issue, 近来比较忙,比较不怎么逛社区

    原文作者:noahlam
    原文地址: https://segmentfault.com/a/1190000018017584
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞