feat #1 机器人回调更换topic

This commit is contained in:
jiangjian 2023-05-17 17:25:11 +08:00
parent ae3f631591
commit 53bfbab986
4 changed files with 125 additions and 2 deletions

View File

@ -0,0 +1,51 @@
package chatbot
import (
"context"
"encoding/json"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/payload"
)
/**
* @Author linya.jj
* @Date 2023/3/22 18:30
*/
type IMessageHandler func(c context.Context, data *BotCallbackDataModel) error
type DefaultChatBotFrameHandler struct {
defaultHandler IMessageHandler
}
func NewDefaultChatBotFrameHandler(defaultHandler IMessageHandler) *DefaultChatBotFrameHandler {
return &DefaultChatBotFrameHandler{
defaultHandler: defaultHandler,
}
}
func (h *DefaultChatBotFrameHandler) OnEventReceived(ctx context.Context, df *payload.DataFrame) (*payload.DataFrameResponse, error) {
frameResp := &payload.DataFrameResponse{
Code: 200,
Headers: payload.DataFrameHeader{
payload.DataFrameHeaderKContentType: payload.DataFrameContentTypeKJson,
payload.DataFrameHeaderKMessageId: df.GetMessageId(),
},
Message: "ok",
Data: "",
}
msgData := &BotCallbackDataModel{}
err := json.Unmarshal([]byte(df.Data), msgData)
if err != nil {
return nil, err
}
if h.defaultHandler != nil {
err = h.defaultHandler(ctx, msgData)
if err != nil {
return nil, err
}
}
return frameResp, nil
}

36
chatbot/model.go Normal file
View File

@ -0,0 +1,36 @@
package chatbot
/**
* @Author linya.jj
* @Date 2023/3/22 18:30
*/
type BotCallbackDataAtUserModel struct {
DingtalkId string `json:"dingtalkId"`
StaffId string `json:"staffId"`
}
type BotCallbackDataTextModel struct {
Content string `json:"content"`
}
type BotCallbackDataModel struct {
ConversationId string `json:"conversationId"`
AtUsers []BotCallbackDataAtUserModel `json:"atUsers"`
ChatbotCorpId string `json:"chatbotCorpId"`
ChatbotUserId string `json:"chatbotUserId"`
MsgId string `json:"msgId"`
SenderNick string `json:"senderNick"`
IsAdmin bool `json:"isAdmin"`
SenderStaffId string `json:"senderStaffId"`
SessionWebhookExpiredTime int64 `json:"sessionWebhookExpiredTime"`
CreateAt int64 `json:"createAt"`
SenderCorpId string `json:"senderCorpId"`
ConversationType string `json:"conversationType"`
SenderId string `json:"senderId"`
ConversationTitle string `json:"conversationTitle"`
IsInAtList bool `json:"isInAtList"`
SessionWebhook string `json:"sessionWebhook"`
Text BotCallbackDataTextModel `json:"text"`
Msgtype string `json:"msgtype"`
}

View File

@ -1,11 +1,17 @@
package main package main
import ( import (
"bytes"
"context" "context"
"encoding/json"
"fmt"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/chatbot"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/client" "github.com/open-dingtalk/dingtalk-stream-sdk-go/client"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/logger" "github.com/open-dingtalk/dingtalk-stream-sdk-go/logger"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/payload" "github.com/open-dingtalk/dingtalk-stream-sdk-go/payload"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/utils" "github.com/open-dingtalk/dingtalk-stream-sdk-go/utils"
"net/http"
"time"
) )
/** /**
@ -27,13 +33,43 @@ func OnBotCallback(ctx context.Context, df *payload.DataFrame) (*payload.DataFra
return frameResp, nil return frameResp, nil
} }
func OnChatReceive(ctx context.Context, data *chatbot.BotCallbackDataModel) error {
requestBody := map[string]interface{}{
"msgtype": "text",
"text": map[string]interface{}{
"content": fmt.Sprintf("msg received: [%s]", data.Text.Content),
},
}
requestJsonBody, _ := json.Marshal(requestBody)
req, err := http.NewRequestWithContext(ctx, http.MethodPost, data.SessionWebhook, bytes.NewReader(requestJsonBody))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "*/*")
httpClient := &http.Client{
Transport: http.DefaultTransport,
Timeout: 5 * time.Second, //设置超时包含connection时间、任意重定向时间、读取response body时间
}
_, err = httpClient.Do(req)
if err != nil {
return err
}
return nil
}
func RunBotListener() { func RunBotListener() {
logger.SetLogger(logger.NewStdTestLogger()) logger.SetLogger(logger.NewStdTestLogger())
cli := client.NewStreamClient( cli := client.NewStreamClient(
client.WithAppCredential(client.NewAppCredentialConfig("your-client-id", "your-client-secret")), client.WithAppCredential(client.NewAppCredentialConfig("your-client-id", "your-client-secret")),
client.WithUserAgent(client.NewDingtalkGoSDKUserAgent()), client.WithUserAgent(client.NewDingtalkGoSDKUserAgent()),
client.WithSubscription(utils.SubscriptionTypeKCallback, payload.BotMessageCallbackTopic, OnBotCallback), client.WithSubscription(utils.SubscriptionTypeKCallback, payload.BotMessageCallbackTopic, chatbot.NewDefaultChatBotFrameHandler(OnChatReceive).OnEventReceived),
) )
err := cli.Start(context.Background()) err := cli.Start(context.Background())

View File

@ -22,7 +22,7 @@ const (
DataFrameResponseStatusCodeKOK = 200 DataFrameResponseStatusCodeKOK = 200
DataFrameResponseStatusCodeKInternalError = 500 DataFrameResponseStatusCodeKInternalError = 500
BotMessageCallbackTopic = "bot_got_msg" //机器人消息统一回调topic BotMessageCallbackTopic = "/v1.0/im/bot/messages/get" //机器人消息统一回调topic
) )
func GenerateMessageId(prefix string) string { func GenerateMessageId(prefix string) string {