devops/feishu/main.go
2025-04-02 10:26:57 +08:00

155 lines
3.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.0OnCustomizedEvent 内的 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(`<think>[\s\S]*?<\/think>`)
str = r.ReplaceAllString(str, "")
str = strings.TrimLeft(str, "\n")
if str == "" {
str = "我不知道你在说什么"
}
return str
}