xChar
·2 years ago

最近小小研究了一下微信云托管的使用,简单实现了微信云托管托管微信自动回复功能,操作极其简单,感兴趣的可以快速做出来这个功能。

准备条件

首先需要一个正常运行的微信公众号订阅号,认不认证无所谓,正常运行的公众号就可以,登录微信云托管,选择微信公众号的身份登录,创建环境,选择第一个框架就可以了,进入后台后先准备好服务代码文件。
微信截图_20220704232342.png

准备服务代码文件

文件名Dockerfile,代码如下,直接复制即可

FROM node:12-slim

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm config set registry https://mirrors.tencent.com/npm/

RUN npm install

COPY . ./

CMD ["node", "index.js"]

文件名package.json,代码如下,直接复制即可

{
  "name": "cloudbase-push",
  "version": "1.0.0",
  "description": "call push server",
  "main": "index.js",
  "scripts": {},
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.4"
  }
}

第三个文件index.js,稍微需要修改点东西

const express = require('express')
const bodyParser = require('body-parser')

const PORT = process.env.PORT || 80

const app = express()

app.use(bodyParser.raw())
app.use(bodyParser.json({}))
app.use(bodyParser.urlencoded({ extended: true }))

app.all('/', async (req, res) => {
  console.log('消息推送', req.body)
  const { ToUserName, FromUserName, MsgType, Content, CreateTime } = req.body
  if (MsgType === 'text') {
    if (Content === '回复文字') {
      res.send({
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: CreateTime,
        MsgType: 'text',
        Content: '这是回复的消息'
      })
    } else if (Content === '回复图片') {
      res.send({
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: CreateTime,
        MsgType: 'image',
        Image: {
          //需要替换MediaID
          MediaId: 'h5HlJXE_4qH5MjLN-fnRu7QT5U4V1bLILEFPkliGrXRNU8vCYThZK-SgtCKoTecS'
        }
      })
    } else if (Content === '回复语音') {
      res.send({
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: CreateTime,
        MsgType: 'voice',
        Voice: {
          //需要替换MediaID
          MediaId: '06JVovlqL4v3DJSQTwas1QPIS-nlBlnEFF-rdu03k0dA9a_z6hqel3SCvoYrPZzp'
        }
      })
    } else if (Content === '回复视频') {
      res.send({
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: CreateTime,
        MsgType: 'video',
        Video: {
          //需要替换MediaID
          MediaId: 'h5HlJXE_4qH5MjLN-fnRu5Dos4aaDNh_9yHD4s9qvWTURJt2JpT7thyTYpZeJ9Vz',
          Title: '视频名称',
          Description: '视频介绍内容'
        }
      })
    } else if (Content === '回复音乐') {
      res.send({
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: CreateTime,
        MsgType: 'music',
        Music: {
          //需要替换ThumbMediaId
          Title: '音乐名称',
          Description: '每日推荐一个好听的音乐,感谢收听~',
          MusicUrl: 'https://c.y.qq.com/base/fcgi-bin/u?__=0zVuus4U',
          HQMusicUrl: 'https://c.y.qq.com/base/fcgi-bin/u?__=0zVuus4U',
          ThumbMediaId: 'h5HlJXE_4qH5MjLN-fnRu7QT5U4V1bLILEFPkliGrXRNU8vCYThZK-SgtCKoTecS'
        }
      })
    } else if (Content === '回复图文') {
      res.send({
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: CreateTime,
        MsgType: 'news',
        ArticleCount: 1,
        Articles: [{
          Title: 'Relax|今日推荐音乐',
          Description: '每日推荐一个好听的音乐,感谢收听~',
          PicUrl: 'https://y.qq.com/music/photo_new/T002R300x300M000004NEn9X0y2W3u_1.jpg?max_age=2592000',
          Url: 'https://c.y.qq.com/base/fcgi-bin/u?__=0zVuus4U'
        }]
      })
    } else {
      res.send({
        ToUserName: FromUserName,
        FromUserName: ToUserName,
        CreateTime: CreateTime,
        MsgType: 'text',
        Content: '收到,可能会在一天内回复~'
      })
    }
  } else {
    res.send('success')
  }
})

