30分鐘快速編碼-beego開發要聞直播推送

需求

1.windows端實時推送
2.因為是股市要聞,實時要求間隔5s~30s
3.彈窗可定制,不影響正常看盤

信息源

1.雪球要聞直播
2.快蘭斯24小時財經直播http://m.fbecn.com
3.東方財富研報

實現思路

客戶端推送工具,以前rss非常流行,能不能通過rss客戶端去實現這個效果,這樣就能節省下許多工作量,到github.com上查了下,找到了個FeedNotifier

效果
image.png

推送效果.png

FeedNotifier用得是atom和rss協議,知道協議就好辦,只要爬取新聞源并轉換為atom協議內容即可

配置FeedNotifier
image.png
解析新聞源
雪球
快蘭斯24小時財經直播
東方財富-研報直播
開始編碼

創建路由,router.go

package routers

import (
    "majornews/controllers"

    "github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{})
    beego.Router("/majornews", &controllers.MajorNewsController{})
    beego.Router("/emoneylive", &controllers.EMoneyLiveController{})
}

controllers/majornews.go

package controllers

import (
    "majornews/models"

    "github.com/astaxie/beego"
)

type MajorNewsController struct {
    beego.Controller
}

func (c *MajorNewsController) Get() {
    c.Ctx.WriteString(models.MajorNewsContent)
}

解析雪球要聞直播

package models

import (
    "bytes"
    "fmt"
    "os/exec"
    "time"

    "github.com/buger/jsonparser"
    "github.com/gorilla/feeds"

    "github.com/astaxie/beego/logs"
)

func init() {
    logs.Info("初始化雪球爬蟲引擎.")
}

var MajorNewsContent string
var Sendedlist map[string]bool = make(map[string]bool)
var UseMac bool = false

func FetchMajorNewsLive() string {
    logs.Info("爬取新的一份要聞.")
    myfetcher := NewFetcher("xueqiu.com")
    myfetcher.Get("/") //news session
    newsReq, newsBody, err := myfetcher.Get("https://xueqiu.com/v4/statuses/user_timeline.json?page=1&user_id=5124430882")
    if err != nil {
        logs.Error(err)
    }
    if newsReq.StatusCode == 200 {
        logs.Info("get news.")
    }

    now := time.Now()
    feed := &feeds.Feed{
        Title:       "啊菜要聞直播",
        Link:        &feeds.Link{Href: "https://xueqiu.com/u/5124430882"},
        Description: "直播股市要聞",
        Author:      &feeds.Author{Name: "要聞直播", Email: "suixin@xueqiu.com"},
        Created:     now,
    }
    feed.Items = []*feeds.Item{}
    jsonparser.ArrayEach(newsBody, func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
        m1, _, _, _ := jsonparser.Get(value, "target")
        m2, _, _, _ := jsonparser.Get(value, "text")
        // m3, _, _, _ := jsonparser.Get(value, "description")
        m4, _, _, _ := jsonparser.Get(value, "id")
        var m0 int64
        if mdata, err := jsonparser.GetInt(value, "created_at"); err == nil {
            m0 = mdata
        }
        // m0, _, _, _ := jsonparser.Get(value, "created_at")

        item := &feeds.Item{}
        item.Title = "發表于" + time.Unix(m0/1000, 0).Format("2006-01-02 15:04:05")
        targeturl := fmt.Sprintf("%s%s", "https://xueqiu.com", string(m1))
        item.Link = &feeds.Link{Href: targeturl}
        item.Description = string(m2)
        item.Author = &feeds.Author{Name: "要聞直播", Email: "suixin@xueqiu.com"}
        fmt.Println("時間戳:", m0)
        item.Created = time.Unix(m0/1000, 0)
        feed.Items = append(feed.Items, item)
        //mac的消息通知
        if UseMac {
            id := string(m4)
            titlestr := "發表于" + time.Unix(m0/1000, 0).Format("2006-01-02 15:04:05")
            msg := string(m2)
            if _, ok := Sendedlist[id]; !ok {
                Sendedlist[id] = false
            }
            SendToNotificationCenter(id, titlestr, msg, targeturl)
        }
    }, "statuses")
    atom, _ := feed.ToAtom()
    // fmt.Println(atom)
    MajorNewsContent = atom
    return MajorNewsContent
}

