使用 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,處理完了就完事了。
轉自:一個興趣使然的程序員
cnblogs.com/anxin1225/p/12846183.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/bfX4iW92bWpFM8koZ1WA0Q