app.listen(PORT, function () {
  console.log(`运行成功,端口:${PORT}`)
})

//"type":"video","media_id":"h5HlJXE_4qH5MjLN-fnRu5Dos4aaDNh_9yHD4s9qvWTURJt2JpT7thyTYpZeJ9Vz","created_at":1656947116
//"type":"image","media_id":"h5HlJXE_4qH5MjLN-fnRu7QT5U4V1bLILEFPkliGrXRNU8vCYThZK-SgtCKoTecS","created_at":1656946931

其中,需要替换几个文件ID,因为文件里的代码是我的环境里的文件,你的需要修改为自己环境里的文件ID,获取文件ID方法如下。

获取文件ID

首先需要开启云调用里边的上传文件权限/cgi-bin/media/upload,粘贴进去,保存即可
微信截图_20220704234000.png
然后获取一下令牌,这里先把服务开通一下,可以使用未修改之前的文件创建一个服务,三个文件保存在同一个文件夹内,创建的时候选择这个文件夹上传即可,点击发布,等待部署完成!
微信截图_20220704234500.png
微信截图_20220704234543.png
进入服务,打开Webshell,这时会看到提示,需要先登录腾讯云,微信扫码登陆后,关闭刚才的Webshell网页,重新打开就可以输入命令行了,输入这个

cat /.tencentcloudbase/wx/cloudbase_access_token

右键可粘贴命令,粘贴后敲回车,获取到token,复制的的时候别复制了后面的#号!!
微信截图_20220704235232.png
微信截图_20220704235333.png
微信截图_20220705000004.png
获取到token就可以开始使用微信的api上传文件了~我这里使用的是postman,推荐使用这个,apifox用起来有点玄学。

###使用postman上传文件获取mediaID
creat new 新建一个http request注意把请求修改为POST,粘贴

https://api.weixin.qq.com/cgi-bin/media/upload?cloudbase_access_token=CMkBEoACDv0i-32PINQVE1b7gfRc-wbAbLSyAvxY1St4x0S52TfdCFHFfbxhICgM7kKIsLlRUaMbJhRqYX7NzZ8X9CXBnNCKMjfY7pfI-M2gLKt0iMeYzvX3Ty0YvyG01nLbYfW0g4CzRh4pjSvh_sL364Hsr5qUDQq6KNEcvfN-z48MHTR4mF4gw1gQCkOgp61H9eXx5c3GrOMrElEttll33po8TQGZvH-nSjufNr3GrTcKfa15WsNqqztEAeYW4PjiYD1oKvmAf8YQ5Jl1tJ9ZQOi3kwDFxSb8yZa20PY7_XLmuhtZmbbkIRN-5nYXvqASwrRWbTJK6cLyCY4xZSQ1snhgFIAA&type=video

修改cloudbase_access_token为你刚刚命令行获取的token,下面type,可选值为image video voice thumb,用来上传不同类型的文件,接下来点击body form-data 选择文件类型为file,在本地选取对应type的文件上传即可,注意文件大小限制,完成后点击Send
微信截图_20220705000328.png

微信截图_20220705000637.png
微信截图_20220705000817.png
微信截图_20220705001018.png
不出意外的话会获取到类似

{"type":"video","media_id":"h5HlJXE_4qH5MjLN-fnRu5Dos4aaDNh_9yHD4s9qvWTURJt2JpT7thyTYpZeJ9Vz","created_at":1656947116,"item":[]}

的回复,复制其中的media_id替换到上面index.js文件中,**注意要替换成对应文件形式的文件ID,不要把图片放在视频ID里面,**重新上传文件部署。
微信截图_20220705001620.png
微信截图_20220705001704.png
等待部署完成后,云托管-设置-全局设置-添加消息推送,选择你的公众号,如下图填写即可~

添加全局推送

微信截图_20220705001956.png
提交时需要公众号开发者扫码授权,直接授权即可,至此部署完成~

微信打开你的公众号消息框输入对应的回复文字之类的关键词即可获取到云托管里面index.js里面填写的回复内容~

Loading comments...