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