l-dingtalk-stream-sdk-go/example/example.go

129 lines
3.5 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 (
"bytes"
"context"
"encoding/json"
"flag"
"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/event"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/logger"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/payload"
"net/http"
"time"
)
/**
* @Author linya.jj
* @Date 2023/3/22 18:30
*/
func OnChatBotMessageReceived(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 := &chatbot.BotCallbackDataModel{}
err := json.Unmarshal([]byte(df.Data), msgData)
if err != nil {
// TODO 处理错误:回调消息反序列化出错
return frameResp, nil
}
//处理方式回复文本消息通过SessionWebhook来回复消息
requestBody := map[string]interface{}{
"msgtype": "text",
"text": map[string]interface{}{
"content": fmt.Sprintf("msg received: [%s]", msgData.Text.Content),
},
}
requestJsonBody, _ := json.Marshal(requestBody)
req, err := http.NewRequestWithContext(ctx, http.MethodPost, msgData.SessionWebhook, bytes.NewReader(requestJsonBody))
if err != nil {
// TODO 处理错误
return frameResp, nil
}
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 {
// TODO 处理错误: 回复消息出错
return frameResp, nil
}
return frameResp, nil
}
// 事件处理函数
func OnEventReceived(ctx context.Context, df *payload.DataFrame) (*payload.DataFrameResponse, error) {
eventHeader := event.NewEventHeaderFromDataFrame(df)
logger.GetLogger().Infof("received event, eventId=[%s] eventBornTime=[%d] eventCorpId=[%s] eventType=[%s] eventUnifiedAppId=[%s] data=[%s]",
eventHeader.EventId,
eventHeader.EventBornTime,
eventHeader.EventCorpId,
eventHeader.EventType,
eventHeader.EventUnifiedAppId,
df.Data)
resultStr, _ := json.Marshal(event.NewEventProcessResultSuccess())
frameResp := &payload.DataFrameResponse{
Code: payload.DataFrameResponseStatusCodeKOK,
Headers: payload.DataFrameHeader{
payload.DataFrameHeaderKContentType: payload.DataFrameContentTypeKJson,
payload.DataFrameHeaderKMessageId: df.GetMessageId(),
},
Message: "ok",
Data: string(resultStr),
}
return frameResp, nil
}
func main() {
var clientId, clientSecret string
flag.StringVar(&clientId, "client_id", "", "your-client-id")
flag.StringVar(&clientSecret, "client_secret", "", "your-client-secret")
flag.Parse()
logger.SetLogger(logger.NewStdTestLogger())
cli := client.NewStreamClient(
client.WithAppCredential(client.NewAppCredentialConfig(clientId, clientSecret)),
client.WithUserAgent(client.NewDingtalkGoSDKUserAgent()),
)
//注册事件类型的处理函数
cli.RegisterEventRouter("*", OnEventReceived)
//注册callback类型的处理函数
cli.RegisterCallbackRouter(payload.BotMessageCallbackTopic, OnChatBotMessageReceived)
err := cli.Start(context.Background())
if err != nil {
panic(err)
}
defer cli.Close()
select {}
}