githubコードcommitロボット


インスピレーション
GitHubでgolangを使ってtrendingの歴史を自動的に保存してmarkdownファイルに記録したプロジェクトを見たことがありますが、このプロジェクトは斬新で洗練されているような気がします.さらにGitHubに毎日hacknewsニュースと猫眼映画を自動的に記録する.
知識の蓄積
  • html css selectorまたはxpathの文法はhtmlの有用な情報(自分で爬虫類を作っても使う)
  • を提出する.
  • redis List/SET/HASH等のデータ構造
  • gitの基本コマンド
  • に詳しい
  • ssh keyとGitHub ssh keyの構成に詳しい
  • GO言語:exec,go-redis,goquery,template,httpなどのパッケージ
  • go stmpパケットサーバ情報と毎日hacknewsを自分のメールボックス
  • に送信
    構想
  • httpパッケージを使用してhtmlドキュメント
  • をダウンロード
  • goquery htmlで使用する情報
  • を抽出する.
  • サードパーティ翻訳インタフェースを使用して有用な情報
  • を翻訳する.
  • 抽出された情報をredisに保存して消去し、自動失効時間
  • を設定する.
  • デリバリー後の情報を取得go templateを使用してmarkdown形式のドキュメント
  • をレンダリングする
  • go execはgitコマンドを呼び出して生産後のmarkdownファイルをgithubに提出し同時にreadmeを更新する.mdファイル
  • は毎日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ソースコード