博客生成助手机器人

转发自 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

你可能感兴趣的:(博客生成助手机器人)