博客生成帮手提式有线电话机器人

转发自
http://blog.golune.com/article/2017/4/7/博客生成帮手/

事先写过叁个静态博客生成器chca,用于转移本人的静态博客,方便陈设在github上和协调的网站上。网上的静态博客生成器很多,可是接连找不到适合自身的,不是平日出错正是安顿太繁琐了,所以就自个儿入手写了多少个。

近日研讨运转搭飞机器人,github开源的Hubot能够充足便宜的去成立2个要好的运行机器人,Hubot已经广泛应用于Github的家常运转工作,被号称最费力的员工。Hubot是基于Node.js、npm技术系统,使用CoffeeScript语言开发,出于对CoffeeScript的不领悟,所以自身又造了个轮子,Axiom,Axiom是3个机器人框架,参考Hubot并打算在其基础上直接扩充下去。

设若打算做1个安定的运转机器人来协理协调工作,依旧建议选用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()
}

诸如此类就贯彻了3个差不离的闲聊机器人,当您问她几点了的时候她就会把时光告知您了,那里用的是shell适配器,仍可以够协调编辑四个QQ也许微信照旧语音聊天适配器。

集成chca博客生成器

刚才只是写了1个简单易行的能够应对时间的机器人,以后给机器人多加多少个效能,比如下载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