金价大跳水?写一个金价监控脚本

8,073 阅读5分钟

说在前面

😶‍🌫️国庆过后,金价就大跳水,一直往下跌,看样子暂时是停不下来了,女朋友之前也入手了一点黄金,因此对黄金价格的变化比较关心,为了让她不用整天盯着实时金价,所以就搞了一个金价监控工具,超出设置的阈值就会发送邮件提醒✉。

c7acc1daf5b30174b34bdd85cd34d25.jpg

一、金价信息获取方案

金价实时信息有两种方案可以获取到:

1、网页信息爬取

我们可以先找到一些官方的金价信息网站,然后直接利用爬虫直接爬取,比如:quote.cngold.org/gjs/jjs.htm…

2、通过接口获取

例如nowapi中就有黄金数据信息接口,我们可以直接通过接口来获取:

二、提醒阈值设置

1、创建数据库

2、监控页面编写

简单编写一个页面用于添加和调整提醒内容。

三、修改配置信息

1、邮箱配置

这里我使用的qq邮箱作为发件账号,需要开启邮箱授权,获取授权码。

{
  host: "smtp.qq.com", // 主机
  secureConnection: true, // 使用 SSL
  port: 465, // SMTP 端口
  auth: {
    user: "jyeontu@qq.com", // 自己用于发送邮件的账号
    pass: "jyeontu", // 授权码(这个是假的,改成自己账号对应即可,获取方法: QQ邮箱-->设置-->账户-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务-->IMAP/SMTP开启 复制授权码)
  }
}
  • (1)打开pc端qq邮箱,点击设置,再点击帐户

  • (2)往下拉 可开启POP3/SMTP服务 根据提示即可获取qq邮箱授权码

  • (3)将获取到的授权码复制到配置信息里即可

2、数据库配置

填写数据库对应的配置信息。

{
  host: "localhost",
  user: "root", //数据库账号
  password: "jyeontu", //数据库密码
  database: "test", //数据库名称
}

3、nowapi配置

免费开通后将AppKeySign替换成自己的就可以了。

{
  AppKey: AppKey,
  Sign: "Sign",
}

四、脚本功能编写

1、获取金价信息

我直接使用nowapi的免费试用套餐,配额是10 次/小时

const { nowapiConfig } = require("./config.js");
async function getGoldPrice() {
  const result = await axios.get(
    `https://sapi.k780.com/?app=finance.gold_price&goldid=1053&appkey=${nowapiConfig.AppKey}&sign=${nowapiConfig.Sign}&format=json`
  );
  return result.data.result.dtList["1053"];
}

获取到的数据如下:

2、获取消息提醒阈值

(1)连接数据库

使用填写好的数据库配置信息连接数据库

const mysql = require("mysql");
const { dbConfig } = require("./config.js");

const connection = mysql.createConnection(dbConfig);

function connectDatabase() {
  return new Promise((resolve) => {
    connection.connect((error) => {
      if (error) throw error;
      console.log("成功连接数据库!");
      resolve("成功连接数据库!");
    });
  });
}

(2)查询数据

function mysqlQuery(sqlStr) {
  return new Promise((resolve) => {
    connection.query(sqlStr, (error, results) => {
      if (error) throw error;
      resolve(results);
    });
  });
}

async function getMessage() {
  const sqlStr =
    "select * from t_message where isShow = 1 and isActive = 1 and type = '金价监控';";
  const res = await mysqlQuery(sqlStr);
  return { ...res[0] };
}

获取到的数据如下:

3、发送提醒邮件

(1)创建邮件传输对象

使用填写好的邮箱配置信息,创建邮件传输对象

const nodemailer = require("nodemailer");
const { mail } = require("./config.js");

const smtpTransport = nodemailer.createTransport(mail);
const sendMail = (options) => {
  return new Promise((resolve) => {
    const mailOptions = {
      from: mail.auth.user,
      ...options,
    };
    // 发送邮件
    smtpTransport.sendMail(mailOptions, function (error, response) {
      if (error) {
        console.error("发送邮件失败:", error);
      } else {
        console.log("邮件发送成功");
      }
      smtpTransport.close(); // 发送完成关闭连接池
      resolve(true);
    });
  });
};
module.exports = sendMail;

(2)阈值判断

判断获取到的金价信息是否超出阈值范围来决定是否发送邮件提醒

async function mail(messageInfo, goldInfo) {
  let { minVal = -Infinity, maxVal = Infinity } = messageInfo;
  let { buy_price } = goldInfo;
  minVal = parseFloat(minVal);
  maxVal = parseFloat(maxVal);
  buy_price = parseFloat(buy_price);
  if (minVal < buy_price && maxVal > buy_price) {
    return;
  }
  const mailOptions = {
    to: messageInfo.mail.replaceAll("、", ","), // 接收人列表,多人用','隔开
    subject: "金价监控",
    text: `当前金价为${buy_price.toFixed(2)}`,
  };
  await sendMail(mailOptions);
}

五、定时执行脚本

可以使用corn编写一个定时任务来定时执行脚本即可。

  • * * * * * *分别对应:秒、分钟、小时、日、月、星期。
  • 每个字段可以是具体的值、范围、通配符(*表示每一个)或一些特殊的表达式。

例如:

0 0 * * *:每天午夜 0 点执行。
0 30 9 * * 1-5:周一到周五上午 9:30 执行。

你可以根据自己的需求设置合适的 cron 表达式来定时执行特定的任务。

六、效果展示

如果金价不在我们设置的阈值内时,我们就会收到邮件告知当前金价:

七、脚本使用

1、源码下载

git clone https://gitee.com/zheng_yongtao/node-scripting-tool.git
  • 源码已经上传到gitee仓库

gitee.com/zheng_yongt…

  • 具体目录如下:

2、依赖下载

npm install

3、配置数据填写

这里的配置信息需要修改为你自己的信息,数据库、gitee仓库、nowapi配置。

4、脚本运行

node index.js

更多脚本

该脚本仓库里还有很多有趣的脚本工具,有兴趣的也可以看看其他的:gitee.com/zheng_yongt…


🌟觉得有帮助的可以点个star~

🖊有什么问题或错误可以指出,欢迎pr~

📬有什么想要实现的工具或想法可以联系我~


公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。