#设计
最近总店隔壁的竞争对手的喇叭经常叫唤说给顾客优惠了多少钱之类的,他们那个收银软件和我们用的是同一家公司的,这个叫唤的程序据我跟软件公司的人了解性能很低而且经常读不出来,算是比较鸡肋的功能,他们基本上不安装。
不过我之前也问过他们有没有其他方案,他们说暂时没有。
恰好我最近不是换了评论系统twikoo么,这个评论系统有个很有意思功能就是利用webhook在收到评论的第一时间给指定的平台发送消息,twikoo开通了微信和QQ的推送,比传统邮件提醒快很多,效果看下
我看了下服务平台上的调用,说是一种叫webhook的功能,有点类似我们以前学C#的时候做web服务。大概思路就是一直监听某个端口的请求,根据收到密钥对消息进行判断,然后再分发给对应的用户。
我当时突发奇想,虽然我改不了我们公司的ERP系统,但是这个系统提供了一个数据库扩展触发器的功能,对应表进行修改的时候就可以触发触发器,那么我是不是可以通过SQL来执行HTTP请求?之前的系统重度,病毒甚至可以通过SQL入侵我的电脑进行任意操作,没道理我发个请求都不行吧?
一想好就开始百度,没费多少功夫就找到了SQL发送HTTP请求的存储过程,代码如下:
USE [hydee]
GO
/****** Object: StoredProcedure [dbo].[P_GET_HttpRequestData] Script Date: 12/25/2020 18:38:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
参数说明?
@URL=http请求地址
@status=状态代?
@returnText=返回?
@object=对象令牌
@errSrc=错误源编?
*/
CREATE PROCEDURE [dbo].[P_GET_HttpRequestData](
@URL varchar(500),
@status int=0 OUT,
@returnText varchar(2000)='' OUT
)
AS
BEGIN
DECLARE @object int,
@errSrc int
/*初始化对*/
EXEC @status = SP_OACreate 'Msxml2.ServerXMLHTTP.3.0', @object OUT
IF @status <> 0
BEGIN
EXEC SP_OAGetErrorInfo @object, @errSrc OUT, @returnText OUT
RETURN
END
/*创建链接*/
EXEC @status= SP_OAMethod @object,'open',NULL,'GET',@URL
IF @status <> 0
BEGIN
EXEC SP_OAGetErrorInfo @object, @errSrc OUT, @returnText OUT
RETURN
END
EXEC @status=SP_OAMethod @object,'setRequestHeader','Content-Type','application/x-www-form-urlencoded'
/*发起请求*/
EXEC @status= SP_OAMethod @object,'send',NULL
IF @status <> 0
BEGIN
EXEC SP_OAGetErrorInfo @object, @errSrc OUT, @returnText OUT
RETURN
END
end
GO
然后试了一下通过server酱的webhook成功给公司内部群发送了一个通知。。
之后发现这个转发到企业微信好像要收钱的,所以就没用了,不过思路算是打开了。
我难道不可以自己写一个么?我也不开放外网就在本地执行。
今天就百度了一下试着用node.js写了个简陋的服务端,并且调用powershell朗读文字,效果还真不错,朗读虽然机械化了点,但是能分辨数字,也很连贯。
代码如下,哈哈
var http = require('http');
var url = require("url");
//用于执行powershell的库
const { exec } = require('child_process');
const iconv = require('iconv-lite');
var config = require('./config.js');
var server = http.createServer(function (req, res) {
// 接收数据,转换成json对象
data = url.parse(req.url,true).query.msg;
console.log(data);
//拼装朗读文本朗读就行了
exec(`powershell.exe Add-Type -AssemblyName System.speech; $speak = New-Object System.Speech.Synthesis.SpeechSynthesizer; $speak.Rate = 1; $speak.Speak([Console]::In.ReadLine()); exit`).stdin.end(iconv.encode(data, 'gbk'));
});
// 时刻监听配置文件里的端口
server.listen(config.port);
console.log("Server runing at port: " + config.port + ".");
目前本地效果执行还不错,不顾暂时还没实装,得想个办法把这玩意儿弄傻瓜点,挂在自动启动里不用店员们管就是最好的了。
好了,先这样了。
加入评论