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

服务器上就很简单,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. 如何使用npt结合crontab实现集群之间的时间同步

    当我们每个机器的时间都不一致时,假如有一个定时任务,定的10点启动执行.结果namenode十点了启动任务,可是分配到的执行节点DataNode才九点五十导致任务执行失败怎么办?这就需要将机器之间的时 ...

  2. Solr复杂查询一:函数查询

    一.简介 Solr的函数可以动态计算每个文档的值,而不是返回在索引阶段对应字段的静态数值集.函数查询是一类特殊的查询,它可以像关键词一样添加到查询中,对所有文档进行匹配并返回它们的函数计算值作为文档得 ...

  3. 面试 HTTP ,99% 的面试官都爱问这些问题

    HTTP 和 HTTPS 的区别 HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超 ...

  4. 1324E - Sleeping Schedule

    题目大意:一天有h个小时,一个人喜欢睡觉,一共睡n次,每次都睡h个小时,开始时间为0,间隔a[i]或a[i]-1个小时开始睡第i次觉,每天都有一个最好时间区间,问这n次觉,最多有多少次是在最好时间内睡 ...

  5. F - Make It Equal CodeForces - 1065C

    题目大意:有n座塔,塔高h[i],每次给定高度H对他们进行削切,要求每次削掉的所有格子数不能超过k个,输出最少削几次才能使所有塔的高度相同. 思路一:差分+贪心 对于每一个高度h,用一个数组让1~h的 ...

  6. leetcode-0101 对称二叉树

    题目地址 https://leetcode-cn.com/problems/symmetric-tree/ 1.递归 本题最简单的思路是递归,可以假设两棵一模一样的树在进行镜像对比.他们之间的关系满足 ...

  7. Java 自定义注解及注解读取解析--模拟框架生成SQL语句

    假设们使用一张简单的表,结构如下: 定义注解: 表注解: package com.xzlf.annotation; import java.lang.annotation.ElementType; i ...

  8. ubuntu17.10安装lnmp安装包的核心问题-gcc版本、g++版本

    大致碰到的问题都是这样,不是php安装失败,就是MySQL安装失败,或者Nginx也安装失败 基本上是花式报错.后来在军哥的论坛中找到了这个帖子:https://bbs.vpser.net/viewt ...

  9. 面试题56 - I. 数组中数字出现的次数

    面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...

  10. Python获取当前 年 月 日

    import datetime datetime.datetime.now().year datetime.datetime.now().month datetime.datetime.now().d ...