From 283c975d10988f6aa534eb7fa5ded8a2a5c61d0b Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 2 Apr 2025 10:26:57 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A3=9E=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feishu/.vscode/launch.json | 15 ++++ feishu/Handler/P2BotMenuV6.go | 31 +++++++ feishu/client/c.go | 61 ++++++++++++++ feishu/client/h.go | 81 ++++++++++++++++++ feishu/data/operation.go | 47 +++++++++++ feishu/go.mod | 16 ++++ feishu/go.sum | 47 +++++++++++ feishu/main.go | 154 ++++++++++++++++++++++++++++++++++ feishu/unit_test.go | 91 ++++++++++++++++++++ feishu/util/msyql.go | 34 ++++++++ feishu/util/util.go | 10 +++ 11 files changed, 587 insertions(+) create mode 100644 feishu/.vscode/launch.json create mode 100644 feishu/Handler/P2BotMenuV6.go create mode 100644 feishu/client/c.go create mode 100644 feishu/client/h.go create mode 100644 feishu/data/operation.go create mode 100644 feishu/go.mod create mode 100644 feishu/go.sum create mode 100644 feishu/main.go create mode 100644 feishu/unit_test.go create mode 100644 feishu/util/msyql.go create mode 100644 feishu/util/util.go diff --git a/feishu/.vscode/launch.json b/feishu/.vscode/launch.json new file mode 100644 index 0000000..e7b4e98 --- /dev/null +++ b/feishu/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch file", + "type": "go", + "request": "launch", + "mode": "debug", + "program": "${file}" + } + ] +} \ No newline at end of file diff --git a/feishu/Handler/P2BotMenuV6.go b/feishu/Handler/P2BotMenuV6.go new file mode 100644 index 0000000..d844b7d --- /dev/null +++ b/feishu/Handler/P2BotMenuV6.go @@ -0,0 +1,31 @@ +package handler + +import ( + "context" + "feishu/client" + "log" + + larkapplication "github.com/larksuite/oapi-sdk-go/v3/service/application/v6" +) + +var funcMap map[string]func(ctx context.Context, event *larkapplication.P2BotMenuV6) error + +func P2Handle(ctx context.Context, event *larkapplication.P2BotMenuV6) error { + if f, ok := funcMap[*event.Event.EventKey]; ok { + f(ctx, event) + return nil + } + log.Printf("no handler for event: %s", *event.Event.EventKey) + return nil +} + +func init() { + funcMap = make(map[string]func(ctx context.Context, event *larkapplication.P2BotMenuV6) error) + funcMap["operation"] = operation +} + +func operation(ctx context.Context, event *larkapplication.P2BotMenuV6) error { + openId := *event.Event.Operator.OperatorId.OpenId + client.C.SendMsg(openId, "operation") + return nil +} diff --git a/feishu/client/c.go b/feishu/client/c.go new file mode 100644 index 0000000..3627dce --- /dev/null +++ b/feishu/client/c.go @@ -0,0 +1,61 @@ +package client + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/google/uuid" + lark "github.com/larksuite/oapi-sdk-go/v3" + larkcore "github.com/larksuite/oapi-sdk-go/v3/core" + larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1" +) + +type client struct { + *lark.Client +} + +var C *client + +const ( + AppId = "cli_a726aa9056f1d00b" + AppSecret = "KWteGycoqAYdcqbTeCcUNbteVmpcTOCU" +) + +func init() { + C = &client{lark.NewClient(AppId, AppSecret)} +} + +func GetClient() *client { + return C +} + +func (c *client) SendMsg(open_id, content string) error { + // 创建 Client + b, _ := json.Marshal(map[string]string{"text": content}) + uuidVal := uuid.New().String() + req := larkim.NewCreateMessageReqBuilder(). + ReceiveIdType(`open_id`). + Body(larkim.NewCreateMessageReqBodyBuilder(). + ReceiveId(open_id). + MsgType(`text`). + Content(string(b)). + Uuid(uuidVal). + Build()). + Build() + + // 发起请求 + resp, err := c.Im.V1.Message.Create(context.Background(), req) + + // 处理错误 + if err != nil { + fmt.Println(err) + return err + } + // 服务端错误处理 + if !resp.Success() { + fmt.Printf("logId: %s, error response: \n%s", resp.RequestId(), larkcore.Prettify(resp.CodeError)) + return fmt.Errorf("logId: %s, error response: \n%s", resp.RequestId(), larkcore.Prettify(resp.CodeError)) + } + return nil +} diff --git a/feishu/client/h.go b/feishu/client/h.go new file mode 100644 index 0000000..c0fee74 --- /dev/null +++ b/feishu/client/h.go @@ -0,0 +1,81 @@ +package client + +import ( + "bytes" + "encoding/json" + "feishu/data" + "fmt" + "net/http" + "time" +) + +func SendMsg(data []*data.Operation) error { + retainStr := "" + for _, v := range data { + retainStr += fmt.Sprintf("| %s | %d | %d | %.2f | %.2f%% | %.2f%% | %d | %d |\n", v.Date.Format("2006-01-02"), v.Register, v.Login, v.Recharge, float64(v.SecondRemain)/float64(v.Recharge), float64(v.ThirdRemain)/float64(v.Recharge), v.SeventhRemain, v.ThirtiethRemain) + } + str := fmt.Sprintf(` +# 日期 %s 😁 +----------------------------- +## 昨日数据 + +- 注册:%d +- 充值:%.2f +- 登录:%d +---------------------- + +## 留存数据 + +| Date | Reg | Login | Pay | Retain2 | Retain3 | Retain7 | Retain30 | +| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +%s + +## 玩家数据 + +| Uid | Level | Exp | Diamond | Star | Energy | +| -------- | -------- | -------- | -------- | -------- | -------- | +| 1 | 2 | 3 | 4 | 5 | 6 | +| 1 | 2 | 3 | 4 | 5 | 6 | + `, time.Now().In(time.UTC).Format("2006-01-02"), data[0].Register, data[0].Recharge, data[0].Login, retainStr) + // 创建请求体 + payload := map[string]interface{}{ + "msg_type": "interactive", + "card": map[string]interface{}{ + "type": "template", + "data": map[string]interface{}{ + "template_id": "AAqBcfmUwQya1", + "template_version_name": "1.0.1", + "template_variable": map[string]interface{}{ + "msg": str, + "appName": "merge_pet_london", + }, + }, + }, + } + payloadBytes, err := json.Marshal(payload) + if err != nil { + return err + } + + // 创建HTTP请求 + req, err := http.NewRequest("POST", "https://open.feishu.cn/open-apis/bot/v2/hook/64bad1f3-3a41-4dca-9037-399067ffb252", bytes.NewBuffer(payloadBytes)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + // 发送请求 + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + // 检查响应状态码 + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode) + } + + return nil +} diff --git a/feishu/data/operation.go b/feishu/data/operation.go new file mode 100644 index 0000000..8f6b42b --- /dev/null +++ b/feishu/data/operation.go @@ -0,0 +1,47 @@ +package data + +import ( + "feishu/util" + "log" + "time" +) + +type Operation struct { + Date time.Time `db:"Date"` + Register int `db:"Register"` + SecondRemain int `db:"SecondRemain"` + ThirdRemain int `db:"ThirdRemain"` + SeventhRemain int `db:"SeventhRemain"` + ThirtiethRemain int `db:"ThirtiethRemain"` + Recharge float64 `db:"Recharge"` + Login int `db:"Login"` +} + +type User struct { + Uid int `db:"Uid"` + Level int `db:"Level"` + Exp int `db:"Exp"` + Diamond int `db:"Diamond"` + Star int `db:"Star"` + Energy int `db:"Energy"` +} + +func GetOperation() ([]*Operation, error) { + Db, err := util.MySQL() + if err != nil { + log.Printf("GetOperation MySQL error: %v", err) + return nil, err + } + defer Db.Close() + Result := []*Operation{} + ZeroTimestamp := util.ZeroTimestampByTz("Europe/London") - 86400 + ZeroTime := time.Unix(ZeroTimestamp, 0).In(time.UTC) + StartDate := ZeroTime.AddDate(0, 0, -7).Format("2006-01-02") + EndDate := ZeroTime.Format("2006-01-02") + err = Db.Select(&Result, "SELECT `Date`, `Register`, `SecondRemain`, `ThirdRemain`, `SeventhRemain`, `ThirtiethRemain`, `Recharge`, `Login` FROM remain where `Date` >= ? and `Date` <= ? order by `Date` desc", StartDate, EndDate) + if err != nil { + log.Printf("GetOperation Select error: %v", err) + return nil, err + } + return Result, nil +} diff --git a/feishu/go.mod b/feishu/go.mod new file mode 100644 index 0000000..d6e3343 --- /dev/null +++ b/feishu/go.mod @@ -0,0 +1,16 @@ +module feishu + +go 1.23.1 + +require ( + github.com/go-sql-driver/mysql v1.8.1 + github.com/google/uuid v1.6.0 + github.com/jmoiron/sqlx v1.4.0 + github.com/larksuite/oapi-sdk-go/v3 v3.4.9 +) + +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/gorilla/websocket v1.5.0 // indirect +) diff --git a/feishu/go.sum b/feishu/go.sum new file mode 100644 index 0000000..39db3e4 --- /dev/null +++ b/feishu/go.sum @@ -0,0 +1,47 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/larksuite/oapi-sdk-go/v3 v3.4.9 h1:ZzsPtdF2tsLbocQdKLNFwFCzWfwmKtD4kbyx7to++M0= +github.com/larksuite/oapi-sdk-go/v3 v3.4.9/go.mod h1:ZEplY+kwuIrj/nqw5uSCINNATcH3KdxSN7y+UxYY5fI= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +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/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/feishu/main.go b/feishu/main.go new file mode 100644 index 0000000..ad2e911 --- /dev/null +++ b/feishu/main.go @@ -0,0 +1,154 @@ +package main + +import ( + "bufio" + "context" + "encoding/json" + handler "feishu/Handler" + "feishu/client" + "fmt" + "io" + "log" + "net/http" + "regexp" + "strings" + + "github.com/google/uuid" + larkcore "github.com/larksuite/oapi-sdk-go/v3/core" + "github.com/larksuite/oapi-sdk-go/v3/event/dispatcher" + larkapplication "github.com/larksuite/oapi-sdk-go/v3/service/application/v6" + larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1" + larkws "github.com/larksuite/oapi-sdk-go/v3/ws" +) + +func main() { + // 注册事件回调,OnP2MessageReceiveV1 为接收消息 v2.0;OnCustomizedEvent 内的 message 为接收消息 v1.0。 + eventHandler := dispatcher.NewEventDispatcher("", ""). + OnP2MessageReceiveV1(func(ctx context.Context, event *larkim.P2MessageReceiveV1) error { + // fmt.Printf("[ OnP2MessageReceiveV1 access ], data: %s\n", larkcore.Prettify(event)) + Content := *event.Event.Message.Content + OpenId := *event.Event.Sender.SenderId.OpenId + r := map[string]string{} + if Content != "" { + json.Unmarshal([]byte(Content), &r) + go SendMsg(OpenId, r["text"]) + } + return nil + }). + OnP2BotMenuV6(func(ctx context.Context, event *larkapplication.P2BotMenuV6) error { + return handler.P2Handle(ctx, event) + }) + + // 创建Client + cli := larkws.NewClient(client.AppId, client.AppSecret, + larkws.WithEventHandler(eventHandler), + larkws.WithLogLevel(larkcore.LogLevelDebug), + ) + // 启动客户端 + err := cli.Start(context.Background()) + if err != nil { + panic(err) + } +} + +func SendMsg(open_id, content string) { + // 创建 Client + + uuidVal := uuid.New().String() + Answer := AI(content) + b, _ := json.Marshal(map[string]string{"text": Answer}) + // 创建请求对象 + req := larkim.NewCreateMessageReqBuilder(). + ReceiveIdType(`open_id`). + Body(larkim.NewCreateMessageReqBodyBuilder(). + ReceiveId(open_id). + MsgType(`text`). + Content(string(b)). + Uuid(uuidVal). + Build()). + Build() + + // 发起请求 + resp, err := client.C.Im.V1.Message.Create(context.Background(), req) + + // 处理错误 + if err != nil { + fmt.Println(err) + return + } + + // 服务端错误处理 + if !resp.Success() { + fmt.Printf("logId: %s, error response: \n%s", resp.RequestId(), larkcore.Prettify(resp.CodeError)) + return + } +} + +type AiMessage struct { + Event string `json:"event"` + Conversation_id string `json:"conversation_id"` + Message_id string `json:"message_id"` + Create_at int `json:"create_at"` + Task_id string `json:"task_id"` + Id string `json:"id"` + Answer string `json:"answer"` +} + +func AI(message string) string { + //escapedMessage := strings.ReplaceAll(message, `"`, `\"`) + body := `{ + "inputs": {}, + "query": "` + message + `", + "response_mode": "streaming", + "conversation_id": "", + "user": "abc-123", + "files": [] + }` + + req, err := http.NewRequest("POST", "http://8.155.13.51/v1/chat-messages", strings.NewReader(body)) + if err != nil { + log.Fatalf("创建请求失败: %v", err) + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "Bearer app-14eZWBFFIyUSZi7OYrnOGhSR") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + // handle error + } + defer resp.Body.Close() + + reader := bufio.NewReader(resp.Body) + var str string + for { + var message AiMessage + line, readErr := reader.ReadString('\n') + if readErr != nil { + if readErr == io.EOF { + break + } + log.Fatalf("读取响应时出错: %v", readErr) + } + newLine := strings.TrimPrefix(line, "data:") + + // 解析 JSON 数据 + if err := json.Unmarshal([]byte(newLine), &message); err != nil { + continue + } + if message.Event == "message" { + str += message.Answer + } + // 处理数据 + + //fmt.Print("收到数据: ", line) + } + + r := regexp.MustCompile(`[\s\S]*?<\/think>`) + str = r.ReplaceAllString(str, "") + str = strings.TrimLeft(str, "\n") + if str == "" { + str = "我不知道你在说什么" + } + return str +} diff --git a/feishu/unit_test.go b/feishu/unit_test.go new file mode 100644 index 0000000..f5e4d82 --- /dev/null +++ b/feishu/unit_test.go @@ -0,0 +1,91 @@ +package main + +import ( + "bufio" + "encoding/json" + "feishu/client" + "feishu/data" + "fmt" + "io" + "net/http" + "regexp" + "strings" + "testing" +) + +type message struct { + Event string `json:"event"` + Conversation_id string `json:"conversation_id"` + Message_id string `json:"message_id"` + Create_at int `json:"create_at"` + Task_id string `json:"task_id"` + Id string `json:"id"` + Answer string `json:"answer"` +} + +func TestCard(t *testing.T) { + data, err := data.GetOperation() + if err != nil { + t.Fatalf("GetOperation error: %v", err) + } + err = client.SendMsg(data) + if err != nil { + t.Fatalf("SendMsg error: %v", err) + } +} + +// ...existing code... +func TestHTTPPost(t *testing.T) { + body := `{ + "inputs": {}, + "query": "游戏订单提交失败", + "response_mode": "streaming", + "conversation_id": "", + "user": "abc-123", + "files": [] +}` + + req, err := http.NewRequest("POST", "http://8.155.13.51/v1/chat-messages", strings.NewReader(body)) + if err != nil { + t.Fatalf("创建请求失败: %v", err) + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "Bearer app-14eZWBFFIyUSZi7OYrnOGhSR") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + // handle error + } + defer resp.Body.Close() + + reader := bufio.NewReader(resp.Body) + var str string + for { + var message message + line, readErr := reader.ReadString('\n') + if readErr != nil { + if readErr == io.EOF { + break + } + t.Fatalf("读取响应时出错: %v", readErr) + } + newLine := strings.TrimPrefix(line, "data:") + + // 解析 JSON 数据 + if err := json.Unmarshal([]byte(newLine), &message); err != nil { + continue + } + if message.Event == "message" { + str += message.Answer + } + // 处理数据 + + //fmt.Print("收到数据: ", line) + } + + r := regexp.MustCompile(`[\s\S]*?<\/think>`) + str = r.ReplaceAllString(str, "") + + fmt.Print("收到数据: ", str) +} diff --git a/feishu/util/msyql.go b/feishu/util/msyql.go new file mode 100644 index 0000000..84e50be --- /dev/null +++ b/feishu/util/msyql.go @@ -0,0 +1,34 @@ +package util + +import ( + "fmt" + + _ "github.com/go-sql-driver/mysql" + "github.com/jmoiron/sqlx" +) + +const ( + MYSQL_USER = "root" + MYSQL_PASS = "Z4rf7eZZe500dxa" + MYSQL_HOST = "rm-f8zd2030feam53n43io.mysql.rds.aliyuncs.com" + MYSQL_PORT = 3306 + MYSQL_DATABASE = "merge_pet_london" +) + +func MySQL() (*sqlx.DB, error) { + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", MYSQL_USER, MYSQL_PASS, MYSQL_HOST, MYSQL_PORT, MYSQL_DATABASE) + db, err := sqlx.Open("mysql", dsn) + if err != nil { + return nil, err + } + return db, nil +} + +func MYSQL2() (*sqlx.DB, error) { + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", MYSQL_USER, MYSQL_PASS, "8.208.47.208", MYSQL_PORT, "merge_pet_london_1") + db, err := sqlx.Open("mysql", dsn) + if err != nil { + return nil, err + } + return db, nil +} diff --git a/feishu/util/util.go b/feishu/util/util.go new file mode 100644 index 0000000..fcb2598 --- /dev/null +++ b/feishu/util/util.go @@ -0,0 +1,10 @@ +package util + +import "time" + +func ZeroTimestampByTz(tz string) int64 { + loc, _ := time.LoadLocation(tz) + now := time.Now().In(loc) + midnight := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) + return midnight.Unix() +}