From 6483243d2a13fb5cf3cf20370551dedc14fa7bcd Mon Sep 17 00:00:00 2001 From: spark Date: Tue, 14 Jan 2025 13:13:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(stock):=20=E6=B7=BB=E5=8A=A0=E7=94=B5?= =?UTF-8?q?=E6=8A=A5=E8=B5=84=E8=AE=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在后端增加电报资讯抓取功能,定时刷新并发送到前端 - 在前端添加电报资讯显示组件,滚动显示最新资讯 - 更新 go.mod 和 go.sum 文件,添加相关依赖 --- app.go | 38 ++++++++++++++++++++++ backend/data/dingding_api_test.go | 3 +- backend/data/stock_data_api_test.go | 21 ++++++++++++ frontend/src/App.vue | 21 +++++++++--- go.mod | 12 ++++--- go.sum | 50 ++++++++++++++++++++++++----- 6 files changed, 126 insertions(+), 19 deletions(-) diff --git a/app.go b/app.go index a0d7426..6ef6cd6 100644 --- a/app.go +++ b/app.go @@ -5,15 +5,18 @@ package main import ( "context" "fmt" + "github.com/PuerkitoBio/goquery" "github.com/coocood/freecache" "github.com/duke-git/lancet/v2/convertor" "github.com/duke-git/lancet/v2/mathutil" "github.com/duke-git/lancet/v2/slice" "github.com/getlantern/systray" + "github.com/go-resty/resty/v2" "github.com/wailsapp/wails/v2/pkg/runtime" "go-stock/backend/data" "go-stock/backend/db" "go-stock/backend/logger" + "strings" "time" ) @@ -56,6 +59,41 @@ func (a *App) domReady(ctx context.Context) { } } }() + + go func() { + ticker := time.NewTicker(time.Second * time.Duration(60)) + defer ticker.Stop() + for range ticker.C { + telegraph := refreshTelegraphList() + if telegraph != nil { + go runtime.EventsEmit(a.ctx, "telegraph", telegraph) + } + } + + }() + go runtime.EventsEmit(a.ctx, "telegraph", refreshTelegraphList()) +} + +func refreshTelegraphList() *[]string { + url := "https://www.cls.cn/telegraph" + response, err := resty.New().R(). + SetHeader("Referer", "https://www.cls.cn/"). + SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.60"). + Get(fmt.Sprintf(url)) + if err != nil { + return &[]string{} + } + //logger.SugaredLogger.Info(string(response.Body())) + document, err := goquery.NewDocumentFromReader(strings.NewReader(string(response.Body()))) + if err != nil { + return &[]string{} + } + var telegraph []string + document.Find("div.telegraph-content-box").Each(func(i int, selection *goquery.Selection) { + //logger.SugaredLogger.Info(selection.Text()) + telegraph = append(telegraph, selection.Text()) + }) + return &telegraph } // isTradingDay 判断是否是交易日 diff --git a/backend/data/dingding_api_test.go b/backend/data/dingding_api_test.go index 72a0e4f..f3ceec8 100644 --- a/backend/data/dingding_api_test.go +++ b/backend/data/dingding_api_test.go @@ -11,6 +11,7 @@ import ( //----------------------------------------------------------------------------------- func TestRobot(t *testing.T) { + dingdingRobotUrl := "XXX" resp, err := resty.New().R(). SetHeader("Content-Type", "application/json"). SetBody(`{ @@ -23,7 +24,7 @@ func TestRobot(t *testing.T) { "isAtAll": true } }`). - Post(dingding_robot_url) + Post(dingdingRobotUrl) if err != nil { t.Error(err) } diff --git a/backend/data/stock_data_api_test.go b/backend/data/stock_data_api_test.go index eab9b90..46bf564 100644 --- a/backend/data/stock_data_api_test.go +++ b/backend/data/stock_data_api_test.go @@ -3,6 +3,7 @@ package data import ( "encoding/json" "fmt" + "github.com/PuerkitoBio/goquery" "github.com/duke-git/lancet/v2/convertor" "github.com/duke-git/lancet/v2/strutil" "github.com/go-resty/resty/v2" @@ -19,6 +20,26 @@ import ( // @Desc //----------------------------------------------------------------------------------- +func TestGetTelegraph(t *testing.T) { + url := "https://www.cls.cn/telegraph" + response, err := resty.New().R(). + SetHeader("Referer", "https://www.cls.cn/"). + SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.60"). + Get(fmt.Sprintf(url)) + if err != nil { + return + } + logger.SugaredLogger.Info(string(response.Body())) + document, err := goquery.NewDocumentFromReader(strings.NewReader(string(response.Body()))) + if err != nil { + return + } + document.Find("div.telegraph-content-box").Each(func(i int, selection *goquery.Selection) { + logger.SugaredLogger.Info(selection.Text()) + }) + +} + func TestParseFullSingleStockData(t *testing.T) { resp, err := resty.New().R(). SetHeader("Host", "hq.sinajs.cn"). diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 35ec0bf..74cf760 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -15,14 +15,15 @@ import { SettingsOutline, ReorderTwoOutline, ExpandOutline, - RefreshOutline, PowerOutline, BarChartOutline, MoveOutline, WalletOutline, + RefreshOutline, PowerOutline, BarChartOutline, MoveOutline, WalletOutline, StarOutline, } from '@vicons/ionicons5' const content = ref('数据来源于网络,仅供参考\n投资有风险,入市需谨慎') const isFullscreen = ref(false) const activeKey = ref('stock') const containerRef= ref({}) -const realtimeProfit= ref("") +const realtimeProfit= ref(0) +const telegraph= ref([]) const menuOptions = ref([ { label: () => @@ -39,7 +40,7 @@ const menuOptions = ref([ { default: () => '我的自选',} ), key: 'stock', - icon: renderIcon(BarChartOutline), + icon: renderIcon(StarOutline), children:[ { label: ()=> h(NText, {type:realtimeProfit.value>0?'error':'success'},{ default: () => '当日盈亏 '+realtimeProfit.value+"¥"}), @@ -136,6 +137,9 @@ window.addEventListener('mousemove', dragstart) EventsOn("realtime_profit",(data)=>{ realtimeProfit.value=data }) +EventsOn("telegraph",(data)=>{ + telegraph.value=data +})