开发一个将微信表情保存到相册,导出微信表情到电脑的工具,附带源码

如果你想试试,或者不想了解原理,直接使用

请在公众号 小面条工具 回复 机器人


使用wechaty来开发一个用于将表情保存到相册的机器人

起因

为什么我要开发一个这样的机器人。

从18年开始,网页版微信已经陆续被封禁,之前我们使用网页微信登录后,可以轻松获得表情的cdn地址,但是这种方法不可以了之后,我们现在仅仅能选择公众号网页后台的形式,下载表情包,但是这两种方式都需要借用电脑的帮助。

如果仅仅用手机怎么办呢,那么我们只能选择其他的黑科技方式。

我目前的思路一共是两种。

  • 1.使用无头浏览器挂网页公众号后台,解析协议。

  • 2.使用微信协议,写机器人,解析表情包cdn。

最后经过我的调研之后选择了第二种,并且使用了wechaty来作为开发的库,并且使用的是‘wechaty-puppet-hostie’协议。

因为wechaty使用node开发,所以我会同样使用nodejs作为开发语言

话不多说 直接上代码,我会一步步讲解



const { Wechaty } = require('wechaty')

const { ScanStatus } = require('wechaty-puppet')

const QrcodeTerminal = require('qrcode-terminal')

const { FileBox } = require('file-box')

const parseString = require('xml2js').parseString;

首先引入这几个库。

wechaty wechaty主库

file-box wechaty 上传文件使用的库

xml2js 解析xml的库



const token = "xxx"

const bot = new Wechaty({

  puppet: 'wechaty-puppet-hostie',

  puppetOptions: {

    token,

  }

});

初始化bot 这里面token 需要通过开源协议获取



bot

  .on('scan', (qrcode, status) => {

    if (status === ScanStatus.Waiting) {

      QrcodeTerminal.generate(qrcode, {

        small: true

      })

    }

  })

  .on('login', async user => {

    console.log(`user: ${JSON.stringify(user)}`)

  })

此处为二维码展示,和登录情况,

那么接下来就是重点了。


.on('message', async msg => {

    if (msg.self()) {

      // Don't deal with message from yourself.

      return

    }

    console.log(JSON.stringify(msg))

    console.log(msg.payload.fromId)

    let is_e = false

    const contact = msg.from()

    if (contact && msg.payload.text) {

      let xml = msg.payload.text;

      let pr = new Promise((resolve, reject) => {

        parseString(xml, function (err, result) {

          if (result && result.msg && result.msg.emoji && result.msg.emoji) {

            if (result.msg.emoji.length && result.msg.emoji.length > 0) {

              if (result.msg.emoji[0].$ && result.msg.emoji[0].$.cdnurl) {

                is_e = true

              }

            }

          }

          if (is_e) {

            resolve(result.msg.emoji[0].$.cdnurl)

          } else {

            try {

              if (result.msg.appmsg[0].type[0] === '8') {

                contact.say('这张图片是分享图片,请删除后再添加,然后在发送')

                reject()

              }

            } catch (err) {

              reject('1')

            }

          }

        });

      })

      let url

      try {

        url = await pr

        try {

          let user = msg.payload.fromId

          var timestamp = Date.parse(new Date()) / 1000

          if (um[user]) {

            if (timestamp - um[user] > miaoshu) {

              um[user] = timestamp

            } else {

              let contact = msg.from()

              contact.say((miaoshu - (timestamp - um[user])) + '秒后可以继续使用')

              return

            }

          } else {

            um[user] = timestamp

          }

        } catch (err) {

          return

        }

        url = url.replace('http://vweixinf.tc.qq.com', 'https://xxxxxxx')

      } catch (err) {

        if (err === '1') {

          await contact.say('我现在只会下载表情包~给我发送表情包就行了~')

        }

      }

    }

  })

这段代码比较多,我一点点剖析


if (msg.self()) {

      // Don't deal with message from yourself.

      return

    }

此处的意思是 ,如果收到自己的消息,就不进行处理,很重要,因为每次发消息,bot自身也会接受到一个消息。


const contact = msg.from()

此处为 必须是用户发来的消息我们才解析


let pr = new Promise((resolve, reject) => {

    ...

}

这个promise 为 解析xml如果 ,并且我处理了无法分析的表情包,如果解析成功,会resolve(url)



try {

                    let user = msg.payload.fromId

                    var timestamp = Date.parse(new Date()) / 1000

                    if (um[user]) {

                        if (timestamp - um[user] > miaoshu) {

                            um[user] = timestamp

                        } else {

                            let contact = msg.from()

                            contact.say((miaoshu - (timestamp - um[user])) + '秒后可以继续使用')

                            return

                        }

                    } else {

                        um[user] = timestamp

                    }

                } catch (err) {

                    return

                }

此处我加了一个 限制,20秒内才能下载一个 在上面必须定义一下时间


let um = {}

let miaoshu = 20



url = url.replace('http://vweixinf.tc.qq.com', 'https://xxxxxxx')

这里是因为这个域名不支持https 所以我将这个域名用nginx 反向代理到了我自己的服务器用于下载

最后


.on('friendship', async friendship => {

        console.log(JSON.stringify(friendship))

          friendship.accept().catch(async (err) => {

              console.log(err)

          })

    })

    .start()

加上秒通过,这样你下载表情的工具就完成了,我会将源码放到github 有需要的话直接使用即可。

github地址 https://github.com/channg/wechaty-getwechatmeme

最后说一下微信包 cdn地址 分好多种,只有我replace的那种不支持https,如果需要https的话需要反向代理,其他的直接改成https即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容