转发自 http://blog.golune.com/article/2017/4/7/博客生成助手/
之前写过一个静态博客生成器chca,用于生成自己的静态博客,方便部署在github上和自己的网站上。网上的静态博客生成器很多,但是总是找不到适合自己的,不是经常出错就是配置太繁琐了,所以就自己动手写了一个。
最近研究运维机器人,github开源的Hubot可以非常方便的去创建一个自己的运维机器人,Hubot已经广泛应用于Github的日常运维工作,被称为最忙碌的员工。Hubot是基于Node.js、npm技术体系,使用CoffeeScript语言开发,出于对CoffeeScript的不了解,所以自己又造了个轮子,Axiom,Axiom是一个机器人框架,参考Hubot并打算在其基础上一直扩展下去。
如果打算做一个稳定的运维机器人来帮助自己工作,还是建议使用Hubot
用Axiom
做一个博客网站生成助手机器人
生成器可以使用任何一个静态网站生成工具,比如hexo、hugo等,这里使用的是chca
Axiom
框架有两个主要接口需要实现,工作平台适配器Adapter
和监控器Monitor
,只要实现了这两个接口就可以实现一个机器人了。
Axiom
默认实现了shell适配器。
实现BlogListener监听器
// blog.go
package main
import (
"github.com/num5/axiom"
"time"
)
type BlogListener struct {}
func (b *BlogListener) Handle() []*axiom.Listener {
return []*axiom.Listener{
{
Regex: "时间|几点|time",
HandlerFunc: func(ctx *axiom.Context) {
layout := "2006-01-02 15:04:05"
t := time.Now()
c.Reply("现在时间: %s", t.Format(layout))
},
},
}
}
func main() {
// 创建机器人并给机器人命名
bot := axiom.New("Axiom")
// 添加shell适配器
bot.AddAdapter(axiom.NewShell(b))
// 注册blog监听器
bot.Register(&BlogListener{})
// 运行机器人
b.Start()
}
这样就实现了一个简单的聊天机器人,当你问她几点了的时候她就会把时间告诉你了,这里用的是shell适配器,还可以自己编写一个QQ或者微信甚至语音聊天适配器。
集成chca博客生成器
刚才只是写了一个简单的可以回答时间的机器人,现在给机器人多加几个功能,比如下载chca
type BlogListener struct {
// 工作文件夹
WorkerDir string
// chca博客生成器下载地址
ChcaUrl string
// theme下载地址
ThemeUrl string
}
func (b *BlogListener) updateChca(ctx *axiom.Context, m string) {
// 下载chca
downUrl := b.ChcaUrl
ctx.Reply("下载CHCA,下载链接【" + downUrl + "】...")
ctx.Reply("文件下载中,请稍后...")
tarFile, err := b.download(downUrl)
if err != nil {
ctx.Reply("下载失败,错误信息:" + err.Error())
return
}
ctx.Reply("下载完成,开始解压缩...")
// 解压chca
err = targz.Extract(tarFile, b.WorkerDir)
if err != nil {
ctx.Reply("解压失败,错误信息:" + err.Error())
return
}
ctx.Reply("解压缩完成,复制文件...\n")
if runtime.GOOS != "windows" {
cmd :=exec.Command("chmod", "777", b.WorkerDir+"/chca")
if err := cmd.Start(); err != nil {
ctx.Reply("修改文件权限失败,请手动修改\n")
return
}
}
os.Remove(tarFile)
theme := path.Join(b.WorkerDir, "theme", b.Theme)
if !Exist(theme) {
ctx.Reply("检测到博客模板不存在,下载默认模板...")
tarTheme, err := b.download(b.ThemeUrl)
if err != nil {
ctx.Reply("下载失败,错误信息:" + err.Error())
return
}
ctx.Reply("模板下载完成,开始解压缩...")
// 解压
err = targz.Extract(tarTheme, b.WorkerDir + "/theme/")
if err != nil {
ctx.Reply("解压模板文件失败,错误信息:" + err.Error())
return
}
ctx.Reply("解压模板文件完成,复制文件...\n")
os.Remove(tarTheme)
}
ctx.Reply(m + "成功")
}
// 下载
func (b *BlogListener) download(downUrl string) (string, error) {
fileUrl, err := url.Parse(downUrl)
if err != nil {
return "", err
}
filePath := fileUrl.Path
fbs := strings.Split(filePath, "/")
fileName := fbs[len(fbs)-1]
_, cerr := curl.New(downUrl) // curl包使用的是github.com/Kenshin/curl
if cerr != nil {
return "", cerr[0]
}
return fileName, nil
}
给监听器添加下载命令
func (b *BlogListener) Handle() []*axiom.Listener {
return []*axiom.Listener{
{
Regex: "时间|几点|time",
HandlerFunc: func(ctx *axiom.Context) {
layout := "2006-01-02 15:04:05"
t := time.Now()
c.Reply("现在时间: %s", t.Format(layout))
},
},{
// 更新博客生成器
Regex: "更新chca|更新博客生成器|下载chca|下载博客生成器",
HandlerFunc: func(ctx *axiom.Context) {
var m string
if strings.Contains(ctx.Matches[0], "更新") {
m = "更新"
}
if strings.Contains(ctx.Matches[0], "下载") {
m = "下载"
}
b.updateChca(ctx, m)
},
},
}
}
func main() {
blogListener := &blog.BlogListener{
WorkerDir: "/data/chca",
ChcaUrl: "http://golune.qiniudn.com/chca-linux64.tar.gz",
ThemeUrl: "http://golune.qiniudn.com/default-theme.tar.gz",
}
// 创建机器人并给机器人命名
bot := axiom.New("Axiom")
// 添加shell适配器
bot.AddAdapter(axiom.NewShell(b))
// 注册blog监听器
bot.Register(blogListener)
// 运行机器人
b.Start()
}
这样当你输入“下载chca”命令的时候就可以把chca下载并解压到工作文件夹了,接下来就可以使用chca来生成博客了
接下来就简单了,我们可以用chca创建markdown文件、编译博客、打开chca内置服务器等等
比如编译博客
func (b *BlogListener) compileBlog(ctx *axiom.Context) {
cmd := exec.Command(b.WorkerDir+"/chca", "compile")
cmd.Dir = b.WorkerDir
if err := cmd.Start(); err != nil {
ctx.Reply("博客编译错误:%s", err.Error())
return
}
ctx.Reply("编译成功,请登录 http://" + b.Host + " 查看")
}
在Handle
方法里添加命令
// 编译博客xia
Regex: "编译博客|博客编译|更新博客|博客更新|编译markdown|编译MARKDOWN|markdown编译|MARKDOWN编译",
HandlerFunc: func(ctx *axiom.Context) {
b.compileBlog(ctx)
},
当然还可以做一个文件上传的命令用于上传markdown文件或者任何你想加的命令
练习代码:https://github.com/num5/staff-blog
CHCA
https://github.com/num5/chca