github 代码 commit 机器人

2018-09-12 16:12:30 +08:00
 not4jerk

灵感

曾经有一次在 GitHub 上看到使用 golang 自动保存 trending 的历史记录到 markdown 文件的项目,感觉这个项目做的很新颖而精致.进而做一个在 GitHub 上自动记录每日 hacknews 新闻和猫眼电影.

知识储备

思路

  1. 使用 http 包下载 html 文档
  2. goquery 提取 html 中用的信息
  3. 使用第三方翻译接口翻译有用信息
  4. 保存提取的信息到 redis 中并去重,设置自动失效时间
  5. 获取去重之后的信息使用 go template 来渲染 markdown 格式的文档
  6. go exec 调用 git 命令提交生产之后的 markdown 文件到 github 同时更新 readme.md 文件
  7. 发送每日 hacknews 和服务器的状态到自己的邮箱

main.go 代码注释解析

package main

import (
	"github.com/dejavuzhou/md-genie/util"
	"log"
	"time"
)

var gitCount = 1

func createCmds() []util.Cmd {
        //使用两个账号轮流交替提交代码到 GitHub
        //可耻的私心:我要让这两个 GitHub 账号在 contributions in the last year 显示面板都是绿色(代表活跃)
	gitCount++
	gifConfig1 := []util.Cmd{
		{"git", []string{"config", "--global", "user.email", "'dejavuzhou@qq.com'"}},
	}
	gifConfig2 := []util.Cmd{
		{"git", []string{"config", "--global", "user.email", "'1413507308@qq.com'"}},
	}
        //执行一系列 git 命令 和 linux 服务器的命令 来定时监控服务器的健康状态
	cmds := []util.Cmd{
		{"git", []string{"config", "--global", "user.name", "'EricZhou'"}},
		{"git", []string{"stash"}},
		{"git", []string{"pull", "origin", "master"}},
		{"git", []string{"stash", "apply"}},
		{"git", []string{"add", "."}},
		{"git", []string{"status"}},
		{"git", []string{"commit", "-am", time.Now().Format(time.RFC3339)}},
		{"git", []string{"status"}},
		{"git", []string{"push", "origin", "master"}},
		{"netstat", []string{"-lntp"}},
		{"free", []string{"-m"}},
		{"ps", []string{"aux"}},
	}
	if gitCount%2 == 0 {
		cmds = append(gifConfig2, cmds...)
	} else {
		cmds = append(gifConfig1, cmds...)
	}
	return cmds
}

func main() {
        //比较懒 使用最原始 sleep 的方法来实现定时任务
	for {   
                //提出 hacknews html 中的新闻游泳信息调用有道翻译来 保存信息到 redis
                //如果有条件建议使用 google 翻译 API
		if err := util.SpiderHackNews(); err != nil {
			log.Fatal(err)
		}
                //解析 hacknews 新闻到 markdown 文件,按照时间天格式命名
		if err := util.ParseMarkdownHacknews(); err != nil {
			log.Fatal(err)
		}
                //获取猫眼电影 json 接口,保存到 redis
		if err := util.FetchMaoyanApi(); err != nil {
			log.Fatal(err)
		}
                //解析电影信息到 markdown 文件
		if err := util.ParseMaoyanMarkdown(); err != nil {
			log.Fatal(err)
		}
                //读取 archieves 文件夹名称 生成 readme.md 文件
		util.ParseReadmeMarkdown()
                //运行 git linux 命令 保存日志 slice
		gitlogs, err := util.RunCmds(createCmds())
		if err != nil {
			log.Fatal(err)
		}
                //解析日志和 hacknews 新闻 生产 email 的 html 正文
                //发送邮件
		if err, mailBody := util.ParseEmailContent(gitlogs); err == nil {
			mailTitle := "md-genie+hacknews 日志:" + time.Now().Format(time.RFC3339)
			util.SendMsgToEmail(mailTitle, mailBody)
		} else {
			log.Fatal(err)
		}
                //每天执行 4 次 我的两个 GitHub 账号就可以每天活跃数量为两次
		time.Sleep(6 * time.Hour)
	}
}

dejavzuhou/util 包解析

md-genie 源代码

958 次点击
所在节点    Go 编程语言
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/488595

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX