likes
comments
collection
share

2023最新:最简最全面NodeJS提醒之道

作者站长头像
站长
· 阅读数 14

1 前言

大家好,我是心锁,一枚23届准毕业生。

前端仔们,在我们需要在特定的时间进行某些操作时,比如定时抢课(暴露背景)、自动化脚本等,NodeJS是一个非常好的选择。

我在做脚本过程中,始终觉得差了点什么。想了想,应当是缺了提醒功能。

于是我便开始尝试在NodeJS中实现提醒功能,论如何低成本调用提醒能力。

2 目标

本文旨在探索在NodeJS中如何实现提醒功能,包括但不限于以下目标:

  • 了解NodeJS中提醒的实现方式
  • 掌握低成本调用提醒能力的方法
  • 实现在特定时间点触发提醒
  • 实现提醒内容的自定义

3 有哪些方法?

3.1 🌟beep系统蜂鸣器(轻型提醒推荐)

  • 依赖:无需依赖
  • 类型:非远程提醒
  • 价格:免费
  • TIPS:简单好用

笔者综合了各个帖子,终于确认了最终版本的蜂鸣器代码。该代码对比console.log(’'\x07’) 的优势是可以在vscode终端中正常发声,而后者则只可以在原始终端调用时发声,是个大坑。

const beep = () => {
  const childProcess = require("child_process");
  process.platform === "win32"
    ? childProcess.exec("powershell.exe [console]::beep(500,1200)")
    : childProcess.exec("afplay /System/Library/Sounds/Glass.aiff");
};

上边这个方法复制可用,快捷有效。

3.2 😈node-notifier库

  • 依赖:需依赖
  • 类型:非远程提醒
  • 价格:免费
  • TIPS:一般

这里还有一个不推荐的方法。通过调用node-notifier 发送系统通知。

pnpm add node-notifier

下边是最简调用例,总的来说功能更丰富,但是从刚需上非必要。可以点击这里前往查看更详细API

require("node-notifier").notify({
  title: "Mayi",
  message: "开始抢购",
  sound: true,
  wait: true,
});

3.3 😈发送邮件提醒

3.3.1 本地客户端发送

  • 依赖:需依赖
  • 类型:远程提醒
  • 价格:免费
  • TIPS:需要邮箱与授权码

安装第三方包nodemailer库,它允许我们使用SMTP协议(电子邮件)发送邮件。以下是使用nodemailer库发送邮件的示例:

const nodemailer = require('nodemailer');
​
const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: 'your_email_address@gmail.com',
    pass: 'your_email_password'
  }
});
​
const mailOptions = {
  from: 'your_email_address@gmail.com',
  to: 'recipient_email_address@gmail.com',
  subject: 'Sending Email using Node.js',
  text: 'That was easy!'
};
​
transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent: ' + info.response);
  }
});

3.3.2 第三方邮件服务商发送

  • 依赖:需依赖
  • 类型:远程提醒
  • 价格:不免费
  • TIPS:较麻烦

可以使用第三方邮件服务商提供的API接口实现发送邮件提醒功能。常见的第三方邮件服务商有SendGrid、Mailgun、Mailchimp等。使用这种方式需要注册并开通相应的服务,费用一般按发送的邮件数量计算。

以下是使用腾讯云邮件推送服务发送邮件的示例:

import { ses } from 'tencentcloud-sdk-nodejs'
​
import { secretID, secretKey } from '../../env.prod'const SesClient = ses.v20201002.Client
const clientConfig = {
  credential: {
    secretId: secretID,
    secretKey: secretKey
  },
  region: 'ap-hongkong',
  profile: {
    httpProfile: {
      endpoint: 'ses.tencentcloudapi.com'
    }
  }
}
​
const client = new SesClient(clientConfig)
client.SendEmail({
      FromEmailAddress: 'xxxxx@xxxx',
      Destination: ['xxxx'],
      Subject: 'xxxxx',
      Template: {
        TemplateID: 00001,
        TemplateData: JSON.stringify({
          title: 'xxxx',
          name: 'xxxx'
        })
      }
})

其中,secretIdsecretKey是腾讯云账号的访问密钥。

需要注意的是,使用邮件提醒功能需要开通相应的服务,同时模板也需审核,费用一般按发送的邮件数量计算。(很麻烦)

3.4 🚀Server酱微信推送(国内推荐)

  • 依赖:无需依赖
  • 类型:远程提醒
  • 价格:免费(5/天)
  • TIPS:国内体验起飞

Server酱是一款免费的微信公众号推送服务,支持通过微信直接接收推送内容。以下是使用Server酱发送微信推送的示例:

1.首先需要在官网注册并绑定微信号。

2.在Node.js中发送HTTP POST请求。

