吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1986|回复: 27
收起左侧

[其他原创] 利用nodejs结合企业微信机器人,定时推送公司收入状况

[复制链接]
liangji 发表于 2023-9-18 17:25
最近公司需要实时监控超市里面的收入状况,利用微信进行推送给老板
有考虑过用千寻微信框架的
但担心微信会面临封号的危险
所以考虑到利用企业微信群里面的  群机器人来进行推送
实现效果如图
微信图片_20230918163839.jpg

实现思路:
一 .
  • 先获取收银软件所执行的SQL语句,因为软件是用的 sql2008数据库
  • 所以利用Microsoft SQL Server Management Studio里面的SQL Server  Profiler对收银软件的sql语句抓包
  • 微信截图_20230918164424.png
  • 打开SQL Server  Profiler后,对“事件选择”这里进行过滤  只要下面TSQL 最后点击运行
  • 微信截图_20230918164603.png
  • 接下来打开收银软件的后台,选择对应的要查询的数据的表格进行查询,
  • 微信截图_20230918164733.png
  • 此时回到SQL Server  Profiler 发现出现了一堆sql语句  经过筛选对比后 最终发现是下面图中的sql语句
  • 微信截图_20230918164842.png
  • 然后我利用Navicat  Premium(个人喜欢用Navicat  Premium)将上面的sql语句进行精简后选择对应的数据库,执行sql语句
  • 效果如下:
  • 微信截图_20230918164957.png


二 . 在对数据抓包成功后,下一步进行推送代码的实现,我这里是使用的nodejs作为技术栈
  • 先获取拿到企业微信机器人的Webhook地址,具体方法自行百度
  • 微信图片_20230918170749.jpg
  • 新建nodejs项目,这里也不多赘述,代码如下,这里连接SQL2008的模块我用的是mssql这个模块,执行npm i mssql 进行安装
  • [JavaScript] 纯文本查看 复制代码
    const sql = require('mssql');
    const request = require('request');
    const config = {
      user: '数据库用户名',
      password: '数据库密码',
      server: '数据库的IP地址',
      database: '要连接的数据库名字',
      options: {
        encrypt: false
      }
    };
    var times = "" 
    setInterval(() => { //开启一个一秒的定时任务
      const currentDate = new Date();
      const year = currentDate.getFullYear();
      const month = String(currentDate.getMonth() + 1).padStart(2, '0');
      const day = String(currentDate.getDate()).padStart(2, '0');
      var hour = currentDate.getHours().toString().padStart(2, '0');
      if (hour !== times) { //判断现在的“时”是不是和上一个存放在变量times里面的值一样,如果不一样就执行查询发送
        sql.connect(config)
          .then(() => {
            return sql.query(`
              SELECT
                工号 = b.user_id,
                收银员 = b.user_name,
                机构 = LEFT(a.branch_no, 2),
                日期 = LEFT(CONVERT(VARCHAR(10), a.oper_date, 112), CONVERT(INT, '8')),
                总单数 = COUNT(DISTINCT CASE WHEN pos_type = '1' OR pos_type = '2' THEN a.sheet_no ELSE NULL END),
                总收入 = SUM(CASE WHEN pos_type = '1' OR pos_type = '2' OR pos_type = '3' THEN d.allpay_amt ELSE 0 END),
                优惠金额 = SUM(a.pos_org_amt - a.pos_total_amt),
                净收入 = SUM(CASE WHEN pos_type = '1' OR pos_type = '2' OR pos_type = '3' THEN d.allpay_amt ELSE 0 END) - SUM(a.pos_org_amt - a.pos_total_amt),
                现金 = SUM(d.pay01_amt),
                找零 = SUM(d.pay31_amt),
                实收现金 = SUM(d.pay01_amt + d.pay31_amt),
                移动支付 = SUM(d.pay51_amt)
              FROM
                view_pos_sale_master a
                JOIN t_sys_user b ON (b.user_id = a.user_id)
                JOIN view_pos_sale_pay d ON (a.sheet_no = d.sheet_no)
              WHERE
                a.pos_status = '9' AND
                (
                  (a.oper_date >= '${year}-${month}-${day}') AND
                  (a.oper_date <= '${year}-${month}-${day} 23:59:59.997') AND
                  (LEFT(a.branch_no, 2) IN ('00', '*'))
                ) 
              GROUP BY
                b.user_id,
                b.user_name,
                LEFT(a.branch_no, 2),
                LEFT(CONVERT(VARCHAR(10), a.oper_date, 112), CONVERT(INT, '8'))
            `);
          })
          .then(result => {
            if (result.recordset.length > 0) {
              var detail = `### 超市收入情况!\n
                ### 日期:${result.recordset[0].日期}\n`
              let allBill = 0
              let allIncome = 0
              for (let i = 0; i < result.recordset.length; i++) {
                allBill = allBill + result.recordset[i].总单数
                allIncome = allIncome + result.recordset[i].净收入
                detail += `>------收银员:${result.recordset[i].收银员}-----\n
                  >工号:<font color=\"info\" >${result.recordset[i].工号}</font>\n
                  >总单数:<font color=\"info\" >${result.recordset[i].总单数}单</font>\n
                  >现金:<font color=\"info\" >${result.recordset[i].现金}元</font>\n
                  >找零:<font color=\"info\" >${result.recordset[i].找零}元</font>\n
                  >实收现金:<font color=\"info\" >${result.recordset[i].实收现金}元</font>\n
                  >移动支付:<font color=\"info\" >${result.recordset[i].移动支付}元</font>\n
                  >总收入:<font color=\"info\" >${result.recordset[i].总收入}元</font>\n
                  >优惠金额:<font color=\"info\" >${result.recordset[i].优惠金额}元</font>\n
                  >净收入:<font color=\"info\" >${result.recordset[i].净收入}元</font>
                  `
                if (i === result.recordset.length - 1) {
                  detail += `>----------合计----------\n
                    >合计总单数:<font color=\"warning\" >${allBill}单</font>\n
                    >合计总收入:<font color=\"warning\" >${allIncome.toFixed(2)}元</font>\n
                    `
                }
              }
              var data = {
                "msgtype": "markdown",
                "markdown": {
                  "content": detail
                }
              }
              const wechatOptions = {
                url: '这里写微信机器人的Webhook地址',
                method: 'POST',
                headers: {
                  'content-type': 'application/json' 
                },
                body: JSON.stringify(data)
              };
              request(wechatOptions, (err, req, res) => {
                console.log(res);
                times = hour //这里把当前查询的“时”存放在变量times里
              })
            }
          })
          .catch(err => {
            console.error(err);
          });
      }
    }, 1000);
  • 把上述代码新建一个js文件(如:index.js) 丢进去 , 最后在终端里执行 node index.js命令
  • 微信截图_20230918172051.png
  • 最终接收到回调{"errcode":0,"errmsg":"ok"},代表推送成功

