使用golang+lua实现一个值班机器人

一个兴趣使然的程序员 一个兴趣使然的程序员     2022-12-25     668

关键词:

我们在的项目组呢,有一项工作是,收邮件(很大程度上使用邮件是为了存个底),然后从我们的系统里边查一下相关信息,然后回复个邮件的工作。虽然工作量并不大,但是会把时间切的稀碎。为了拯救我的时间,所以做了一个邮件的值班机器人。让他来顶替我自动回复邮件,考虑到这个东西应该也有不少人会用得到,所以就把这个东西分享出来。先把效果分享出来。

服务器上就很简单,dutyrobot就是Golang编译之后的框架。lua文件夹中就是使用lua编写的业务逻辑。Data.json就是保存了一些相关的数据,防止重启之后,数据丢掉,比如说Cookie信息。

用最基础的alpine进行启动一下,并且将相关的文件夹映射到容器里边,然后在容器里边启动软件。这么做主要是为了让镜像能够拥有自己的环境变量。

 

 然后业务逻辑里边定期,收邮件,然后判定业务逻辑,执行对应的lua脚本,然后回复邮件。

 

在顺手往我们的内部事务群里边推一条相关结果。

 

 

其实我本职是C#程序员来着,做这个东西,最先也是使用C#来实现的,不过C#跟Lua相性不好,我没有找到比较优雅的类库。要上Linux系统,用.net core + C 调用lua的方式虽然也尝试过,但是我本身对这件事情还是非常虚的。Python的各种包安装都给我搞蒙蔽了。所以最后就选用了Golang来写底层函数公布给Lua,然后让lua来写各种业务逻辑的方式来实现整个项目。框架部分嘛,一旦写完,改动的几率还是比较低的,并且Window交叉编译Linux,直接就可以部署上线,连个环境都不用装,简直爽歪歪。lua解释性语言,出了啥都没有以外其他的都挺好的。

基础框架都是通用的,所以可以直接放出来,拿出来用。只需要关心自己的业务内容就可以了。

基础框架:https://gitee.com/anxin1225/DutyRobotGo

在这个框架里边,我给lua提供了不少功能,主要包括收发邮件,发起网络请求,发起网络监听(甚至可以拿这个做底层做一个小型的API站,信我,我这么做过了已经),临时存个数据,获取环境变量,获取文件内容,再启动一个Lua容器(没错,lua又再起一个lua容器的能力),获取当前系统信息,cron定时任务。当然如果你觉得不够的话,还可以进行二次扩展,其实非常容易,我已经写了好多了,比着抄一下,很容易的。不过一般情况下不用扩展了,我这边就不深入讲解框架部分了,毕竟,怎么做业务才是重点。

然后,讲一下Lua部分是怎么实现的。因为Golang里边的代码是直接找到了main.lua进行执行的,我们也就从这个文件开始讲起。

 

 我将好多服务注册了进来,究竟有哪些服务呢,还是得去看看框架里边怎么写的。Cron就是我写的其中一个小功能。其实就是task任务,对应到框架部分呢可以查看tasks文件夹里去看具体的实现,可以看到俩边有两个文件,其中task.go是Golang的语言函数task_4lua.go就是把Golang的函数公开给lua来调用的接口注册的位置。

 

 

 

 我们来看到task_4lua.go这个文件里边,一般会存在一个函数叫做RegisterFunc_4lua就是注册用的。

 

 这就很眼熟了,Cron就是lua用的类的名字,下边这个map就是他们对应的需要调用的名字,后边会对照着golang这边的函数,一般函数里边我会写上lua那边应该怎么调用。如果找不到的话,可以来框架这边翻一翻,有惊喜也说不定。

 

 

 

我的业务里边。就是每分钟接收一下,每5分钟保存一下Cookie。真正的业务逻辑其实就写在各个lua文件里边。我们去看一下怎么接收消息和处理消息的。

 

 

 这里边就是简单的lua的业务逻辑了,收一下邮件,然后调用对应的处理lua,处理完了就完事了。

 

 

 

10行代码实现一个值班提醒应用(代码片段)

...场景。虽然,有一些现成的APP可以用,但是对程序员来讲使用起来不免有些繁琐,而且可能不太灵活。那么,我们如何手撸一个简单值班排班及提醒的应用呢?考虑一种简单的情况,对约束做如下假设:值班顺序固定,一旦确定... 查看详情

golang怎么实现横向扩展

...发架构,能充分榨干每一个CPU.但是Golang和Erlang不一样,Golang使用了CSP的模型,而Erlang采用的是Actor模型.两者区别仅仅只是消息队列归属范围区别而已.但带来的巨大的框架实现及使用差异让Golang和Erlang阵营里的童鞋们撕逼很久.其实可... 查看详情

go语言实现一个简单的简单网关

...负载均衡+各种策略,技术实现也有多种多样,有基于nginx使用lua的实现,比如openresty、kong;也有基于zuul的通用网关;还有就是golang的网关,比如tyk。这篇文章主要是讲如何基于golang实现一个简单的网关。转自:troy.wang/docs/golang/... 查看详情