const url = `https://sctapi.ftqq.com/********.send`fetch(url, {
  method: 'POST',
  headers: {'Content-Type': 'application/x-www-form-urlencoded'},
  body: new URLSearchParams({
    title: 'Hello World',
    desp: '这是一条测试消息'
  })
})
.then(res => res.text())
.then(data => console.log(data))
.catch(err => console.error(err))

其中,/********是您的SCKEY,可以在官网中获取。

3.5 🌟Bark苹果推送

  • 依赖:无需依赖
  • 类型:远程提醒
  • 价格:免费
  • TIPS:仅苹果,需要下载APP

Bark是一款免费的苹果消息推送服务,支持通过iOS设备直接接收推送内容。以下是使用Bark发送苹果推送的示例:

1.首先需要在App Store中下载Bark App,并注册账号。

2.在Node.js中发送HTTP GET请求。

fetch(`https://api.day.app/********/Hello%20World`)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error))

其中,/********是您的Bark Key,可以在Bark App中获取。

3.6 🐎发送短信提醒

  • 依赖:需依赖
  • 类型:远程提醒
  • 价格:非免费
  • TIPS:真滴麻烦

可以使用云通讯服务商提供的API接口实现发送短信提醒功能。常见的云通讯服务商有阿里云、腾讯云等。使用这种方式需要注册并开通相应的服务,费用一般按短信条数计算。

以腾讯云为例子,腾讯云提供了SMS短信服务,可以通过API接口来发送短信提醒。以下是使用腾讯云SMS短信服务发送短信的示例:

// Depends on tencentcloud-sdk-nodejs version 4.0.3 or higher
const tencentcloud = require("tencentcloud-sdk-nodejs");
​
const SmsClient = tencentcloud.sms.v20210111.Client;
const clientConfig = {
  credential: {
    secretId: "SecretId",
    secretKey: "SecretKey",
  },
  region: "ap-beijing",
  profile: {
    httpProfile: {
      endpoint: "sms.tencentcloudapi.com",
    },
  },
};
​
// 实例化要请求产品的client对象,clientProfile是可选的
const client = new SmsClient(clientConfig);
const params = {
    "PhoneNumberSet": [
        "1234567890"
    ],
    "SmsSdkAppId": "xxxxx",
    "SignName": "xxxxxx",
    "TemplateId": "xxxxxx"
};
client.SendSms(params).then(
  (data) => {
    console.log(data);
  },
  (err) => {
    console.error("error", err);
  }
);

其中,secretIdsecretKey是腾讯云账号的访问密钥,PhoneNumbers是接收短信的手机号码,SignName是短信签名,TemplateId是短信模板ID。

需要注意的是,使用短信提醒功能需要模板审核,较为麻烦。

3.7 🚀Telegram Bot提醒

  • 依赖:无需依赖
  • 类型:远程提醒
  • 价格:免费
  • TIPS:Tg重度用户推荐

Telegram Bot是一款免费的即时通讯工具,支持通过Telegram直接接收推送内容。以下是使用Telegram Bot发送提醒的示例:

  1. 首先需要在Telegram中搜索@BotFather,创建一个新的Bot。
  2. 在Node.js中发送HTTP POST请求。
const BOT_TOKEN = 'your_bot_token';
const CHAT_ID = 'your_chat_id';

const sendMessage = async (message) => {
  try {
    const res = await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ chat_id: CHAT_ID, text: message }),
    });
    const data = await res.json();
    if (data.ok) {
      console.log(`Message sent: ${message}`);
    } else {
      console.error(data);
    }
  } catch (error) {
    console.error(error);
  }
};

sendMessage('Hello, World!');

其中,BOT_TOKEN是你的Bot的Access Token,CHAT_ID是你的Telegram账户的Chat ID。获取Chat ID的方式可以在Telegram中搜索@userinfobot,然后将自己的用户名(不是昵称)发送给它,就可以获得自己的Chat ID了。

3.8 😈Sound播放声音

  • 依赖:无需依赖
  • 类型:非远程提醒
  • 价格:免费
  • TIPS:额外准备音频文件

这种方法与3.1方法类似,但是不是蜂鸣器,而是通过调用系统的播放器,播放指定的声音文件。

const { exec } = require('child_process');

const playSound = (filename) => {
  if (process.platform === 'darwin') {
    exec(`afplay ${filename}`);
  } else if (process.platform === 'win32') {
    exec(`start ${filename}`);
  } else {
    console.log('Unsupported platform');
  }
};

playSound('sound.mp3');

这个代码可以在Windows和macOS上播放声音文件。在macOS上,它使用afplay命令播放声音文件,而在Windows上,它使用start命令打开声音文件以便Windows Media Player播放。

其中,filename是要播放的声音文件的路径。

3.9 🚀企业微信群聊机器人推送

  • 依赖:无需依赖
  • 类型:远程提醒
  • 价格:免费
  • TIPS:飞书、钉钉、企业微信均有webhook机器人服务,推荐使用。免费次数较多。

企业微信提供了机器人API,可以通过API来发送消息到企业微信群聊中。以下是使用企业微信机器人发送消息的示例:

  1. 首先需要在企业微信中创建一个群聊机器人,获取其Webhook地址。
  2. 在Node.js中发送HTTP POST请求。

const sendMessage = async (message) => {
  const webhookUrl = 'your_webhook_url';
  try {
    const res = await fetch(webhookUrl, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ msgtype: 'text', text: { content: message } }),
    });
    const data = await res.json();
    if (data.errcode === 0) {
      console.log(`Message sent: ${message}`);
    } else {
      console.error(data);
    }
  } catch (error) {
    console.error(error);
  }
};

sendMessage('Hello, World!');

其中,webhookUrl是企业微信群聊机器人的Webhook地址。企业微信机器人的Webhook地址需要在企业微信中进行配置,具体操作可以参考企业微信的官方文档。

(除了企微,还有飞书、钉钉甚至包括Discord、Slack,应该都有webhook接口)

3.10 🐎IFTTT Webhooks

IFTTT(If This Then That)是一款自动化工具,支持通过Webhooks直接接收推送内容。以下是使用IFTTT发送提醒的示例:

  1. 首先需要在IFTTT中创建一个Applet,将Webhooks作为Trigger,将你想要的Action作为Result。
  2. 在Node.js中发送HTTP POST请求。

const sendMessage = async (message) => {
  const webhookUrl = 'your_webhook_url';
  try {
    const res = await fetch(webhookUrl, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ value1: message }),
    });
    const data = await res.json();
    if (data.ok) {
      console.log(`Message sent: ${message}`);
    } else {
      console.error(data);
    }
  } catch (error) {
    console.error(error);
  }
};

sendMessage('Hello, World!');

其中,webhookUrl是IFTTT Applet的Webhooks URL。在IFTTT中创建Applet的过程中,需要选择Webhooks作为Trigger,并设置Action为你想要的操作。

3.11 🐎Pushbullet推送

Pushbullet是一款免费的消息推送服务,支持通过App或者浏览器插件直接接收推送内容。以下是使用Pushbullet发送推送的示例:

const sendMessage = async (message) => {
  const accessToken = 'your_access_token';
  try {
    const res = await fetch('<https://api.pushbullet.com/v2/pushes>', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Access-Token': accessToken,
      },
      body: JSON.stringify({ type: 'note', title: 'Message', body: message }),
    });
    const data = await res.json();
    if (data.active) {
      console.log(`Message sent: ${message}`);
    } else {
      console.error(data);
    }
  } catch (error) {
    console.error(error);
  }
};

sendMessage('Hello, World!');

4 总结

本文介绍了多种实现Node.js提醒功能的方法,涉及了邮件、微信、短信、声音、企业微信、IFTTT、Pushbullet等多种提醒方式。不同的提醒方式适用于不同的场景和需求,开发者可以根据自己的实际情况选择合适的提醒方式来实现提醒功能。

  • 邮件提醒功能是常用的一种提醒方式,通过邮件可以及时通知相关人员,配合微信邮箱提醒效果很好。
  • 微信提醒功能是目前比较流行的一种提醒方式,通过微信可以及时通知相关人员,国内很好用
  • 短信提醒功能也是常用的一种提醒方式,通过短信可以及时通知相关人员。在实现短信提醒功能时,需要注册并开通相应的短信服务,相对麻烦,慎用。
  • 声音提醒功能是一种比较特殊的提醒方式,通过播放声音可以让人立即注意到提醒。在实现声音提醒功能时,需要注意不同操作系统平台的差异和音频文件格式的兼容性。
  • 企业微信、钉钉、飞书提醒功能是一种适用于企业内部的提醒方式,可以通过企业微信群聊机器人来实现。在实现企业微信提醒功能时,需要注意机器人的注册和Webhook地址的配置。目前各个办公APP均开通了个人或组织模式,推荐使用,一次注册长期有效。
  • IFTTT提醒功能是一种比较灵活的提醒方式,可以通过Webhooks来实现。在实现IFTTT提醒功能时,需要在IFTTT中创建Applet,并设置相应的Trigger和Action,IFTTT提供了多种消息提示的方式,覆盖了非常多的APP。
  • Pushbullet提醒功能是一种比较方便的提醒方式,可以通过App或者浏览器插件来实现。在实现Pushbullet提醒功能时,需要注册并获取相应的Access Token。

另外,由于本文所涉及的技术和服务可能会随着时间变化而发生变化,建议读者在实际开发中参考官方文档和最新资料来实现相应的功能。

综上所述,本文介绍了多种实现Node.js提醒功能的方法,希望对大家在实际开发中有所帮助。