diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Extensions/WechatOpenAIClientExecuteOpenApiQueryExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Extensions/WechatOpenAIClientExecuteOpenApiQueryExtensions.cs new file mode 100644 index 00000000..d6fa05d4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Extensions/WechatOpenAIClientExecuteOpenApiQueryExtensions.cs @@ -0,0 +1,68 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.OpenAI +{ + public static class WechatOpenAIClientExecuteOpenApiQueryExtensions + { + /// + /// 异步调用 [POST] /openapi/sign/{TOKEN} 接口。 + /// REF: https://developers.weixin.qq.com/doc/aispeech/platform/INTERFACEDOCUMENT.html + /// + /// + /// + /// + /// + public static async Task ExecuteOpenApiSignAsync(this WechatOpenAIClient client, Models.OpenApiSignRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "openapi", "sign", client.Credentials.PushToken!); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /openapi/aibot/{TOKEN} 接口。 + /// REF: https://developers.weixin.qq.com/doc/aispeech/platform/INTERFACEDOCUMENT.html + /// + /// + /// + /// + /// + public static async Task ExecuteOpenApiAIBotAsync(this WechatOpenAIClient client, Models.OpenApiAIBotRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "openapi", "aibot", client.Credentials.PushToken!); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /openapi/gethotquerylist/{TOKEN} 接口。 + /// REF: https://developers.weixin.qq.com/doc/aispeech/platform/api/gethotquerylist.html + /// + /// + /// + /// + /// + public static async Task ExecuteOpenApiGetHotQueryListAsync(this WechatOpenAIClient client, Models.OpenApiGetHotQueryListRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "openapi", "gethotquerylist", client.Credentials.PushToken!); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/Bot/BotTestResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/Bot/BotTestResponse.cs index dc8425b4..569cc508 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/Bot/BotTestResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/Bot/BotTestResponse.cs @@ -24,12 +24,11 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models public string? ErrorMessage { get; set; } /// - /// 获取或设置最后有效时间戳。 + /// 获取或设置最后有效时间字符串。 /// [Newtonsoft.Json.JsonProperty("last_effective_time")] [System.Text.Json.Serialization.JsonPropertyName("last_effective_time")] - [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] - public long LastEffectiveTimestamp { get; set; } + public string? LastEffectiveTimeString { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiMp/OpenApiUnbindMpRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiMp/OpenApiUnbindMpRequest.cs index d3e7d41e..c74a85b7 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiMp/OpenApiUnbindMpRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiMp/OpenApiUnbindMpRequest.cs @@ -13,8 +13,7 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models /// /// 获取或设置微信 AppId。 /// - [Newtonsoft.Json.JsonProperty("authorizer_appid")] - [System.Text.Json.Serialization.JsonPropertyName("authorizer_appid")] + [XmlElement("authorizer_appid")] public string AuthorizerAppId { get; set; } = string.Empty; } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiAIBotRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiAIBotRequest.cs new file mode 100644 index 00000000..c6107bf3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiAIBotRequest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models +{ + /// + /// 表示 [POST] /openapi/aibot/{TOKEN} 接口的请求。 + /// + [XmlRoot("xml")] + public class OpenApiAIBotRequest : WechatOpenAIRequest, WechatOpenAIRequest.Serialization.IEncryptedXmlable + { + /// + /// 获取或设置请求签名。 + /// + [XmlElement("signature")] + public string Signature { get; set; } = string.Empty; + + /// + /// 获取或设置询问语句。 + /// + [XmlElement("query")] + public string QueryString { get; set; } = string.Empty; + + /// + /// 获取或设置环境。 + /// + [XmlElement("env", IsNullable = true)] + public string? Environment { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiAIBotResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiAIBotResponse.cs new file mode 100644 index 00000000..438cff68 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiAIBotResponse.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models +{ + /// + /// 表示 [POST] /openapi/aibot/{TOKEN} 接口的响应。 + /// + public class OpenApiAIBotResponse : WechatOpenAIResponse + { + public static class Types + { + public class Data + { + public static class Types + { + public class BotState + { + /// + /// 获取或设置机器人配置错误信息。 + /// + [Newtonsoft.Json.JsonProperty("err_msg")] + [System.Text.Json.Serialization.JsonPropertyName("err_msg")] + public string? ErrorMessage { get; set; } + + /// + /// 获取或设置最后有效时间字符串。 + /// + [Newtonsoft.Json.JsonProperty("latest_time")] + [System.Text.Json.Serialization.JsonPropertyName("latest_time")] + public string? LatestTimeString { get; set; } + + /// + /// 获取或设置最后有效时间字符串。 + /// + [Newtonsoft.Json.JsonProperty("latest_valid")] + [System.Text.Json.Serialization.JsonPropertyName("latest_valid")] + public bool IsLatestValid { get; set; } + } + + public class Message + { + /// + /// 获取或设置技能 ID。 + /// + [Newtonsoft.Json.JsonProperty("ans_node_id")] + [System.Text.Json.Serialization.JsonPropertyName("ans_node_id")] + public int AnswerNodeId { get; set; } + + /// + /// 获取或设置技能名称。 + /// + [Newtonsoft.Json.JsonProperty("ans_node_name")] + [System.Text.Json.Serialization.JsonPropertyName("ans_node_name")] + public string AnswerNodeName { get; set; } = default!; + + /// + /// 获取或设置置信度。 + /// + [Newtonsoft.Json.JsonProperty("confidence")] + [System.Text.Json.Serialization.JsonPropertyName("confidence")] + public int Confidence { get; set; } = default!; + + /// + /// 获取或设置消息类型。 + /// + [Newtonsoft.Json.JsonProperty("msg_type")] + [System.Text.Json.Serialization.JsonPropertyName("msg_type")] + public string MessageType { get; set; } = default!; + + /// + /// 获取或设置消息内容。 + /// + [Newtonsoft.Json.JsonProperty("content")] + [System.Text.Json.Serialization.JsonPropertyName("content")] + public string Content { get; set; } = default!; + + /// + /// 获取或设置消息状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置窗口标题。 + /// + [Newtonsoft.Json.JsonProperty("resp_title")] + [System.Text.Json.Serialization.JsonPropertyName("resp_title")] + public string? ResponseTitle { get; set; } + } + } + + /// + /// 获取或设置技能名称。 + /// + [Newtonsoft.Json.JsonProperty("ans_node_name")] + [System.Text.Json.Serialization.JsonPropertyName("ans_node_name")] + public string AnswerNodeName { get; set; } = default!; + + /// + /// 获取或设置回复类型。 + /// + [Newtonsoft.Json.JsonProperty("answer_type")] + [System.Text.Json.Serialization.JsonPropertyName("answer_type")] + public string AnswerType { get; set; } = default!; + + /// + /// 获取或设置回复内容。 + /// + [Newtonsoft.Json.JsonProperty("answer")] + [System.Text.Json.Serialization.JsonPropertyName("answer")] + public string Answer { get; set; } = default!; + + /// + /// 获取或设置意图标题。 + /// + [Newtonsoft.Json.JsonProperty("title")] + [System.Text.Json.Serialization.JsonPropertyName("title")] + public string Title { get; set; } = default!; + + /// + /// 获取或设置回复状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置发起用户。 + /// + [Newtonsoft.Json.JsonProperty("from_user_name")] + [System.Text.Json.Serialization.JsonPropertyName("from_user_name")] + public string FromUserName { get; set; } = default!; + + /// + /// 获取或设置接收机器人。 + /// + [Newtonsoft.Json.JsonProperty("to_user_name")] + [System.Text.Json.Serialization.JsonPropertyName("to_user_name")] + public string ToUserName { get; set; } = default!; + + /// + /// 获取或设置机器人状态信息。 + /// + [Newtonsoft.Json.JsonProperty("bot_state")] + [System.Text.Json.Serialization.JsonPropertyName("bot_state")] + public Types.BotState? BotState { get; set; } + + /// + /// 获取或设置详细回答列表。 + /// + [Newtonsoft.Json.JsonProperty("msg")] + [System.Text.Json.Serialization.JsonPropertyName("msg")] + public Types.Message[] MessageList { get; set; } = default!; + } + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiGetHotQueryListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiGetHotQueryListRequest.cs new file mode 100644 index 00000000..796ecb54 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiGetHotQueryListRequest.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models +{ + /// + /// 表示 [POST] /openapi/gethotquerylist/{TOKEN} 接口的请求。 + /// + [XmlRoot("xml")] + public class OpenApiGetHotQueryListRequest : WechatOpenAIRequest, WechatOpenAIRequest.Serialization.IEncryptedXmlable + { + /// + /// 获取或设置分页页数。 + /// 默认值:1 + /// + [XmlElement("pageNo")] + public int Page { get; set; } = 1; + + /// + /// 获取或设置分页每页数量。 + /// 默认值:10 + /// + [XmlElement("pageSize")] + public int Limit { get; set; } = 10; + + /// + /// 获取或设置命中类型。 + /// + [XmlElement("matchType", IsNullable = true)] + public int? MatchType { get; set; } + + /// + /// 获取或设置问题类型。 + /// + [XmlElement("cluesType", IsNullable = true)] + public int? ClueType { get; set; } + + /// + /// 获取或设置报告类型。 + /// + [XmlElement("reportType", IsNullable = true)] + public int? ReportType { get; set; } + + /// + /// 获取或设置日期字符串(格式:yyyy-MM-dd)。 + /// + [XmlElement("date")] + public string DateString { get; set; } = string.Empty; + + /// + /// 获取或设置开发者的 OpenId。 + /// + [XmlElement("openid")] + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiGetHotQueryListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiGetHotQueryListResponse.cs new file mode 100644 index 00000000..e1274a8f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiGetHotQueryListResponse.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models +{ + /// + /// 表示 [POST] /openapi/gethotquerylist/{TOKEN} 接口的响应。 + /// + public class OpenApiGetHotQueryListResponse : WechatOpenAIResponse + { + public static class Types + { + public class Data + { + public static class Types + { + public class HotQuery + { + public static class Types + { + public class Example + { + /// + /// 获取或设置相似问题。 + /// + [Newtonsoft.Json.JsonProperty("ques")] + [System.Text.Json.Serialization.JsonPropertyName("ques")] + public string Question { get; set; } = default!; + + /// + /// 获取或设置分数 + /// + [Newtonsoft.Json.JsonProperty("score")] + [System.Text.Json.Serialization.JsonPropertyName("score")] + public int Score { get; set; } + } + } + + /// + /// 获取或设置提问总数。 + /// + [Newtonsoft.Json.JsonProperty("askCount")] + [System.Text.Json.Serialization.JsonPropertyName("askCount")] + public int AskCount { get; set; } + + /// + /// 获取或设置提问用户数。 + /// + [Newtonsoft.Json.JsonProperty("askUserCount")] + [System.Text.Json.Serialization.JsonPropertyName("askUserCount")] + public int AskUserCount { get; set; } + + /// + /// 获取或设置问法总数。 + /// + [Newtonsoft.Json.JsonProperty("askUserCount")] + [System.Text.Json.Serialization.JsonPropertyName("askUserCount")] + public int QuestionCount { get; set; } + + /// + /// 获取或设置问题类型。 + /// + [Newtonsoft.Json.JsonProperty("cluesType")] + [System.Text.Json.Serialization.JsonPropertyName("cluesType")] + public int ClueType { get; set; } + + /// + /// 获取或设置示例列表 + /// + [Newtonsoft.Json.JsonProperty("exampleQues")] + [System.Text.Json.Serialization.JsonPropertyName("exampleQues")] + public Types.Example[] ExampleList { get; set; } = default!; + } + } + + /// + /// 获取或设置问题类别数量。 + /// + [Newtonsoft.Json.JsonProperty("hotQuesClusterCount")] + [System.Text.Json.Serialization.JsonPropertyName("hotQuesClusterCount")] + public int HotQuestionClusterCount { get; set; } + + /// + /// 获取或设置问题数量。 + /// + [Newtonsoft.Json.JsonProperty("hotQuesCount")] + [System.Text.Json.Serialization.JsonPropertyName("hotQuesCount")] + public int HotQuestionCount { get; set; } + + /// + /// 获取或设置分页总页数。 + /// + [Newtonsoft.Json.JsonProperty("totalPages")] + [System.Text.Json.Serialization.JsonPropertyName("totalPages")] + public int TotalPageCount { get; set; } + + /// + /// 获取或设置热问列表。 + /// + [Newtonsoft.Json.JsonProperty("list")] + [System.Text.Json.Serialization.JsonPropertyName("list")] + public Types.HotQuery[] HotQueryList { get; set; } = default!; + } + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiSignRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiSignRequest.cs new file mode 100644 index 00000000..4e4c2504 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiSignRequest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models +{ + /// + /// 表示 [POST] /openapi/sign/{TOKEN} 接口的请求。 + /// + [XmlRoot("xml")] + public class OpenApiSignRequest : WechatOpenAIRequest, WechatOpenAIRequest.Serialization.IEncryptedXmlable + { + /// + /// 获取或设置用户 ID。 + /// + [XmlElement("userid")] + public string UserId { get; set; } = string.Empty; + + /// + /// 获取或设置用户昵称。 + /// + [XmlElement("username")] + public string Nickname { get; set; } = string.Empty; + + /// + /// 获取或设置用户头像 URL。 + /// + [XmlElement("avatar", IsNullable = true)] + public string? AvatarUrl { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiSignResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiSignResponse.cs new file mode 100644 index 00000000..3ad6e1e2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApiQuery/OpenApiSignResponse.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models +{ + /// + /// 表示 [POST] /openapi/sign/{TOKEN} 接口的响应。 + /// + public class OpenApiSignResponse : WechatOpenAIResponse + { + public static class Types + { + public class Data + { + /// + /// 获取或设置请求签名。 + /// + [Newtonsoft.Json.JsonProperty("signature")] + [System.Text.Json.Serialization.JsonPropertyName("signature")] + public string Signature { get; set; } = default!; + + /// + /// 获取或设置有效期(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("expiresIn")] + [System.Text.Json.Serialization.JsonPropertyName("expiresIn")] + public int ExpiresIn { get; set; } + } + } + } +}