• 【NodeJs-5天学习】第三天实战篇① ——10行代码给她造个熬夜提醒睡觉机器人


    面向读者群体

    • ❤️ 电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识 ❤️
    • ❤️ 业余爱好物联网开发者,有简单技术基础,想针对硬件功能构造简单的服务器❤️

    技术要求

    • HTMLCSSJavaScript基础更好,当然也没事,就直接运行实例代码学习

    专栏介绍

    • 通过简短5天时间的渐进式学习NodeJs,可以了解到基本的服务开发概念,同时可以学习到npm、内置核心API(FS文件系统操作、HTTP服务器、Express框架等等),最终能够完成基本的web开发,而且能够部署到公网访问。

    学习交流群

    • NodeJs物联网五天入门学习之旅(搜索:729040020

    🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝

    1. 前言

    假设你有个女朋友,整天拖延症熬夜刷抖音,那么可以给她造个熬夜提醒睡觉机器人 —— 每天晚上12点准时提醒睡觉。当然,前提你得有个女朋友或者假装以后会有一个来继续完成代码编写。

    2. 实现思路

    这里肯定要使用到国民第一大社交应用 —— 微信。

    这就不得不说微信开放平台的一些能力 —— 微信消息推送(一般也叫作推送消息提醒)。
    这里我们对接的是企业微信api(后面有说明),然后再通过微信app关注企业微信即可以在微信上同步收到企业微信的推送消息。

    所以整个实现思路:

    通过NodeJS对接微信推送平台,每天晚上12点的时候主动推送一条提醒消息。

    接下来,请根据我的步骤来配置环境。

    2.1 企业微信配置

    2.1.1 第一步,用她的微信账号注册企业

    用电脑打开企业微信官网 (https://work.weixin.qq.com/),注册一个企业,名称随意。
    在这里插入图片描述

    比如博主这里注册了一个叫做单片机菜鸟的企业

    在这里插入图片描述

    2.1.2 第二步,获取企业ID

    进入「我的企业」页面,拉到最下边,可以看到企业ID(后续会用到,这里了解即可)
    在这里插入图片描述

    2.1.3 第三步,创建应用

    注册成功后登录,点「应用管理」进入应用管理界面,选择 → 「自建」 → 「创建应用

    这里博主创建了一个叫做机器人推送提醒‘’。「应用logo」随意上传图片,「应用名称」随意填写

    在这里插入图片描述

    在这里插入图片描述

    • 这里会得到应用ID( agentid ),应用密钥Secret( secret ),这两个参数在后期对接也是非常有用的。
    2.1.4 第四步,微信接收企业微信通知

    进入「我的企业」 → 「微信插件」,扫描下方二维码,关注以后即可收到推送的消息。

    在这里插入图片描述

    比如博主关注了单片机菜鸟企业。

    在这里插入图片描述

    2.1.5 第五步,测试消息推送

    这时候我们可以测试一下消息推送,也就是步骤三的创建应用里面的发送消息。

    在这里插入图片描述

    2.2 对接企业微信开放者平台

    企业微信提供了通讯录管理、客户联系、身份验证、应用管理、消息推送(这是我们重点关注的内容)、素材管理、OA、效率工具、企业支付、企业互联、会话内容存档、电子发票、家校沟通、家校应用、政民沟通等API,企业可以使用这些API,为企业接入更多个性化的办公应用。

    在这里插入图片描述

    • 第一步,获取access_token
    • 第二步,构造消息体
    • 第三步,发送消息

    后面我们实现Arduino代码或者NodeJs代码也是依赖于这三个步骤来。

    2.2.1 access_token 接口凭证

    access_token是应用调用api的凭证(官方总不能让你无限制调用接口),由 corpid(企业ID)和corpsecret(应用密钥)换取。

    请求方式:GET(HTTPS)
    请求URL:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET

    通过这个请求我们即可得到 access_token 。

    2.2.2 构造消息体

    在这里插入图片描述

    支持非常多的消息类型。

    可以发送文本、图片、视频等多种类型的应用消息,这里以最简单的文本消息为例:(注意修改touser、agentid为自己想要的接收者userid列表、应用id)。

    {
       "touser" : "单片机菜鸟1|单片机菜鸟2",
       "msgtype" : "text",
       "agentid" : 1000002,
       "text" : {
           "content" : "来自于单片机菜鸟的通知"
       },
       "safe":0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    2.2.3 发送消息

    以上面两步得到的access_token和消息体为参数。发起一个HTTP post请求

    请求方式:POST(HTTPS)
    请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN

    很多注意事项也要看看。
    在这里插入图片描述

    原理讲完,接下来我们看看NodeJs代码如何实现。

    2.3 NodeJS代码实现

    2.3.1 对接微信模块
    // 1、导入所需插件模块
    const request = require('request')
    
    /******** 企业微信相关配置信息 填写自己的信息 ***********/
    // 企业ID 替换成自己
    const corpId = 'xxxxxxx'
    // 应用密钥 替换成自己
    const corpSecret = 'xxxxxxx'
    // 应用ID 替换成自己
    const agentId = 1000002
    // 发送给所有人
    const toUser = '@all'
    
    const tokenUrl = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpId}&corpsecret=${corpSecret}`
    const sendMsgUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=";
    /******** 企业微信相关配置信息 填写自己的信息 ***********/
    
    /**
     * 获取令牌
    */
    function getToken(success, error){
      request(tokenUrl, function (error, response, body) {
        if (!error && response.statusCode == 200) {
          var json = JSON.parse(body);
          console.log(json)
          success(json.access_token)
        } else {
          error('获取token失败')
        }
      })
    }
    
    /**
     * 真正发送消息
    */
    function sendMessage(token, content){
      const requestData = {
        touser: toUser,
        msgtype: "text",
        agentid: agentId,
        safe: 0,
        text: {
          content: content
        }
      }
    
      request({
        url: `${sendMsgUrl}${token}`,
        method: "POST",
        json: true,
        headers: {
            "content-type": "application/json",
        },
        body: requestData
      }, function(error, response, body) {
        console.log(body)
        if (!error && response.statusCode == 200) {
        }
      }); 
    }
    
    /***
     * 发送具体消息 
     */
    function sendText(content) {
      getToken((token)=>{
        sendMessage(token, content)
      }, (error) => {
        console.log(error)
      })
    }
    
    // 4、向外导出路由对象
    module.exports = {
      sendText,
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    这里需要安装一个request库。

    • npm install request --save
      在这里插入图片描述
    2.3.2 定时任务模块

    终端输入:

    • npm install node-schedule --save
    • 在这里插入图片描述

    安装定时任务模块。

    范例:

    const schedule = require('node-schedule');
    const  scheduleCronstyle = ()=>{
      //每分钟的第30秒定时执行一次:
        schedule.scheduleJob('30 * * * * *',()=>{
            console.log('scheduleCronstyle:' + new Date());
        }); 
    }
    
    scheduleCronstyle();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意规则:

    * * * * * *
    ┬ ┬ ┬ ┬ ┬ ┬
    │ │ │ │ │ |
    │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
    │ │ │ │ └───── month (1 - 12)
    │ │ │ └────────── day of month (1 - 31)
    │ │ └─────────────── hour (0 - 23)
    │ └──────────────────── minute (0 - 59)
    └───────────────────────── second (0 - 59, OPTIONAL)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6个占位符从左到右分别代表:秒、分、时、日、月、周几。

    每分钟的第30秒触发: '30 * * * * *'
    
    每小时的130秒触发 :'30 1 * * * *'
    
    每天的凌晨1130秒触发 :'30 1 1 * * *'
    
    每月的11130秒触发 :'30 1 1 1 * *'
    
    2022年的111130秒触发 :'30 1 1 1 2022 *'
    
    每周11130秒触发 :'30 1 1 * * 1'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    每个参数还可以传入数值范围。

    const task1 = ()=>{
      //每分钟的1-10秒都会触发,其它通配符依次类推
      schedule.scheduleJob('1-10 * * * * *', ()=>{
        console.log('scheduleCronstyle:'+ new Date());
      })
    }
    
    task1()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    2.3.3 编写10行代码
    const alarmWechat = require('./alarm/alarm_wechat.js') // 微信告警模块
    const schedule = require('node-schedule');
    const scheduleCronstyle = ()=> {
        //每天0点0分30秒执行一次
        schedule.scheduleJob('30 0 0 * * *',() =>{
            console.log('scheduleCronstyle:' + new Date());
            alarmWechat.sendText('亲爱的 12点钟了 该睡觉了~')
        }); 
    }
    scheduleCronstyle();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    代码很简单,就做一个定时任务,每天0点0分30秒进行一次提醒。

    3. 总结

    篇①以10行代码做了一个简单熬夜提醒功能,接入微信推送功能,给心爱的她造一个微信机器人。

  • 相关阅读:
    python经典百题之画一个最优美的图案
    Leetcode101.对称二叉树
    88 合并两个有序数组
    传奇微端需要下载客户端吗?传奇微端架设教程,微端配置教程
    osg实现自定义插件读取自定义格式的模型文件到场景
    计算机网络总结笔记
    HX3001升压IC芯片-Synchronous Boost DC/DC Regulator
    新手入门:Web安全测试大盘点
    浅析森林烟火AI检测算法的应用及场景使用说明
    一次 Keepalived 高可用的事故,让我重学了一遍它!
  • 原文地址:https://blog.csdn.net/weixin_44614230/article/details/126694984