美文网首页杂乱日常记录Vue博客资源
基于Node.js搭建一个微信机器人

基于Node.js搭建一个微信机器人

作者: 野兽仙贝 | 来源:发表于2019-05-05 16:12 被阅读24次

将要实现的功能

  • 自动聊天,可以把它扔群里跟大家聊骚聊天
  • 每日简报,给同事家人定时播报头条简报
  • 每日天气预报,给你老婆程序猿哪来的老婆嘘寒问暖

基本架构

本项目基于Wechaty,这是一个封装了微信基本事件的开源库,比如onLogin(登陆事件)onMessage(消息事件)onLogout(登出事件)等等,详细使用可参考该项目文档,
有了这些事件,我们可以基于Node.js很轻松的开发一些常用功能。

本项目Node版本需要 >= 10,可以自行安装nvm进行版本切换。

本项目工程代码wechat-boy

编码实现

小试牛刀

首先新建工程,创建一个package.json,引入要用的库

"devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1", // es6转es5,不想写es6可以不用这两个
    "node-schedule": "^1.3.2",  // 定时任务
    "qrcode-terminal": "^0.12.0", // 打印登陆二维码
    "rimraf": "^2.6.3", // 终端指令工具
    "wechaty": "^0.22.6", // Wechaty基础库
    "moment": "2.24.0" // 日期处理
  },
  "dependencies": {
    "axios": "^0.18.0" // 网络请求
  }

然后执行npm install 或者 yarn,然后可以在index.js里简单写一个demo,

import QrTerm from 'qrcode-terminal';

  Wechaty.instance({ name: 'wechat-boy' })
  .on('scan', qrcode => {
    console.log(`onScan: ${qrcode}`);
    QrTerm.generate(qrcode);
  })
  .on('login', user => {
    console.log(`onLogin: ${user.name()}`);
  })
  .on('message', msg => {
    console.log(`from ${msg.from().name()} message: ${msg.text()}`)
  })
  .on('logout', usr => {
    console.log(`user ${user.name()} logout`)
  })

然后执行npm start,第一次会下载一些依赖,而且依赖很大,要等一段时间,如果实在下载不下来可能要全局FQ了,
可参考我另一篇使用proxifier全局代理

启动成功后会打印出登陆二维码


login-qrcode.png

扫码登陆,就可以侦听消息事件了

接入图灵机器人实现聊天功能

上一步里的回调侦听事件测试ok了后,我们就可以做点实际功能了,实现自动聊天功能只需在message回调里操作就行。

编辑message回调方法

on('message', async (msg) => {
  if (msg.self()) return;
  const room = msg.room();
  const content = msg.text();
  const contact = msg.from();
  let reply;
  if (room) {
    // 代表群消息
  } else {
    // 个人消息
    reply = await Service.reply(content);
    console.log(`tuling reply: ${reply}`)
    await contact.say(reply)
  }
})

// Service.reply
static async reply(content) {
    let response;
    try {
      const data = await this.get('http://www.tuling123.com/openapi/api', {
        params: {
          // key需要去http://www.tuling123.com申请
          key: TULING_API_KEY,
          info: content,
        }
      });
      if (data.code === 100000) {
        response = data.text;
      } else {
        throw new Error(TULING_ERROR_MESSAGE);
      }
    } catch (e) {
      response = e.message;
    }
    return response;
}

// axios get
static async get(url, params) {
    let response;
    try {
      response = await axios.get(url, params);
      console.log('------------success-----------');
      console.log(`${response.status}\n${response.statusText}\n${JSON.stringify(response.data, null, 2)}\n`)
    } catch (e) {
      console.log('------------error-------------');
      console.error(e);
      throw e
    }
    return response.data;

}

加入这些逻辑,此时你的账号已经可以自动聊骚聊天啦

接入每日简报,天气功能

每日自动播报功能就要用到schedule任务了,这里我们使用node-schedule库,在login的回调中执行定时功能

import Schedule from 'node-schedule'

const boy = Wechaty.instance({ name: 'wechat-boy' });
boy
.on('login', (usr) => {
  // 设置定时任务, 每天凌晨8点触发,
  // 每分钟的第30秒: '30 * * * * *'
  // 每小时的1分30秒 :'30 1 * * * *'
  // 每天的1点1分30秒 :'30 1 1 * * *'
  // 每月的1日1点1分30秒 :'30 1 1 1 * *'
  // 每周1的1点1分30秒 :'30 1 1 * * 1'
  // 详情见node_schedule文档
  Schedule.scheduleJob('0 0 8 * * *', async () => {
    // 寻找备注名称为${alias}的联系人
    const contact = await boy.Contact.find({ alias: `${alias}` })
    await contact.say(await Service.getNews());
    await contact.say(await Service.getWeather());
  })
})

// Service.getNews
static async getNews() {
    let msg;
    let response;
    try {
      response = await this.get('http://v.juhe.cn/toutiao/index', {
        params: {
          // 需要去https://www.juhe.cn/申请
          key: NEWS_KEY,
        },
      });
      msg = Util.handleNewsData(response);
    } catch (e) {
      console.error(e);
      msg = '获取新闻失败';
    }
    return msg;
}

// Service.getWeather
static async getWeather() {
    let msg;
    let response;
    try {
      response = await this.get(TIANQI_URL, {
        params: {
          cityname: TIANQI_CITY,
          // 需要去https://www.juhe.cn/申请
          key: TIANQI_KEY
        },
      });
      msg = Util.handleWeatherData(response);
    } catch (e) {
      console.error(e);
      msg = '获取天气失败';
    }
    return msg;
  }

一个简单的,拥有每日播报,自动聊天的微信机器人就实现了。

完整代码wechat-boy

相关文章

网友评论

    本文标题:基于Node.js搭建一个微信机器人

    本文链接:https://www.haomeiwen.com/subject/ajjhoqtx.html