From 0df3603ef2ab3b35cd64aef9531095645b4cee20 Mon Sep 17 00:00:00 2001 From: jager Date: Mon, 20 Dec 2021 19:17:24 +0800 Subject: [PATCH] wxgzh --- Makefile | 7 ++- cmd/ss/main.go | 84 ++++++++++++++++++++++++++++++++++ cmd/stock/main.go | 37 +++++++++++++-- go.mod | 18 +++++++- go.sum | 39 ++++++++++++++++ msg/msg.go | 3 ++ msg/msg_test.go | 24 +++++----- stock/stock.go | 16 +++---- user/cache.go | 45 ++++++++++++++++++ user/user.go | 114 ++++++++++++++++++++++++++++++++++++++++++++++ wxgzh/wxgzh.go | 110 ++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 470 insertions(+), 27 deletions(-) create mode 100644 cmd/ss/main.go create mode 100644 user/cache.go create mode 100644 user/user.go create mode 100644 wxgzh/wxgzh.go diff --git a/Makefile b/Makefile index cb655cf..a20eefa 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ plats = linux darwin arch ?= amd64 archs = amd64 arm arm64 -all: stock +all: stock ss define build_app @echo 'building $(1) ...' @@ -17,6 +17,9 @@ stock: $(call build_app,stock,$(plat),$(arch)) .PHONY: stock +ss: + $(call build_app,ss,$(plat),$(arch)) +.PHONY: ss clean: -@rm -f builder/* @@ -35,4 +38,4 @@ ps: -@ps -ef | grep ./builder/stock | grep -v grep push: - -@scp builder/stock root@119.29.105.154:/root/stock/builder/ \ No newline at end of file + -@scp builder/* root@119.29.105.154:/root/stock/builder/ \ No newline at end of file diff --git a/cmd/ss/main.go b/cmd/ss/main.go new file mode 100644 index 0000000..e131668 --- /dev/null +++ b/cmd/ss/main.go @@ -0,0 +1,84 @@ +/** + * @Author: jager + * @Email: lhj168os@gmail.com + * @File: main + * @Date: 2021/12/20 2:24 下午 + * @package: ss + * @Version: v1.0.0 + * + * @Description: + * + */ + +package main + +import ( + "github.com/gin-gonic/gin" + "github.com/jageros/hawox/contextx" + "github.com/jageros/hawox/httpx" + "github.com/jageros/hawox/logx" + "net/http" + "stock/msg" + "time" +) + +func main() { + ctx, cancel := contextx.Default() + defer cancel() + + logx.Init(logx.DebugLevel, logx.SetCaller(), logx.SetRequest()) + defer logx.Sync() + + httpx.InitializeHttpServer(ctx, func(engine *gin.Engine) { + r := engine.Group("/api") + r.GET("/sayhello", func(c *gin.Context) { + httpx.PkgMsgWrite(c, map[string]interface{}{"say": "hello world!"}) + }) + r.POST("/receive", func(c *gin.Context) { + rMsg := &msg.RData{} + err := c.BindXML(rMsg) + if err != nil { + logx.Error(err) + } else { + logx.Info(rMsg) + } + + wMsg := &xml{ + ToUserName: rMsg.FromUserName, + FromUserName: rMsg.ToUserName, + CreateTime: int(time.Now().Unix()), + MsgType: "text", + Content: "收到,谢谢!", + } + c.XML(http.StatusOK, wMsg) + + //c.XML(http.StatusOK, wMsg) + + //err = msg.Rcv(rMsg.FromUserName) + //if err != nil { + // logx.Error(err) + //} + + //c.String(http.StatusOK, "success") + }) + + r.GET("/receive", func(c *gin.Context) { + echostr := c.Query("echostr") + logx.Infof("=== %s ===", echostr) + c.String(http.StatusOK, echostr) + }) + }, func(s *httpx.Server) { + s.Mode = "debug" + s.Port = 8567 + }) + err := ctx.Wait() + logx.Infof("Stop With: %v", err) +} + +type xml struct { + ToUserName string `xml:"ToUserName"` + FromUserName string `xml:"FromUserName"` + CreateTime int `xml:"CreateTime"` + MsgType string `xml:"MsgType"` + Content string `xml:"Content"` +} diff --git a/cmd/stock/main.go b/cmd/stock/main.go index a473aed..aaf08e6 100644 --- a/cmd/stock/main.go +++ b/cmd/stock/main.go @@ -1,10 +1,13 @@ package main import ( + "github.com/gin-gonic/gin" "github.com/jageros/hawox/contextx" + "github.com/jageros/hawox/httpx" "github.com/jageros/hawox/logx" "github.com/jageros/hawox/sdk/tianapi" "github.com/jageros/hawox/timer" + "net/http" "stock/cfg" "stock/fund" "stock/msg" @@ -19,9 +22,10 @@ func main() { panic(err) } - logx.Init(logx.InfoLevel, logx.SetCaller()) //日志初始化 - msg.Init() // 企业微信或者钉钉群通知初始化,即根据配置文件中的配置设置钉钉机器人的密钥,URL和企业微信的URL - tianapi.SetKey(cfg.TianApiKey) // 天行数据API初始化 + logx.Init(logx.InfoLevel, logx.SetCaller(), logx.SetRequest()) //日志初始化 + defer logx.Sync() + msg.Init() // 企业微信或者钉钉群通知初始化,即根据配置文件中的配置设置钉钉机器人的密钥,URL和企业微信的URL + tianapi.SetKey(cfg.TianApiKey) // 天行数据API初始化 ctx, cancel := contextx.Default() defer cancel() @@ -134,6 +138,33 @@ func main() { } }) + httpx.InitializeHttpServer(ctx, func(engine *gin.Engine) { + r := engine.Group("/api") + r.GET("/sayhello", func(c *gin.Context) { + httpx.PkgMsgWrite(c, map[string]interface{}{"say": "hello world!"}) + }) + r.POST("/receive", func(c *gin.Context) { + msgs := &msg.RData{} + err := c.BindXML(msgs) + if err != nil { + logx.Error(err) + } else { + logx.Info(msgs) + } + + c.String(http.StatusOK, "success") + }) + + r.GET("/receive", func(c *gin.Context) { + echostr := c.Query("echostr") + logx.Infof("=== %s ===", echostr) + c.String(http.StatusOK, echostr) + }) + }, func(s *httpx.Server) { + s.Mode = "debug" + s.Port = 8567 + }) + err = ctx.Wait() // 等待停止信号 logx.Infof("Application stop with: %v", err) } diff --git a/go.mod b/go.mod index fc480bb..ff8f419 100644 --- a/go.mod +++ b/go.mod @@ -3,19 +3,30 @@ module stock go 1.17 require ( + github.com/gin-gonic/gin v1.7.4 github.com/jageros/hawox v0.1.4 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.8.1 - golang.org/x/text v0.3.6 ) require ( github.com/eapache/queue v1.1.0 // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/gin-contrib/cors v1.3.1 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.13.0 // indirect + github.com/go-playground/universal-translator v0.17.0 // indirect + github.com/go-playground/validator/v10 v10.4.1 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/json-iterator/go v1.1.11 // indirect github.com/kr/text v0.2.0 // indirect + github.com/leodido/go-urn v1.2.0 // indirect github.com/magiconair/properties v1.8.5 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect github.com/pelletier/go-toml v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.6.0 // indirect @@ -23,13 +34,18 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/tal-tech/go-zero v1.2.1 // indirect + github.com/ugorji/go/codec v1.1.7 // indirect go.opentelemetry.io/otel v1.0.0-RC2 // indirect go.opentelemetry.io/otel/trace v1.0.0-RC2 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/automaxprocs v1.3.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.19.0 // indirect + golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect + golang.org/x/text v0.3.6 // indirect + golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect + google.golang.org/protobuf v1.27.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index 0b67ffb..8f225c4 100644 --- a/go.sum +++ b/go.sum @@ -122,6 +122,13 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/cors v1.3.1 h1:doAsuITavI4IOcd0Y19U4B+O0dNWihRyX//nn4sEmgA= +github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzFA61xsmDk= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gin-gonic/gin v1.7.4 h1:QmUZXrvJ9qZ3GfWvQ+2wnW/1ePrTEJqPKMYEU3lD/DM= +github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -141,6 +148,16 @@ github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL9 github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -178,6 +195,7 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -253,7 +271,10 @@ github.com/jageros/hawox v0.1.4/go.mod h1:HUCwWfPlVFx6BpWHEZ7LG4KwTp/T2exNI2/kDN github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -277,6 +298,9 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= @@ -289,7 +313,9 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -305,8 +331,10 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -390,6 +418,9 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tal-tech/go-zero v1.2.1 h1:WH507LpqtdSniIIekwcIogQvyMDDY/F8EwWyAhZz3pE= github.com/tal-tech/go-zero v1.2.1/go.mod h1:j62w0m/h/HGZEb42ims1m+4jVZc7610QR7eZDVyCuXY= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -438,6 +469,8 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -556,6 +589,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -612,6 +646,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -671,6 +706,7 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -776,6 +812,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -786,6 +823,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= diff --git a/msg/msg.go b/msg/msg.go index 8759e89..0d7547a 100644 --- a/msg/msg.go +++ b/msg/msg.go @@ -60,3 +60,6 @@ func Send(text string) error { + + + diff --git a/msg/msg_test.go b/msg/msg_test.go index 7a48fee..a02d618 100644 --- a/msg/msg_test.go +++ b/msg/msg_test.go @@ -13,21 +13,21 @@ package msg import ( - "github.com/jageros/hawox/httpc" - "stock/stock" + xml2 "encoding/xml" + "fmt" "testing" + "time" ) func Test_Post(t *testing.T) { - url := "" - stk, err := stock.NewStocks(600905) - if err != nil { - t.Error(err) - return - } - stk.ForEachStock(func(stk stock.IArg) { - arg := stk.Arg("o-KDV6NbRaanYz55fJuSgyR0qxxU") - httpc.RequestWithInterface(httpc.POST, url, httpc.JSON, arg, nil) - }) + wMsg := &xml{ + ToUserName: "rMsg.FromUserName", + FromUserName: "rMsg.ToUserName", + CreateTime: int(time.Now().Unix()), + MsgType: "text", + Content: "收到,谢谢!", + } + bty, _ := xml2.Marshal(wMsg) + fmt.Println(string(bty)) } diff --git a/stock/stock.go b/stock/stock.go index b7a5df6..40e7939 100644 --- a/stock/stock.go +++ b/stock/stock.go @@ -187,10 +187,14 @@ type IArg interface { Arg(openId string) map[string]interface{} } -func (sk *stocks) ForEachStock(f func(stk IArg)) { +func (sk *stocks) ForEachStock(f func(stk IArg) error) error { for _, k := range sk.ss { - f(k) + err := f(k) + if err != nil { + return err + } } + return nil } func NewStocks(codes ...string) (*stocks, error) { @@ -251,13 +255,7 @@ func (s *stock) Arg(openId string) map[string]interface{} { arg := map[string]interface{}{ "touser": openId, - "template_id": "1EaaO8jlUJBrj5y7Iz5_lJVXoQq2ivTxH8JnAM_vqGU", - "url": "", - - "miniprogram": map[string]interface{}{ - "appid": "wxba88e64e7342b027", - "pagepath": "ab8130a7bf55b78992e3d17f59909e0a", - }, + "template_id": "L7fOGJURj-1HF4cIpFizCOOiAMqER3PG-pfgn37Dalw", "data": map[string]interface{}{ "first": map[string]interface{}{ diff --git a/user/cache.go b/user/cache.go new file mode 100644 index 0000000..9cb8508 --- /dev/null +++ b/user/cache.go @@ -0,0 +1,45 @@ +/** + * @Author: jager + * @Email: lhj168os@gmail.com + * @File: cache + * @Date: 2021/12/20 6:39 下午 + * @package: user + * @Version: v1.0.0 + * + * @Description: + * + */ + +package user + +import ( + "github.com/jageros/hawox/attribute" + "sync" +) + +var users sync.Map + +func LoadAllUserIntoCache() error { + attrs, err := attribute.LoadAll("user") + if err != nil { + return err + } + for _, attr := range attrs { + u := &User{attr: attr} + users.Store(attr.GetAttrID(), u) + } + return nil +} + +func GetUser(openId string) (*User, error) { + u, ok := users.Load(openId) + if ok { + return u.(*User), nil + } + us, err := newUser(openId) + if err != nil { + return nil, err + } + users.Store(openId, us) + return us, nil +} diff --git a/user/user.go b/user/user.go new file mode 100644 index 0000000..d69f238 --- /dev/null +++ b/user/user.go @@ -0,0 +1,114 @@ +/** + * @Author: jager + * @Email: lhj168os@gmail.com + * @File: user + * @Date: 2021/12/20 4:54 下午 + * @package: user + * @Version: v1.0.0 + * + * @Description: + * + */ + +package user + +import ( + "github.com/jageros/hawox/attribute" + "time" +) + +type User struct { + attr *attribute.AttrMgr +} + +func newUser(openId string) (*User, error) { + u := &User{ + attr: attribute.NewAttrMgr("user", openId), + } + err := u.attr.Load(true) + if err == attribute.NotExistsErr { + u.attr.SetInt64("create_time", time.Now().Unix()) + err = u.attr.Save(false) + } + return u, err +} + +func (u *User) OpenID() string { + return u.attr.GetAttrID().(string) +} + +func (u *User) Codes(isFund bool) []string { + key := "stock" + if isFund { + key = "fund" + } + attr := u.attr.GetMapAttr(key) + if attr == nil { + return nil + } + var codes []string + attr.ForEachKey(func(key string) bool { + codes = append(codes, key) + return true + }) + return codes +} + +// HasSubscribed 查询用户是否订阅此票 +func (u *User) HasSubscribed(isFund bool, code string) bool { + key := "stock" + if isFund { + key = "fund" + } + attr := u.attr.GetMapAttr(key) + if attr == nil { + return false + } + sAttr := attr.GetMapAttr(code) + if sAttr == nil { + return false + } + return sAttr.GetBool("notify") +} + +// Subscribe 订阅股票或基金 +func (u *User) Subscribe(isFund bool, codes ...string) { + key := "stock" + if isFund { + key = "fund" + } + attr := u.attr.GetMapAttr(key) + if attr == nil { + attr = attribute.NewMapAttr() + u.attr.SetMapAttr(key, attr) + } + + for _, code := range codes { + sAttr := attr.GetMapAttr(code) + if sAttr == nil { + sAttr = attribute.NewMapAttr() + attr.SetMapAttr(code, sAttr) + } + sAttr.SetBool("notify", true) + } +} + +// UnSubscribe 取消订阅股票或基金 +func (u *User) UnSubscribe(isFund bool, codes ...string) { + key := "stock" + if isFund { + key = "fund" + } + attr := u.attr.GetMapAttr(key) + if attr == nil { + return + } + + for _, code := range codes { + sAttr := attr.GetMapAttr(code) + if sAttr == nil { + return + } + sAttr.SetBool("notify", false) + } +} diff --git a/wxgzh/wxgzh.go b/wxgzh/wxgzh.go new file mode 100644 index 0000000..f1ff15c --- /dev/null +++ b/wxgzh/wxgzh.go @@ -0,0 +1,110 @@ +/** + * @Author: jager + * @Email: lhj168os@gmail.com + * @File: wxgzh + * @Date: 2021/12/20 6:53 下午 + * @package: wxgzh + * @Version: v1.0.0 + * + * @Description: + * + */ + +package wxgzh + +import ( + "fmt" + "github.com/jageros/hawox/errcode" + "github.com/jageros/hawox/httpc" + "stock/stock" + "time" +) + +var ( + appid = "wxba88e64e7342b027" + secret = "ab8130a7bf55b78992e3d17f59909e0a" + accessTokenUrl = fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appid, secret) + sendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s" + + accessToken = "" + expiresIn int64 +) + +type Resp struct { + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` + Msgid int `json:"msgid"` +} + +type AccessToken struct { + AccessToken string `json:"access_token"` + ExpiresIn int64 `json:"expires_in"` + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` +} + +type RData struct { + ToUserName string `xml:"ToUserName"` + FromUserName string `xml:"FromUserName"` + CreateTime int `xml:"CreateTime"` + MsgType string `xml:"MsgType"` + Content string `xml:"Content"` + MsgID int64 `xml:"MsgId"` +} + +type xml struct { + ToUserName string `xml:"ToUserName"` + FromUserName string `xml:"FromUserName"` + CreateTime int `xml:"CreateTime"` + MsgType string `xml:"MsgType"` + Content string `xml:"Content"` +} + +func getAccessToken(update bool) (string, error) { + if !update && time.Now().Unix() < expiresIn { + return accessToken, nil + } + resp := &AccessToken{} + err := httpc.RequestWithInterface(httpc.GET, accessTokenUrl, httpc.FORM, nil, nil, resp) + if err != nil { + return "", err + } + if resp.Errcode != 0 { + return "", errcode.New(int32(resp.Errcode), resp.Errmsg) + } + accessToken = resp.AccessToken + expiresIn = time.Now().Unix() + resp.ExpiresIn + return resp.AccessToken, nil +} + +func send(openID string, stk stock.IArg, recall bool) error { + token, err := getAccessToken(false) + if err != nil { + return err + } + url := fmt.Sprintf(sendUrl, token) + + arg := stk.Arg(openID) + resp := &Resp{} + err = httpc.RequestWithInterface(httpc.POST, url, httpc.JSON, arg, nil, resp) + if err != nil { + return err + } + if resp.Errcode != 0 { + if resp.Errcode == 40014 { + _, err = getAccessToken(true) + if err != nil { + return err + } + if recall { + return send(openID, stk, false) + } + } + return errcode.New(int32(resp.Errcode), resp.Errmsg) + } + return nil +} + +func Send(openId string, stk stock.IArg) error { + return send(openId, stk, true) +}