Yancy1028 / Jusoft.DingtalkStream

钉钉Stream模式推送。.NET 版本SDK
MIT License
21 stars 7 forks source link

RichText的解析似乎出现了问题 #7

Closed BigHeadDev closed 5 months ago

BigHeadDev commented 5 months ago
JsonElement property = robotMessage.Payload.GetProperty("content");
ReceivedRobotMessage.RichTextContent richTextContent = new ReceivedRobotMessage.RichTextContent();
foreach (JsonElement item in property.EnumerateArray())
{
    ReceivedRobotMessage.RichText richText = new ReceivedRobotMessage.RichText();
    foreach (JsonProperty item2 in item.EnumerateObject())
    {
        switch (item2.Name)
        {
        case "text":
            richText.Text = item2.Value.GetString();
            break;
        case "downloadCode":
            richText.DownloadCode = item2.Value.GetString();
            break;
        case "pictureDownloadCode":
            richText.PictureDownloadCode = item2.Value.GetString();
            break;
        case "type":
            richText.Type = item2.Value.GetString();
            break;
        }
    }
    richTextContent.RichText.Add(richText);
}

这段代码中,富文本解析有问题,The requested operation requires an element of type 'Array', but the target element has type 'Object'.”

Yancy1028 commented 5 months ago

发送的消息能提供一下吗?或者是截图提供一下。我需要去复现看看是什么问题。如果着急的话可以自己通过Payload的方式去读取出来。

BigHeadDev commented 5 months ago

发送的消息能提供一下吗?或者是截图提供一下。我需要去复现看看是什么问题。如果着急的话可以自己通过Payload的方式去读取出来。

感谢您的回复~

以下是一段原始的消息:

{
    "senderPlatform": "Win",
    "conversationId": "ciddMdFO0VC5G0TRgHJ4g6V1xjpcwkPRbWeou5QUvztP3E=",
    "chatbotCorpId": "xxx",
    "chatbotUserId": "$:LWCP_v1:$6t1sbZdETK3WHg9JeYzrqEnU6hf6d6WP",
    "msgId": "msgENsp8ZQJ1gr2zundivEQcQ==",
    "senderNick": "Daniel.陈",
    "isAdmin": true,
    "senderStaffId": "15614290011522912",
    "sessionWebhookExpiredTime": 1718785903213,
    "createAt": 1718780502940,
    "content": {
        "richText": [
            {
                "text": "我有一个问题要反馈!"
            },
            {
                "text": "我今天使用了这个App"
            },
            {
                "text": "直接卡死了!!!!"
            },
            {
                "pictureDownloadCode": "mmgtyivG7Y0K+8E8QWgDChwLd2L6NNDwx9x4mBy+sJFhCbW/Ig6zPlFChBO03P0sEfa04r0GquTyZvjutOsDHrtgD1OIq4OuthWTop5LAsovpL1xcpLCJ122nTTIYXzoUtHDgKlfXnB0gagHcEj45bzWZtr+22x6nCm3qAVCuCYeoLhjpXqPcYpFtqD3UNs6ShVxoa+/v8oESm66+MrWEA==",
                "downloadCode": "mIofN681YE3f/+m+NntqpTEQpftLM+gYDk6fJrLbN+hmAIHRYNmsZ+UnsEeTkO3VOGsLYUgXzanXhWLrsnemqOTrn7gxfn9w8Hyg8VpRJT8ijrznHfH/IlppjDKDPwMhWTUuWu7oFMt3DHgwnh0y7dC1oKsbbMFD4vyfgjwLtVi50jYl4XXWq7gQxK5JlEx60GryK1E3tiLdEeSUzm4HAg==",
                "type": "picture"
            }
        ]
    },
    "senderCorpId": "dingb30bc4a6f95b2caf",
    "conversationType": "1",
    "senderId": "$:LWCP_v1:$a4GwMxYNCHokGPOUY0k1k/KoWoVGyuuK",
    "sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=xxxx",
    "robotCode": "xxxx",
    "msgtype": "richText"
}

我想,是不是要读取content--richText这一层之后,才可以转成EnumerateArray?

BigHeadDev commented 5 months ago

除了这个问题,我还发现了一个问题。似乎钉钉的接口发生了改变,audio消息已经没有duration字段了,而robotMessage.GetAudioContent();的过程中,这一段代码没有获取到内容,而抛出了异常: property.GetProperty("duration").GetInt64(),

Yancy1028 commented 5 months ago

除了这个问题,我还发现了一个问题。似乎钉钉的接口发生了改变,audio消息已经没有duration字段了,而robotMessage.GetAudioContent();的过程中,这一段代码没有获取到内容,而抛出了异常: property.GetProperty("duration").GetInt64(),

这个问题我已经处理过了,建议你先升级到最新的包的版本,若不存在的话,会返回null 值。

前面的脚本我看一下,看是否也是因为发生变化导致的识别错误问题,也或许是其他问题

Yancy1028 commented 5 months ago

问题已修复,版本号v0.1.7

BigHeadDev commented 5 months ago

问题已修复,版本号v0.1.7

感谢您的回复和帮助~

BigHeadDev commented 5 months ago

除了这个问题,我还发现了一个问题。似乎钉钉的接口发生了改变,audio消息已经没有duration字段了,而robotMessage.GetAudioContent();的过程中,这一段代码没有获取到内容,而抛出了异常: property.GetProperty("duration").GetInt64(),

这个问题我已经处理过了,建议你先升级到最新的包的版本,若不存在的话,会返回null 值。

前面的脚本我看一下,看是否也是因为发生变化导致的识别错误问题,也或许是其他问题

今天发现“video”类型的消息,在以下代码中出现了问题:

if (property.TryGetProperty("duration", out var value)) {
    videoContent.Duration = value.GetInt64();
}

原因是,钉钉那边返回的VideoContent中,"duration"是一个string,而不是long。导致在GetInt64();出错

Yancy1028 commented 5 months ago

应该不会把,如果说返回数据中存在duration 的字段时,它才会进行取值。这个判断的目的本身就是去校验这个字段是否存在,存在才赋值

BigHeadDev commented 5 months ago

应该不会把,如果说返回数据中存在duration 的字段时,它才会进行取值。这个判断的目的本身就是去校验这个字段是否存在,存在才赋值

相比 audio消息,video消息确实有"duration“字段,以下是钉钉API文档中的json示例:

{
  "msgtype": "video",
  "content": {
    "duration": 4000,
    "downloadCode": "mIofN681YE3f/****************OAORDnadz0WbSwWTiYvByBeYDjbg2ecUdno/RGtZ/sqzdvoh00EWw1U6xNqLC3Bk51U+i",
    "videoType": "mp4"
  }
}

可以清晰看到,"duration":4000确实是一个long(int)型的值。 但是在实际调试中,它长这样:

{
  "msgtype": "video",
  "content": {
    "duration": "4000",
    "downloadCode": "mIofN681YE3f/****************OAORDnadz0WbSwWTiYvByBeYDjbg2ecUdno/RGtZ/sqzdvoh00EWw1U6xNqLC3Bk51U+i",
    "videoType": "mp4"
  }
}

它变成了字符串 "duration": "4000",JsonElement中的GetInt64实现似乎不是强转,在这里报错了。 只能佩服钉钉团队的文档管理...

Yancy1028 commented 5 months ago

习惯就好,我去兼容掉吧

Yancy1028 commented 5 months ago

0.1.8 已修复此问题

BigHeadDev commented 5 months ago

习惯就好,我去兼容掉吧

3Q~