需求
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月凈利潤斷層實戰小結-真香~