V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
not4jerk
V2EX  ›  Go 编程语言

github 代码 commit 机器人

  •  
  •   not4jerk ·
    mojocn · 2018-09-12 16:12:30 +08:00 · 951 次点击
    这是一个创建于 2045 天前的主题,其中的信息可能已经有所发展或是发生改变。

    灵感

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

    知识储备

    • html css selector 或者xpath的语法,提出 hmtl 的有用信息(自己做爬虫也会使用到)
    • redis List/SET/HASH 等数据结构
    • 熟悉 git 的基本命令
    • 熟悉 ssh key 和配置 GitHub ssh key 登陆
    • GO 语言: exec,go-redis,goquery,template,http 等包
    • go stmp 包发送服务器信息和每日 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", "'[email protected]'"}},
    	}
    	gifConfig2 := []util.Cmd{
    		{"git", []string{"config", "--global", "user.email", "'[email protected]'"}},
    	}
            //执行一系列 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 包解析

    • api.go获取猫眼电影 json 的 api
    • command.go执行 os 系统命令
    • ding.go发送消息到钉钉群机器人
    • hacknews.go解析新闻,翻译新闻,保存 redis
    • mail.go发送邮件
    • markdown.go生成 markdown 文件
    • redditnews.go爬去 reddit 新闻(reddit 被墙废弃)
    • scanfiles.go 扫描 archives 文件夹里面的文件给 readme.md 做数据源
    • translate.go调用翻译 api

    md-genie 源代码

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5296 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:48 · PVG 13:48 · LAX 22:48 · JFK 01:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.