上面就是本人所运用的技术,如有不妥的地方,望各位大佬指点提出,本人必虚心学习

免费评分

参与人数 9吾爱币 +15 热心值 +7 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
luolifu + 1 + 1 用心讨论,共获提升!
好啦好啦 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
luozi1653 + 1 + 1 热心回复!
qaz003 + 1 用心讨论,共获提升!
zhczf + 1 + 1 我很赞同!
hrh123 + 1 + 1 用心讨论,共获提升!
xs20010601 + 1 + 1 谢谢@Thanks!
sscnc + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

照在指尖的星光 发表于 2023-9-19 11:05
本帖最后由 照在指尖的星光 于 2023-9-19 11:14 编辑

有没有考虑做成网页 网页封装成安卓app或者苹果描述文件。网页可以展示的数据更加多元化,表格、圆饼图、柱状图、折线图等等。要不然企业微信实时接收账单详情太过频繁,这个消息还没看,下条消息就推上来了,展示也过于单一,光看数字得不到更多的数字之外的数据信息。
做成网页也是wss,实时获取数据,实时加载成折线图和顶部总收入总单数。再封装成app(封装成app很简单,网址一输入就生成了),这样效果更好。
如果是一天查询一次企业微信这种挺好。
小雨网络 发表于 2023-9-18 18:26
1203489300 发表于 2023-9-18 20:20
aq425518860 发表于 2023-9-18 20:25
那谁框架 封号厉害 你这样还不如用投递方式 稳定又不会封号
就是那个秋 发表于 2023-9-18 20:37
aq425518860 发表于 2023-9-18 20:25
那谁框架 封号厉害 你这样还不如用投递方式 稳定又不会封号

投递方式?求指教
微笑丶永远 发表于 2023-9-18 20:44
有消息数量限制的
xiao_1245 发表于 2023-9-18 20:54
厉害厉害,学习了
earlc 发表于 2023-9-18 21:02
这个挺实用的,学习了
xs20010601 发表于 2023-9-18 21:17
特别实用,谢谢大佬分享知识
moruye 发表于 2023-9-18 21:24
很实用,刚好学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 11:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表