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


使用Golang + lua实现一个值班机器人的更多相关文章
- 用 Lua 实现一个微型虚拟机-基本篇
用 Lua 实现一个微型虚拟机-基本篇 目录 介绍 机器指令模拟 最终核心代码 虚拟机内部状态可视化 完整项目代码 后续计划 参考 介绍 在网上看到一篇文章 使用 C 语言实现一个虚拟机, 这里是他的 ...
- phantomjs + python 打造一个微信机器人
phantomjs + python 打造一个微信机器人 1.前奏 媳妇公司不能上网,但经常需要在公众号上找一些文章做一些参考,需要的时候就把文章链接分享给我,然后我在浏览器打开网页,一点点复制过 ...
- 使用C# 开始第一个QQ机器人
本示例将会使用”嘤鹉学舌”这个小插件的实现来演示如何使用Newbe.Mahua实现第一个机器人插件. 插件功能 自动将发送者的消息回发给发送人,嘤鹉(Parrot,其实是说嘤嘤嘤怪)学舌. 开发环境要 ...
- Lua 是一个小巧的脚本语言
Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...
- tolua#是Unity静态绑定lua的一个解决方案
tolua#代码简要分析 2017-04-16 23:02 by 风恋残雪, 98 阅读, 1 评论, 收藏, 编辑 简介 tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信 ...
- 如何使用自对弈强化学习训练一个五子棋机器人Alpha Gobang Zero
前言 2016年3月,Alpha Go 与围棋世界冠军.职业九段棋手李世石进行围棋人机大战,以4比1的总比分获胜,在当时引起了轩然大波.2017年10月,谷歌公布了新版五子棋程序 AlphaGo Ze ...
- [Golang] lua战斗验证服务器
我的另外一个开源项目,任何建议.指正错误和优化我都非常欢迎 baibaibai_000@163.com 简介 本项目是用go语言编写,结合cgo功能,支持高并发执行lua脚本的程序. 扩展 可以扩展成 ...
- golang 裸写一个pool池控制协程的大小
这几天深入的研究了一下golang 的协程,读了一个好文 http://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653369770& ...
- [lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题
这是一个坑,天坑!如果不是我随手删除了一个本地变量,这个问题直到现在我应该也没有头绪. 首先,写了一个新的lua脚本,载入,执行.在执行的时候,出了这么一个莫名其妙的问题: EXC_BAD_ACCES ...
随机推荐
- 一个java 码手 的老牛 --- 涉及 一些不错的java 基础课程
http://www.zuidaima. com/user/1550463811307520/share/collect.htm
- Property [*****] not found on type [com.erp.pojo.ErpSupplier]
我实体类里用的是 springboot 里@Slf4j @Data 注解式写的 这样可以减少代码量 ,但是遇到一个问题影响我好长时间 出现了这个错误 Property [*****] not ...
- 【python实现卷积神经网络】全连接层实现
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
- Java成长第五集--面向对象设计的五大原则
S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写.以下图说明: 下面就个人的理解来说说这五大原则的含义到 ...
- AJ整理问题之:copy,对象自定义copy 什么是property
AJ分享,必须精品 copy copy的正目的 copy 目的:建立一个副本,彼此修改,各不干扰 Copy(不可变)和MutableCopy(可变)针对Foundation框架的数据类型. 对于自定义 ...
- [译]谈谈SpringBoot 事件机制
要"监听"事件,我们总是可以将"监听器"作为事件源中的另一个方法写入事件,但这将使事件源与监听器的逻辑紧密耦合. 对于实际事件,我们比直接方法调用更灵活.我们可 ...
- 你知道python入门,是学到什么程度才算是吗?
1.入门的标准是什么? 这是很多初学者都关注的问题,但又是一个很难回答的问题,问题的核心是采取什么标准来衡量一个人是否已经入门. 以知识量的多少来衡量是不是可行呢?有些人走马观花一般学了很多pytho ...
- CSS 中你应该了解的 BFC
我们常说的文档流其实分为定位流.浮动流和普通流三种.而普通流其实就是指BFC中的FC.FC是formatting context的首字母缩写,直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲 ...
- JS 的基础概念
本篇文章主要讲述js的基础知识! 首先,我们要明白什么是JS,JS就是 javascript 的简称,是一种轻量级,弱类型的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能, ...
- [V&N2020 公开赛]TimeTravel 复现
大佬友链(狗头):https://www.cnblogs.com/p201821440039/ 参考博客: https://www.zhaoj.in/read-6407.html https://cj ...