diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs
index 2cd94b6c..76bbcbe3 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinMeetingExtensions.cs
@@ -496,6 +496,88 @@ namespace SKIT.FlurlHttpClient.Wechat.Work
}
#endregion
+ #region MRA
+ ///
+ /// 异步调用 [POST] /cgi-bin/meeting/mra/query_status 接口。
+ /// REF: https://developer.work.weixin.qq.com/document/path/98786
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinMeetingMRAQueryStatusAsync(this WechatWorkClient client, Models.CgibinMeetingMRAQueryStatusRequest 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, "cgi-bin", "meeting", "mra", "query_status")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/meeting/mra/set_default_layout 接口。
+ /// REF: https://developer.work.weixin.qq.com/document/path/98787
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinMeetingMRASetDefaultLayoutAsync(this WechatWorkClient client, Models.CgibinMeetingMRASetDefaultLayoutRequest 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, "cgi-bin", "meeting", "mra", "set_default_layout")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/meeting/mra/set_raise_hand 接口。
+ /// REF: https://developer.work.weixin.qq.com/document/path/98788
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinMeetingMRASetRaiseHandAsync(this WechatWorkClient client, Models.CgibinMeetingMRASetRaiseHandRequest 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, "cgi-bin", "meeting", "mra", "set_raise_hand")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/meeting/mra/hangup 接口。
+ /// REF: https://developer.work.weixin.qq.com/document/path/98789
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinMeetingMRAHangupAsync(this WechatWorkClient client, Models.CgibinMeetingMRAHangupRequest 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, "cgi-bin", "meeting", "mra", "hangup")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
#region Phone
///
/// 异步调用 [POST] /cgi-bin/meeting/phone/callout 接口。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.cs
new file mode 100644
index 00000000..5d08188b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.cs
@@ -0,0 +1,35 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/meeting/mra/hangup 接口的请求。
+ ///
+ public class CgibinMeetingMRAHangupRequest : WechatWorkRequest
+ {
+ public static class Types
+ {
+ public class MRA
+ {
+ ///
+ /// 获取或设置会议的成员临时 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("tmp_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")]
+ public string TempOpenId { get; set; } = string.Empty;
+ }
+ }
+
+ ///
+ /// 获取或设置会议 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("meetingid")]
+ [System.Text.Json.Serialization.JsonPropertyName("meetingid")]
+ public string MeetingId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置会议连接器信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("mra")]
+ [System.Text.Json.Serialization.JsonPropertyName("mra")]
+ public Types.MRA MRA { get; set; } = new Types.MRA();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupResponse.cs
new file mode 100644
index 00000000..534fbee4
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAHangupResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/meeting/mra/hangup 接口的响应。
+ ///
+ public class CgibinMeetingMRAHangupResponse : WechatWorkResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.cs
new file mode 100644
index 00000000..ef62a660
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/meeting/mra/query_status 接口的请求。
+ ///
+ public class CgibinMeetingMRAQueryStatusRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置会议 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("meetingid")]
+ [System.Text.Json.Serialization.JsonPropertyName("meetingid")]
+ public string MeetingId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置会议的成员临时 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("tmp_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")]
+ public string TempOpenId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.cs
new file mode 100644
index 00000000..350ab2a3
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.cs
@@ -0,0 +1,85 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/meeting/mra/query_status 接口的响应。
+ ///
+ public class CgibinMeetingMRAQueryStatusResponse : WechatWorkResponse
+ {
+ ///
+ /// 获取或设置会议的成员临时 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("tmp_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")]
+ public string TempOpenId { get; set; } = default!;
+
+ ///
+ /// 获取或设置终端设备类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("instance_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("instance_id")]
+ public int InstanceId { get; set; }
+
+ ///
+ /// 获取或设置成员角色。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_role")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_role")]
+ public int UserRole { get; set; }
+
+ ///
+ /// 获取或设置网络研讨会成员角色。
+ ///
+ [Newtonsoft.Json.JsonProperty("webinar_member_role")]
+ [System.Text.Json.Serialization.JsonPropertyName("webinar_member_role")]
+ public int? WebinarMemberRole { get; set; }
+
+ ///
+ /// 获取或设置 IP 地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("ip")]
+ [System.Text.Json.Serialization.JsonPropertyName("ip")]
+ public string? IpAddress { get; set; }
+
+ ///
+ /// 获取或设置显示名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string? DisplayName { get; set; }
+
+ ///
+ /// 获取或设置是否开启麦克风。
+ ///
+ [Newtonsoft.Json.JsonProperty("audio_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("audio_state")]
+ public bool IsAudioOpen { get; set; }
+
+ ///
+ /// 获取或设置是否开启摄像头。
+ ///
+ [Newtonsoft.Json.JsonProperty("video_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("video_state")]
+ public bool IsVideoOpen { get; set; }
+
+ ///
+ /// 获取或设置是否屏幕共享。
+ ///
+ [Newtonsoft.Json.JsonProperty("screen_shared_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("screen_shared_state")]
+ public bool IsScreenShared { get; set; }
+
+ ///
+ /// 获取或设置默认分屏设置。
+ ///
+ [Newtonsoft.Json.JsonProperty("default_layout")]
+ [System.Text.Json.Serialization.JsonPropertyName("default_layout")]
+ public int DefaultLayout { get; set; }
+
+ ///
+ /// 获取或设置是否举手。
+ ///
+ [Newtonsoft.Json.JsonProperty("raise_hands_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("raise_hands_state")]
+ public bool IsRaiseHand { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.cs
new file mode 100644
index 00000000..18e26df1
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.cs
@@ -0,0 +1,49 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/meeting/mra/set_default_layout 接口的请求。
+ ///
+ public class CgibinMeetingMRASetDefaultLayoutRequest : WechatWorkRequest
+ {
+ public static class Types
+ {
+ public class MRA
+ {
+ ///
+ /// 获取或设置会议的成员临时 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("tmp_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")]
+ public string TempOpenId { get; set; } = string.Empty;
+ }
+ }
+
+ ///
+ /// 获取或设置会议 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("meetingid")]
+ [System.Text.Json.Serialization.JsonPropertyName("meetingid")]
+ public string MeetingId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置默认分屏设置。
+ ///
+ [Newtonsoft.Json.JsonProperty("default_layout")]
+ [System.Text.Json.Serialization.JsonPropertyName("default_layout")]
+ public int DefaultLayout { get; set; }
+
+ ///
+ /// 获取或设置默认非视频与会者在分屏中显示方式。
+ ///
+ [Newtonsoft.Json.JsonProperty("default_novideo_user")]
+ [System.Text.Json.Serialization.JsonPropertyName("default_novideo_user")]
+ public int DefaultNoVideoUser { get; set; }
+
+ ///
+ /// 获取或设置会议连接器信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("mra")]
+ [System.Text.Json.Serialization.JsonPropertyName("mra")]
+ public Types.MRA MRA { get; set; } = new Types.MRA();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutResponse.cs
new file mode 100644
index 00000000..d59a8080
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/meeting/mra/set_default_layout 接口的响应。
+ ///
+ public class CgibinMeetingMRASetDefaultLayoutResponse : WechatWorkResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.cs
new file mode 100644
index 00000000..aa955fa6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.cs
@@ -0,0 +1,42 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/meeting/mra/set_raise_hand 接口的请求。
+ ///
+ public class CgibinMeetingMRASetRaiseHandRequest : WechatWorkRequest
+ {
+ public static class Types
+ {
+ public class MRA
+ {
+ ///
+ /// 获取或设置会议的成员临时 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("tmp_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("tmp_openid")]
+ public string TempOpenId { get; set; } = string.Empty;
+ }
+ }
+
+ ///
+ /// 获取或设置会议 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("meetingid")]
+ [System.Text.Json.Serialization.JsonPropertyName("meetingid")]
+ public string MeetingId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置是否举手。
+ ///
+ [Newtonsoft.Json.JsonProperty("raise_hand")]
+ [System.Text.Json.Serialization.JsonPropertyName("raise_hand")]
+ public bool IsRaiseHand { get; set; }
+
+ ///
+ /// 获取或设置会议连接器信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("mra")]
+ [System.Text.Json.Serialization.JsonPropertyName("mra")]
+ public Types.MRA MRA { get; set; } = new Types.MRA();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandResponse.cs
new file mode 100644
index 00000000..7cf60714
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/meeting/mra/set_raise_hand 接口的响应。
+ ///
+ public class CgibinMeetingMRASetRaiseHandResponse : WechatWorkResponse
+ {
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.json
new file mode 100644
index 00000000..d0bfbfc9
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAHangupRequest.json
@@ -0,0 +1,6 @@
+{
+ "meetingid": "MEETINGID",
+ "mra": {
+ "tmp_openid": "TMP_OPENID"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.json
new file mode 100644
index 00000000..e6a4788d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusRequest.json
@@ -0,0 +1,4 @@
+{
+ "meetingid": "MEETINGID",
+ "tmp_openid": "TMP_OPENID"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.json
new file mode 100644
index 00000000..c3d519fd
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRAQueryStatusResponse.json
@@ -0,0 +1,15 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "tmp_openid": "TMP_OPENID",
+ "instance_id": 9,
+ "user_role": 0,
+ "webinar_member_role": 0,
+ "ip": "192.168.2.2",
+ "name": "user2",
+ "audio_state": true,
+ "video_state": false,
+ "screen_shared_state": false,
+ "default_layout": 1,
+ "raise_hands_state": false
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.json
new file mode 100644
index 00000000..034e250d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetDefaultLayoutRequest.json
@@ -0,0 +1,8 @@
+{
+ "meetingid": "MEETINGID",
+ "default_layout": 2,
+ "default_novideo_user": 1,
+ "mra": {
+ "tmp_openid": "TMP_OPENID"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.json
new file mode 100644
index 00000000..69a55ff7
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinMeeting/MRA/CgibinMeetingMRASetRaiseHandRequest.json
@@ -0,0 +1,7 @@
+{
+ "meetingid": "MEETINGID",
+ "raise_hand": true,
+ "mra": {
+ "tmp_openid": "TMP_OPENID"
+ }
+}