//發送到mac通知中心
func SendToNotificationCenter(id string, titlestr string, msg string, targeturl string) {
    if issend, ok := Sendedlist[id]; ok && !issend {
        // fmt.Println("未發送,執行發送")
        cmdstr := `terminal-notifier -title '` + titlestr + `' -message '` + msg + `' -open '` + targeturl + `' -sound default -contentImage https://xavatar.imedao.com/community/201711/1513595963954-1513595964287.png`
        exec_shell(cmdstr)
        Sendedlist[id] = true
    }

}

func exec_shell(s string) {
    cmd := exec.Command("/bin/bash", "-c", s)
    var out bytes.Buffer

    cmd.Stdout = &out
    err := cmd.Run()
    if err != nil {
        logs.Error(err)
    }
    // fmt.Printf("%s", out.String())
}

func subString(str string, begin, length int) (substr string) {
    // 將字符串的轉換成[]rune
    rs := []rune(str)
    lth := len(rs)

    // 簡單的越界判斷
    if begin < 0 {
        begin = 0
    }
    if begin >= lth {
        begin = lth
    }
    end := begin + length
    if end > lth {
        end = lth
    }

    // 返回子串
    return string(rs[begin:end])
}

定時爬取新聞源

package main

import (
    "majornews/models"
    _ "majornews/routers"

    "github.com/astaxie/beego"
    "github.com/astaxie/beego/logs"
    "github.com/astaxie/beego/toolbox"
)

func init() {
    logs.SetLogger(logs.AdapterConsole, `{"filename":"project.log","level":7,"maxlines":0,"maxsize":0,"daily":true,"maxdays":10}`)
    logs.Info("雪球要聞直播初始化")
    models.FetchMajorNewsLive()
    models.FetchRoom()
    intervalstr := "0/5 * * * * *"
    tk_xueqiu := toolbox.NewTask("tk_xueqiu", intervalstr, func() error { models.FetchMajorNewsLive(); return nil })
    toolbox.AddTask("tk_xueqiu", tk_xueqiu)
    toolbox.StartTask()
}

func main() {
    logs.Info("直播開始,只保留最新的20條數據")
    beego.Run()
}

編譯完成后部署到服務器上即可

需要帶超預期研報推送工具的可以加入知識星球獲取

掃描進入知識星球

非常好的模式,讓我今年收益翻倍的文章,強烈推薦分享下:
2020年4月至6月凈利潤斷層實戰小結-真香~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評論 6 545
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,795評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,943評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,057評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,773評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,106評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,282評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,793評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,507評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,741評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,929評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,325評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,661評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,482評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,702評論 2 380

推薦閱讀更多精彩內容

  • 2017.06.26星期一 昨晚吃了點葷腥胃痛了一晚上,直到早上聽到女兒喊我才覺得渾身癱軟,沒有一點力氣。拖著疲憊...
    小幸福vs茹萍閱讀 165評論 0 0
  • 黃向軍 瞞著老婆,偷偷買了電影票,一個人去看《龍貓》。 訂票時,選的是最后一排。進了場,一級一級臺階地上去,放好準...
    黃向軍哲學聊齋閱讀 976評論 0 51
  • 一 我是突然想到這件事情的,盡管已經二十來歲,自認為經歷了不少風風雨雨坎坎坷坷。但一直都沒有思考過人生。 我想人生...
    夜半獨上高樓閱讀 283評論 1 1
  • 1、聽書讓我靜下心來與靈魂里的自己對話。認真聽書做筆記,讓我心不再那么浮躁。 開始探尋內在的自己,這是最近聽書的收...
    堅持行動家安小小閱讀 489評論 0 0