股市把握不住?写一个股价监控脚本试试

说在前面

今年国庆假期前,A股市场的表现可谓"牛气冲天"。自9月24日"金融新政"出台后,A股迎来了连续五个交易日的强劲上涨势头。9月30日,沪深两市成交额仅在早盘开盘35分钟内便突破1万亿元,刷新了历史最快万亿成交纪录。身边也有挺多朋友趁着这个机会入市了,于是乎原本很多学习交流群都变成了股市交流群🤣🤣🤣,既然这么关注股价变化,为什么不写一个脚本来监控呢?

一、股票价格获取方案

股票实时信息有两种方案可以获取到:

1、网页信息爬取

我们可以先找到一些官方的股票信息网站,然后直接利用爬虫直接爬取,比如: quote.eastmoney.com/sh601933.ht...

2、通过接口获取

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

二、提醒阈值设置

1、创建数据库

2、监控页面编写

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

三、修改配置信息

1、邮箱配置

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

javascript 复制代码
{
  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、数据库配置

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

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

3、nowapi配置

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

javascript 复制代码
{
  AppKey: AppKey,
  Sign: "Sign",
}

四、脚本功能编写

1、获取股票信息

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

javascript 复制代码
const { nowapiConfig } = require("./config.js");
//获取股票价格
async function getStockPrice(messageInfo) {
  const stoSym = messageInfo
    .map((item) => {
      return item.type.split("-")[1];
    })
    .join(",");
  const apiUrl = `https://sapi.k780.com/?app=finance.stock_realtime&stoSym=${stoSym}&appkey=${nowapiConfig.AppKey}&sign=${nowapiConfig.Sign}&format=json`;
  const result = await axios.get(apiUrl);
  return result.data.result.lists;
}

2、获取消息提醒阈值

(1)连接数据库

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

javascript 复制代码
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)查询数据

javascript 复制代码
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 like '股票-%';";
  const res = await mysqlQuery(sqlStr);
  return [...res];
}

获取到的数据如下:

3、发送提醒邮件

(1)创建邮件传输对象

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

javascript 复制代码
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)阈值判断

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

javascript 复制代码
async function mail(messageInfo, stockInfos) {
  for (const msg of messageInfo) {
    const code = msg.type.split("-")[1];
    let { minVal = -Infinity, maxVal = Infinity } = msg;
    minVal = parseFloat(minVal);
    maxVal = parseFloat(maxVal);
    const stockInfo = stockInfos[code] || {};
    const last_price = parseFloat(stockInfo.last_price);
    if (minVal < last_price && maxVal > last_price) {
      return;
    }
    const mailOptions = {
      to: msg.mail.replaceAll("、", ","), // 接收人列表,多人用','隔开
      subject: `${stockInfo.sname}-${last_price.toFixed(2)}`,
      text: `${stockInfo.sname}当前股价为${last_price.toFixed(2)}`,
    };
    await sendMail(mailOptions);
  }
}

五、定时脚本

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

  • * * * * * * 分别对应:秒、分钟、小时、日、月、星期。
  • 每个字段可以是具体的值、范围、通配符(*表示每一个)或一些特殊的表达式。 例如:
shell 复制代码
0 0 * * *:每天午夜 0 点执行。
0 30 9 * * 1-5:周一到周五上午 9:30 执行。

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

六、效果展示

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

七、脚本使用

1、源码下载

javascript 复制代码
git clone https://gitee.com/zheng_yongtao/node-scripting-tool.git

2、依赖下载

shell 复制代码
npm install

3、配置数据填写

config.js 中的配置信息需要修改为你自己的信息,包括:数据库、gitee仓库、nowapi配置。

4、脚本运行

shell 复制代码
node index.js

最后在自己的服务器里设置个定时脚本,每几分钟跑一下脚本就可以啦~~

更多脚本

该脚本仓库里还有很多有趣的脚本工具,有兴趣的也可以看看其他的

gitee.com/zheng_yongt...


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

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

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


公众号

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

说在后面

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

相关推荐
墨客先生几秒前
Node.js 安装常见问题
node.js
m0_74823715几秒前
海康威视监控web实时预览解决方案
前端
黑金IT1 分钟前
编程语言对决:Node.js与Python在视频处理领域
python·node.js·音视频
小丸子灬28 分钟前
clipboard----封装复制组件
开发语言·javascript
清风孤客1 小时前
Vue.js 如何塑造现代网络体验
前端·网络·vue.js
一棵开花的树,枝芽无限靠近你1 小时前
【PPTist】历史记录功能
前端·笔记·学习
licy__2 小时前
Vue 2 中 v-text 和 v-html 指令的使用详解
开发语言·前端·javascript
tester Jeffky2 小时前
深入探索 jQuery:解锁前端开发的高效工具
前端·javascript·jquery
장숙혜3 小时前
elementui进度条Progress组件
javascript·elementui·ecmascript
butterfly_onfly3 小时前
el-table 每列使用了min-width 百分比之后,解决闪屏问题
javascript·vue.js·elementui