人工智能openai我们程序员真的要下岗了-全能写go/c/java/c++/python/js人工智能机器人(代码片段)

文章目录@[toc]人工智能AICode写代码测试用golang实现冒泡排序用golang实现计算环比函数goroutineandchannel用golang实现二叉树遍历代码用golang实现线程安全的HashMap操作代码usingCprogramminglanguagewriteatinyOperationSystemuseClanguagewriteatinycompiler... 查看详情

golang实践录:ssh及scp的实现(代码片段)

本文介绍golang的scp实现和使用。问题提出工作中经常要查询日志,一般情况下需使用堡垒机登陆到远程机器,确认日志位置、文件名称,再用winscp软件下载,这过程比较繁琐,为节省时间,考虑用golang实现... 查看详情

golang实践录:ssh及scp的实现(代码片段)

本文介绍golang的scp实现和使用。问题提出工作中经常要查询日志,一般情况下需使用堡垒机登陆到远程机器,确认日志位置、文件名称,再用winscp软件下载,这过程比较繁琐,为节省时间,考虑用golang实现... 查看详情

如何在 Lua 中使用多个 If?

...看起来像:部分->音频->脚本我计划系统在触摸人形机器人时进行注册,如果部件的运行速度比说每秒30 查看详情

golang接口的使用(练习一)(代码片段)

在go语言中,一个类只要实现了接口要求的所有函数,我们就说这个类实现了这个接口。golang接口赋值实现方式一:将对象实例赋值给接口packagemainimport"fmt"//定义一个Animal接口,实现飞和跑的功能typeAnimalinterfaceFly()Run()//定义一个Bi... 查看详情

golang使用一个二叉树来实现一个插入排序(代码片段)

思路不太好理解,请用断点packagemainimport"fmt"typetreestructvalueintleft,right*treefuncSort(values[]int)varroot*treefor_,v:=rangevaluesroot=add(root,v)appendValues(values[:0],root)funcappendValues(values[]i 查看详情

golang之一个简单的聊天机器人

翠花,上代码packagemainimport("bufio""fmt""os""strings")funcmain(){//从标准输入读取数据inputReader:=bufio.NewReader(os.Stdin)fmt.Println("Pleaseinputyourname:")//读取数据直到遇见 位置input,err:=inputReader.ReadString(‘ ‘)if 查看详情

golang简单爬虫实现,爬取小说

为什么要使用Go写爬虫呢?对于我而言,这仅仅是练习Golang的一种方式。所以,我没有使用爬虫框架,虽然其很高效。为什么我要写这篇文章?将我在写爬虫时找到资料做一个总结,希望对于想使用Golang写爬虫的你能有一些帮助... 查看详情

lua协程实现(代码片段)

...好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制;另外,协程也更加轻量级。这样,在遇到某些可能阻塞的操作时,可以使用暂停协程让出CPU... 查看详情

如何使用golang实现一个api网关(代码片段)

你是否也存在过这样的需求,想要公开一个接口到网络上。但是还得加点权限,否则被人乱调用就不好了。这个权限验证的过程,最好越简单越好,可能只是对比两个字符串相等就够了。一般情况下我们遇到这种需要,就是在函... 查看详情

如何使用golang实现一个api网关(代码片段)

你是否也存在过这样的需求,想要公开一个接口到网络上。但是还得加点权限,否则被人乱调用就不好了。这个权限验证的过程,最好越简单越好,可能只是对比两个字符串相等就够了。一般情况下我们遇到这种需要,就是在函... 查看详情

使用golang实现目录的监控过程(代码片段)

GO实现文件夹监控收获查看watcher.go,看出实现一个系统event的监控,代码不过625行;执行exec.Cmd(),cmd.Run(),可以获得shell的执行状态;开始阅读github上的开源代码,代码特别精简;说明项目组有一个需求,即当团队人员更新Gitbook到... 查看详情

lua用table实现各种数据结构-队列(代码片段)

虽然可以使用Lua的table库提供的insert和remove操作来实现队列,但这种方式实现的队列针对大数据量时效率太低,有效的方式是使用两个索引下标,一个表示第一个元素,另一个表示最后一个元素。和c语言类似。代... 查看详情

如何减少 golang tcp 服务器中的 cpu 使用率?

】如何减少golangtcp服务器中的cpu使用率?【英文标题】:howcanIreducecpuusageinagolangtcpserver?【发布时间】:2017-12-1503:35:18【问题描述】:我尝试实现一个golangtcp服务器,发现并发对我来说是满意的,但是CPU使用率太高(并发15W+/s,... 查看详情

用golang实现一个代理池(代码片段)

...总会遇到爬取速度过快而被封IP的情况,这个时候就需要使用代理了。在https://github.com/henson/ProxyPool的启发下,决定自己实现一个代理池。项目已经开源在github。https://github.com/AceDarkkinght/GoProxyCollector开发环境windows7,Go1.8.4数据来... 查看详情