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

服务器上就很简单,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实现一个值班机器人的更多相关文章

  1. 用 Lua 实现一个微型虚拟机-基本篇

    用 Lua 实现一个微型虚拟机-基本篇 目录 介绍 机器指令模拟 最终核心代码 虚拟机内部状态可视化 完整项目代码 后续计划 参考 介绍 在网上看到一篇文章 使用 C 语言实现一个虚拟机, 这里是他的 ...

  2. phantomjs + python 打造一个微信机器人

    phantomjs + python 打造一个微信机器人 1.前奏   媳妇公司不能上网,但经常需要在公众号上找一些文章做一些参考,需要的时候就把文章链接分享给我,然后我在浏览器打开网页,一点点复制过 ...

  3. 使用C# 开始第一个QQ机器人

    本示例将会使用”嘤鹉学舌”这个小插件的实现来演示如何使用Newbe.Mahua实现第一个机器人插件. 插件功能 自动将发送者的消息回发给发送人,嘤鹉(Parrot,其实是说嘤嘤嘤怪)学舌. 开发环境要 ...

  4. Lua 是一个小巧的脚本语言

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  5. tolua#是Unity静态绑定lua的一个解决方案

    tolua#代码简要分析 2017-04-16 23:02 by 风恋残雪, 98 阅读, 1 评论, 收藏, 编辑 简介 tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信 ...

  6. 如何使用自对弈强化学习训练一个五子棋机器人Alpha Gobang Zero

    前言 2016年3月,Alpha Go 与围棋世界冠军.职业九段棋手李世石进行围棋人机大战,以4比1的总比分获胜,在当时引起了轩然大波.2017年10月,谷歌公布了新版五子棋程序 AlphaGo Ze ...

  7. [Golang] lua战斗验证服务器

    我的另外一个开源项目,任何建议.指正错误和优化我都非常欢迎 baibaibai_000@163.com 简介 本项目是用go语言编写,结合cgo功能,支持高并发执行lua脚本的程序. 扩展 可以扩展成 ...

  8. golang 裸写一个pool池控制协程的大小

    这几天深入的研究了一下golang 的协程,读了一个好文 http://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653369770& ...

  9. [lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题

    这是一个坑,天坑!如果不是我随手删除了一个本地变量,这个问题直到现在我应该也没有头绪. 首先,写了一个新的lua脚本,载入,执行.在执行的时候,出了这么一个莫名其妙的问题: EXC_BAD_ACCES ...

随机推荐

  1. jetCache 基本使用

    1.pom引用 <!--jetcache缓存 lettuce--> <dependency> <groupId>com.alicp.jetcache</gro ...

  2. tf.nn.conv2d 卷积

    tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) 第一个参数input:指需要做卷积的输入 ...

  3. 【python实现卷积神经网络】批量归一化层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  4. ES5和ES6基本介绍与面向对象的基本思想

    ES6和ES5基本介绍 let  const  关键词定义变量 let 定义变量 特点: let 定义的变量,不会进行预解析  let 定义的变量,与 forEach() 中的变量类似  每次执行都会 ...

  5. 模仿NetFlix首页效果

    之前写过UWP 带左右滚动按钮的横向ListView———仿NetFlix首页河的设计,讲述了如何设计一个带有左右滚动按钮横向的ListView. 不过我在半年之前挖了一个坑,由于工作关系,没时间来填 ...

  6. git以及gitHub的使用说明书

    一.使用说明 1.Git与github的功能: Git是世界上最先进的分布式版本控制系统,也就是用来记录你的项目代码历史变更信息的工具:github就是用来存储你的代码以及变更信息的云端平台: 2.优 ...

  7. Pytorch实现MNIST手写数字识别

    Pytorch是热门的深度学习框架之一,通过经典的MNIST 数据集进行快速的pytorch入门. 导入库 from torchvision.datasets import MNIST from to ...

  8. selenium获取多窗口句柄并一切换至原窗口句柄(三个窗口)

    网上有很多是selenium基于python来获取两个窗口句柄与切换,本文实现用python+selenium获取多窗口句柄并一一切换至原窗口句柄(三个窗口),且在每个窗口下进行一个搜索或翻译,然后截 ...

  9. CKEditor与定制

    一 开始使用 官网 基本示例: 搭建服务器(这里使用apache) 下载standard的ckeditor解压放在apache的htdocs的目录下 在htdoc下面新建index.html,写入代码 ...

  10. DataTable 与XML 交互

    一.将DataTable的内容写入到XML文件中 /// <summary> /// 将DataTable的内容写入到XML文件中 /// </summary> /// < ...