/// <summary> /// 调用 <see cref="CQ_GroupMessage"/> 方法 /// </summary> /// <param name="appEvent">目标事件信息</param> /// <param name="subType">事件类型</param> /// <param name="fromGroup">来源群</param> /// <param name="fromQQ">来源QQ</param> /// <param name="fromAnonymous">来源匿名</param> /// <param name="msg">消息内容</param> /// <param name="font">字体指针</param> /// <exception cref="ObjectDisposedException">当前对象已经被释放</exception> /// <exception cref="MissingMethodException">尝试访问未公开的函数</exception> /// <returns>返回函数处理结果</returns> public HandleType InvokeCQGroupMessage(AppEvent appEvent, GroupMessageType subType, int msgId, long fromGroup, long fromQQ, string fromAnonymous, string msg, IntPtr font) { if (appEvent is null) { throw new ArgumentNullException(nameof(appEvent)); } if (fromAnonymous is null) { throw new ArgumentNullException(nameof(fromAnonymous)); } if (msg is null) { throw new ArgumentNullException(nameof(msg)); } if (appEvent.Type != AppEventType.GroupMessage) { throw new ArgumentException($"函数信息不是 {AppEventType.GroupMessage} 类型", nameof(appEvent)); } GCHandle anonymousHandle = fromAnonymous.GetGCHandle(_defaultEncoding); GCHandle msgHandle = ((string)msg).GetGCHandle(_defaultEncoding); try { return((HandleType)this.GetFunction <CQ_GroupMessage> (appEvent.Function) ((int)subType, msgId, fromGroup, fromQQ, anonymousHandle.AddrOfPinnedObject(), msgHandle.AddrOfPinnedObject(), font.ToInt32())); } finally { anonymousHandle.Free(); msgHandle.Free(); } }
/// <summary> /// 推送群消息 /// </summary> /// <param name="subType">消息子类型</param> /// <param name="msgId">消息Id</param> /// <param name="fromGroup">来源群号</param> /// <param name="fromQQ">来源QQ</param> /// <param name="fromAnonymous">来源匿名者</param> /// <param name="msg">消息内容</param> /// <param name="font">字体指针</param> public void PushGroupMessage(GroupMessageType subType, int msgId, long fromGroup, long fromQQ, string fromAnonymous, string msg, IntPtr font) { int id = Logger.Instance.BeginInfoReceive(CQPErrorCode.TYPE_MESSAGE_GROUP, $"群: {fromGroup} 账号: {fromQQ} {msg}"); foreach (CQPSimulatorApp app in this.CQPApps) { CQPDynamicLibrary library = app.Library; if (library.IsEnable) { IEnumerable <AppEvent> events = GetEvents(app, AppEventType.GroupMessage); foreach (AppEvent appEvent in events) { try { if (library.InvokeCQGroupMessage(appEvent, subType, msgId, fromGroup, fromQQ, fromAnonymous, msg, font) == HandleType.Intercept) { break; // 返回拦截消息, 跳出循环 } } catch (Exception ex) { Logger.Instance.Error(library.AppInfo.Name, $"{ex.Message}"); } } } } Logger.Instance.EndLog(id, LogState.Success); }
/// <summary> /// 根据OpenId进行群发 /// </summary> /// <param name="accessToken"></param> /// <param name="mediaId">用于群发的消息的media_id</param> /// <param name="type"></param> /// <param name="openIds">openId字符串数组</param> /// 注意mediaId和content不可同时为空 /// <returns></returns> public static SendResult SendGroupMessageByOpenId(string accessToken, GroupMessageType type, string mediaId, params string[] openIds) { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}"; BaseGroupMessageDataByOpenId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByOpenId_ImageData() { touser = openIds, image = new GroupMessageByOpenId_MediaId() { media_id = mediaId }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByOpenId_VoiceData() { touser = openIds, voice = new GroupMessageByOpenId_MediaId() { media_id = mediaId }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByOpenId_MpNewsData() { touser = openIds, mpnews = new GroupMessageByOpenId_MediaId() { media_id = mediaId }, msgtype = "mpnews" }; break; case GroupMessageType.video: throw new Exception("发送视频信息请使用SendVideoGroupMessageByOpenId方法。"); break; case GroupMessageType.text: throw new Exception("发送文本信息请使用SendTextGroupMessageByOpenId方法。"); break; default: throw new Exception("参数错误。"); break; } return(CommonJsonSend.Send <SendResult>(accessToken, urlFormat, baseData)); }
public GroupMessageTaskContext(GroupMessageType subType, Group fromGroup, QQ fromQQ, GroupAnonymous fromAnonymous, Message msg, IntPtr font) : base(2) { base.SetValue(KeySubType, subType); base.SetValue(KeyFromGroup, fromGroup); base.SetValue(KeyFromQQ, fromQQ); base.SetValue(KeyFromAnonymous, fromAnonymous); base.SetValue(KeyMessage, msg); base.SetValue(KeyFont, font); }
public override bool Interpret(TaskContext context) { if (context is GroupMessageTaskContext groupContext) { GroupMessageType subType = groupContext.SubType; Message msg = groupContext.Message; Group fromGroup = groupContext.FromGroup; QQ fromQQ = groupContext.FromQQ; GroupAnonymous fromAnonymous = groupContext.FromAnonymous; IntPtr font = groupContext.Font; // 存入消息列表 this.Simulator.DataPool.MessageCollection.Add(msg); // 调用app this.Simulator.PushGroupMessage(subType, msg.Id, fromGroup, fromQQ, fromAnonymous == null ? string.Empty : fromAnonymous.ToBase64String(), msg, font); } return(false); }
private void HandleMessage(byte[] data) { using (MessageReader mr = new MessageReader(data)) { GroupMessageType type = (GroupMessageType)mr.Read <int>(); lock (playerGroups) { switch (type) { case GroupMessageType.GROUP_RESET: playerGroups.Clear(); groupAdmins.Clear(); break; case GroupMessageType.GROUP_INFO: { string playerName = mr.Read <string>(); string[] groups = mr.Read <string[]>(); playerGroups[playerName] = new List <string>(groups); } break; case GroupMessageType.ADMIN_INFO: { string groupName = mr.Read <string>(); string[] players = mr.Read <string[]>(); groupAdmins[groupName] = new List <string>(players); } break; case GroupMessageType.GROUPS_SYNCED: synced = true; break; } } } }
/// <summary> /// 预览接口【订阅号与服务号认证后均可用】 /// </summary> /// <param name="accessToken"></param> /// <param name="mediaId">用于群发的消息的media_id</param> /// <param name="type"></param> /// <param name="openId">接收消息用户对应该公众号的openid</param> /// 注意mediaId和content不可同时为空 /// <returns></returns> public static SendResult SendGroupMessagePreview(string accessToken, GroupMessageType type, string mediaId, string openId) { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token={0}"; BaseGroupMessageDataPreview baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessagePreview_ImageData() { touser = openId, image = new GroupMessagePreview_MediaId() { media_id = mediaId }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessagePreview_VoiceData() { touser = openId, voice = new GroupMessagePreview_MediaId() { media_id = mediaId }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessagePreview_MpNewsData() { touser = openId, mpnews = new GroupMessagePreview_MediaId() { media_id = mediaId }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessagePreview_MpVideoData() { touser = openId, mpvideo = new GroupMessagePreview_MediaId() { media_id = mediaId }, msgtype = "mpvideo" }; break; case GroupMessageType.text: throw new Exception("发送文本信息请使用SendTextGroupMessagePreview方法。"); break; default: throw new Exception("参数错误。"); break; } return CommonJsonSend.Send<SendResult>(accessToken, urlFormat, baseData); }
/// <summary> /// 根据OpenId进行群发 /// </summary> /// <param name="accessToken"></param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="openIds">openId字符串数组</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static SendResult SendGroupMessageByOpenId(string accessToken, GroupMessageType type, string value, int timeOut = Config.TIME_OUT, params string[] openIds) { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}"; BaseGroupMessageDataByOpenId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByOpenId_ImageData() { touser = openIds, image = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByOpenId_VoiceData() { touser = openIds, voice = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByOpenId_MpNewsData() { touser = openIds, mpnews = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByOpenId_WxCardData() { touser = openIds, wxcard = new GroupMessageByOpenId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.video: throw new Exception("发送视频信息请使用SendVideoGroupMessageByOpenId方法。"); break; case GroupMessageType.text: baseData = new GroupMessageByOpenId_TextData() { touser = openIds, text = new GroupMessageByOpenId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); break; } return CommonJsonSend.Send<SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }
/// <summary> /// 预览接口【订阅号与服务号认证后均可用】 /// 注意:openId与wxName两者任选其一,同时传入以wxName优先 /// </summary> /// <param name="accessToken"></param> /// <param name="value">群发媒体消息时为media_id,群发文本信息为content</param> /// <param name="type"></param> /// <param name="openId">接收消息用户对应该公众号的openid</param> /// <param name="wxName">接收消息用户的微信号</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static SendResult SendGroupMessagePreview(string accessToken, GroupMessageType type, string value, string openId, string wxName, int timeOut = Config.TIME_OUT) { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token={0}"; BaseGroupMessageDataPreview baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessagePreview_ImageData() { touser = openId, towxname = wxName, image = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessagePreview_VoiceData() { touser = openId, towxname = wxName, voice = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessagePreview_MpNewsData() { touser = openId, towxname = wxName, mpnews = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessagePreview_MpVideoData() { touser = openId, towxname = wxName, mpvideo = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "mpvideo" }; break; case GroupMessageType.text: baseData = new GroupMessagePreview_TextData() { touser = openId, towxname = wxName, text = new GroupMessagePreview_Content() { content = value }, msgtype = "text" }; break; case GroupMessageType.wxcard: throw new Exception("发送卡券息请使用WxCardGroupMessagePreview方法。"); break; default: throw new Exception("参数错误。"); break; } return CommonJsonSend.Send<SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }
/// <summary> /// 根据分组进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// /// </summary> /// <param name="accessToken"></param> /// <param name="groupId">群发到的分组的group_id,参加用户管理中用户分组接口,若is_to_all值为true,可不填写group_id</param> /// <param name="mediaId">用于群发的消息的media_id</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <returns></returns> public static SendResult SendGroupMessageByGroupId(string accessToken, string groupId, string mediaId, GroupMessageType type, bool isToAll = false) { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={0}"; BaseGroupMessageDataByGroupId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByGroupId_ImageData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, image = new GroupMessageByGroupId_MediaId() { media_id = mediaId }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByGroupId_VoiceData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, voice = new GroupMessageByGroupId_MediaId() { media_id = mediaId }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByGroupId_MpNewsData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpnews = new GroupMessageByGroupId_MediaId() { media_id = mediaId }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessageByGroupId_MpVideoData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpvideo = new GroupMessageByGroupId_MediaId() { media_id = mediaId }, msgtype = "mpvideo" }; break; case GroupMessageType.text: throw new Exception("发送文本信息请使用SendTextGroupMessageByGroupId方法。"); break; default: throw new Exception("参数错误。"); break; } return(CommonJsonSend.Send <SendResult>(accessToken, urlFormat, baseData)); }
/// <summary> /// 根据分组进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发 /// /// </summary> /// <param name="accessToken"></param> /// <param name="groupId">群发到的分组的group_id,参加用户管理中用户分组接口,若is_to_all值为true,可不填写group_id</param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static SendResult SendGroupMessageByGroupId(string accessToken, string groupId, string value, GroupMessageType type, bool isToAll = false, int timeOut = Config.TIME_OUT) { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={0}"; BaseGroupMessageDataByGroupId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByGroupId_ImageData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, image = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByGroupId_VoiceData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, voice = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByGroupId_MpNewsData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpnews = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessageByGroupId_MpVideoData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpvideo = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpvideo" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByGroupId_WxCardData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, wxcard = new GroupMessageByGroupId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.text: baseData = new GroupMessageByGroupId_TextData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, text = new GroupMessageByGroupId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); break; } return CommonJsonSend.Send<SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }
/// <summary> /// 【异步方法】根据分组进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发 /// /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="groupId">群发到的分组的group_id,参加用户管理中用户分组接口,若is_to_all值为true,可不填写group_id</param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <param name="sendIgnoreReprint">待群发的文章被判定为转载时,是否继续群发</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static async Task <SendResult> SendGroupMessageByGroupIdAsync(string accessTokenOrAppId, string groupId, string value, GroupMessageType type, bool isToAll = false, bool sendIgnoreReprint = false, int timeOut = Config.TIME_OUT) { return(await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={0}"; BaseGroupMessageDataByGroupId baseData = null; var filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByGroupId_ImageData() { filter = filter, image = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByGroupId_VoiceData() { filter = filter, voice = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByGroupId_MpNewsData() { filter = filter, mpnews = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessageByGroupId_MpVideoData() { filter = filter, mpvideo = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpvideo" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByGroupId_WxCardData() { filter = filter, wxcard = new GroupMessageByGroupId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.text: baseData = new GroupMessageByGroupId_TextData() { filter = filter, text = new GroupMessageByGroupId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); //break; } baseData.send_ignore_reprint = sendIgnoreReprint ? 0 : 1;//待群发的文章被判定为转载时,是否继续群发 return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync <SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }, accessTokenOrAppId)); }
/// <summary> /// 根据OpenId进行群发 /// </summary> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="openIds">openId字符串数组</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public SendResult SendGroupMessageByOpenId(GroupMessageType type, string value, int timeOut = Config.TIME_OUT, params string[] openIds) { var accessToken = _api.GetAccessToken(); string url = string.Format("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}", accessToken); BaseGroupMessageDataByOpenId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByOpenId_ImageData() { touser = openIds, image = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByOpenId_VoiceData() { touser = openIds, voice = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByOpenId_MpNewsData() { touser = openIds, mpnews = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByOpenId_WxCardData() { touser = openIds, wxcard = new GroupMessageByOpenId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.video: throw new Exception("发送视频信息请使用SendVideoGroupMessageByOpenId方法。"); break; case GroupMessageType.text: baseData = new GroupMessageByOpenId_TextData() { touser = openIds, text = new GroupMessageByOpenId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); } return(Post <SendResult>(url, baseData, timeOut)); }
/// <summary> /// 【异步方法】根据[标签]进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发 /// /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="tagId">群发到的标签的tag_id,若is_to_all值为true,可不填写tag_id</param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <param name="sendIgnoreReprint">待群发的文章被判定为转载时,是否继续群发</param> /// <param name="clientmsgid">开发者侧群发msgid,长度限制64字节,如不填,则后台默认以群发范围和群发内容的摘要值做为clientmsgid</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static async Task <SendResult> SendGroupMessageByTagIdAsync(string accessTokenOrAppId, string tagId, string value, GroupMessageType type, bool isToAll = false, bool sendIgnoreReprint = false, string clientmsgid = null, int timeOut = Config.TIME_OUT) { return(await SendGroupMessageByFilterAsync(accessTokenOrAppId, null, tagId, value, type, isToAll, sendIgnoreReprint, clientmsgid, timeOut)); }
/// <summary> /// 【异步方法】根据OpenId进行群发【订阅号不可用,服务号认证后可用】 /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="openIds">openId字符串数组</param> /// <param name="clientmsgid">开发者侧群发msgid,长度限制64字节,如不填,则后台默认以群发范围和群发内容的摘要值做为clientmsgid</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static async Task <SendResult> SendGroupMessageByOpenIdAsync(string accessTokenOrAppId, GroupMessageType type, string value, string clientmsgid = null, int timeOut = Config.TIME_OUT, params string[] openIds) { return(await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { string urlFormat = Config.ApiMpHost + "/cgi-bin/message/mass/send?access_token={0}"; BaseGroupMessageDataByOpenId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByOpenId_ImageData() { touser = openIds, image = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByOpenId_VoiceData() { touser = openIds, voice = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByOpenId_MpNewsData() { touser = openIds, mpnews = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByOpenId_WxCardData() { touser = openIds, wxcard = new GroupMessageByOpenId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.video: throw new Exception("发送视频信息请使用SendVideoGroupMessageByOpenId方法。"); //break; case GroupMessageType.text: baseData = new GroupMessageByOpenId_TextData() { touser = openIds, text = new GroupMessageByOpenId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); //break; } baseData.clientmsgid = clientmsgid; return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync <SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }, accessTokenOrAppId)); }
/// <summary> /// 根据[分组]进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发 /// /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="groupId">群发到的分组的group_id,参见用户管理中用户分组接口,若is_to_all值为true,可不填写group_id;如果groupId和tagId同时填写,优先使用groupId;groupId和tagId最多只能使用一个</param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <param name="sendIgnoreReprint">待群发的文章被判定为转载时,是否继续群发</param> /// <param name="clientmsgid">开发者侧群发msgid,长度限制64字节,如不填,则后台默认以群发范围和群发内容的摘要值做为clientmsgid</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static SendResult SendGroupMessageByGroupId(string accessTokenOrAppId, string groupId, string value, GroupMessageType type, bool isToAll = false, bool sendIgnoreReprint = false, string clientmsgid = null, int timeOut = Config.TIME_OUT) { return(SendGroupMessageByFilter(accessTokenOrAppId, groupId, null, value, type, isToAll, sendIgnoreReprint, clientmsgid, timeOut)); }
/// <summary> /// 根据分组进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发 /// /// </summary> /// <param name="groupId">群发到的分组的group_id,参加用户管理中用户分组接口,若is_to_all值为true,可不填写group_id</param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public SendResult SendGroupMessageByGroupId(string groupId, string value, GroupMessageType type, bool isToAll = false, int timeOut = Config.TIME_OUT) { var accessToken = _api.GetAccessToken(); string url = string.Format("https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={0}", accessToken); BaseGroupMessageDataByGroupId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByGroupId_ImageData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, image = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByGroupId_VoiceData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, voice = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByGroupId_MpNewsData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpnews = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessageByGroupId_MpVideoData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpvideo = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpvideo" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByGroupId_WxCardData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, wxcard = new GroupMessageByGroupId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.text: baseData = new GroupMessageByGroupId_TextData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, text = new GroupMessageByGroupId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); } return(Post <SendResult>(url, baseData, timeOut)); }
/// <summary> /// 根据分组进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发 /// /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="groupId">群发到的分组的group_id,参加用户管理中用户分组接口,若is_to_all值为true,可不填写group_id</param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static SendResult SendGroupMessageByGroupId(string accessTokenOrAppId, string groupId, string value, GroupMessageType type, bool isToAll = false, int timeOut = Config.TIME_OUT) { return(ApiHandlerWapper.TryCommonApi(accessToken => { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={0}"; BaseGroupMessageDataByGroupId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByGroupId_ImageData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, image = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByGroupId_VoiceData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, voice = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByGroupId_MpNewsData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpnews = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessageByGroupId_MpVideoData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpvideo = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpvideo" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByGroupId_WxCardData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, wxcard = new GroupMessageByGroupId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.text: baseData = new GroupMessageByGroupId_TextData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, text = new GroupMessageByGroupId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); break; } return CommonJsonSend.Send <SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }, accessTokenOrAppId)); }
/// <summary> /// 根据OpenId进行群发 /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="openIds">openId字符串数组</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static SendResult SendGroupMessageByOpenId(string accessTokenOrAppId, GroupMessageType type, string value, int timeOut = Config.TIME_OUT, params string[] openIds) { return(ApiHandlerWapper.TryCommonApi(accessToken => { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}"; BaseGroupMessageDataByOpenId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByOpenId_ImageData() { touser = openIds, image = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByOpenId_VoiceData() { touser = openIds, voice = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByOpenId_MpNewsData() { touser = openIds, mpnews = new GroupMessageByOpenId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByOpenId_WxCardData() { touser = openIds, wxcard = new GroupMessageByOpenId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.video: throw new Exception("发送视频信息请使用SendVideoGroupMessageByOpenId方法。"); break; case GroupMessageType.text: baseData = new GroupMessageByOpenId_TextData() { touser = openIds, text = new GroupMessageByOpenId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); break; } return CommonJsonSend.Send <SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }, accessTokenOrAppId)); }
/// <summary> /// 预览接口【订阅号与服务号认证后均可用】 /// 注意:openId与wxName两者任选其一,同时传入以wxName优先 /// </summary> /// <param name="accessToken"></param> /// <param name="value">群发媒体消息时为media_id,群发文本信息为content</param> /// <param name="type"></param> /// <param name="openId">接收消息用户对应该公众号的openid</param> /// <param name="wxName">接收消息用户的微信号</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static SendResult SendGroupMessagePreview(string accessToken, GroupMessageType type, string value, string openId, string wxName = null, int timeOut = Config.TIME_OUT) { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token={0}"; BaseGroupMessageDataPreview baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessagePreview_ImageData() { touser = openId, towxname = wxName, image = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessagePreview_VoiceData() { touser = openId, towxname = wxName, voice = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessagePreview_MpNewsData() { touser = openId, towxname = wxName, mpnews = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessagePreview_MpVideoData() { touser = openId, towxname = wxName, mpvideo = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "mpvideo" }; break; case GroupMessageType.text: baseData = new GroupMessagePreview_TextData() { touser = openId, towxname = wxName, text = new GroupMessagePreview_Content() { content = value }, msgtype = "text" }; break; case GroupMessageType.wxcard: throw new Exception("发送卡券息请使用WxCardGroupMessagePreview方法。"); break; default: throw new Exception("参数错误。"); break; } return(CommonJsonSend.Send <SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut)); }
/// <summary> /// 根据分组进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// /// </summary> /// <param name="accessToken"></param> /// <param name="groupId">群发到的分组的group_id,参加用户管理中用户分组接口,若is_to_all值为true,可不填写group_id</param> /// <param name="mediaId">用于群发的消息的media_id</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <returns></returns> public static SendResult SendGroupMessageByGroupId(string accessToken, string groupId, string mediaId, GroupMessageType type, bool isToAll = false) { const string urlFormat = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={0}"; BaseGroupMessageDataByGroupId baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessageByGroupId_ImageData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, image = new GroupMessageByGroupId_MediaId() { media_id = mediaId }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByGroupId_VoiceData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, voice = new GroupMessageByGroupId_MediaId() { media_id = mediaId }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByGroupId_MpNewsData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpnews = new GroupMessageByGroupId_MediaId() { media_id = mediaId }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessageByGroupId_MpVideoData() { filter = new GroupMessageByGroupId_GroupId() { group_id = groupId, is_to_all = isToAll }, mpvideo = new GroupMessageByGroupId_MediaId() { media_id = mediaId }, msgtype = "mpvideo" }; break; case GroupMessageType.text: throw new Exception("发送文本信息请使用SendTextGroupMessageByGroupId方法。"); break; default: throw new Exception("参数错误。"); break; } return CommonJsonSend.Send<SendResult>(accessToken, urlFormat, baseData); }
/// <summary> /// 【异步方法】预览接口【订阅号与服务号认证后均可用】 /// 注意:openId与wxName两者任选其一,同时传入以wxName优先 /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="value">群发媒体消息时为media_id,群发文本信息为content</param> /// <param name="type"></param> /// <param name="openId">接收消息用户对应该公众号的openid</param> /// <param name="wxName">接收消息用户的微信号</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static async Task <SendResult> SendGroupMessagePreviewAsync(string accessTokenOrAppId, GroupMessageType type, string value, string openId, string wxName = null, int timeOut = Config.TIME_OUT) { return(await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { string urlFormat = Config.ApiMpHost + "/cgi-bin/message/mass/preview?access_token={0}"; BaseGroupMessageDataPreview baseData = null; switch (type) { case GroupMessageType.image: baseData = new GroupMessagePreview_ImageData() { touser = openId, towxname = wxName, image = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessagePreview_VoiceData() { touser = openId, towxname = wxName, voice = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessagePreview_MpNewsData() { touser = openId, towxname = wxName, mpnews = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessagePreview_MpVideoData() { touser = openId, towxname = wxName, mpvideo = new GroupMessagePreview_MediaId() { media_id = value }, msgtype = "mpvideo" }; break; case GroupMessageType.text: baseData = new GroupMessagePreview_TextData() { touser = openId, towxname = wxName, text = new GroupMessagePreview_Content() { content = value }, msgtype = "text" }; break; case GroupMessageType.wxcard: throw new Exception("发送卡券息请使用WxCardGroupMessagePreview方法。"); default: throw new Exception("参数错误。"); } return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync <SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }, accessTokenOrAppId)); }
/// <summary> /// 【异步方法】根据分组进行群发【订阅号与服务号认证后均可用】 /// /// 请注意: /// 1、该接口暂时仅提供给已微信认证的服务号 /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试 /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。 /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发 /// /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="groupId">群发到的分组的group_id,参见用户管理中用户分组接口,若is_to_all值为true,可不填写group_id;如果groupId和tagId同时填写,优先使用groupId;groupId和tagId最多只能使用一个</param> /// <param name="tagId">群发到的标签的tag_id,若is_to_all值为true,可不填写tag_id;如果groupId和tagId同时填写,优先使用groupId;groupId和tagId最多只能使用一个</param> /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param> /// <param name="type"></param> /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param> /// <param name="sendIgnoreReprint">待群发的文章被判定为转载时,是否继续群发</param> /// <param name="clientmsgid">开发者侧群发msgid,长度限制64字节,如不填,则后台默认以群发范围和群发内容的摘要值做为clientmsgid</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> private static async Task <SendResult> SendGroupMessageByFilterAsync(string accessTokenOrAppId, string groupId, string tagId, string value, GroupMessageType type, bool isToAll = false, bool sendIgnoreReprint = false, string clientmsgid = null, int timeOut = Config.TIME_OUT) { return(await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { string urlFormat = Config.ApiMpHost + "/cgi-bin/message/mass/sendall?access_token={0}"; BaseGroupMessageDataByFilter baseData = null; BaseGroupMessageByFilter filter = null; if (!groupId.IsNullOrEmpty()) { filter = new GroupMessageByGroupId() { group_id = groupId, is_to_all = isToAll, }; } else { filter = new GroupMessageByTagId() { tag_id = tagId, is_to_all = isToAll, }; } switch (type) { case GroupMessageType.image: baseData = new GroupMessageByFilter_ImageData() { filter = filter, image = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "image" }; break; case GroupMessageType.voice: baseData = new GroupMessageByFilter_VoiceData() { filter = filter, voice = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "voice" }; break; case GroupMessageType.mpnews: baseData = new GroupMessageByFilter_MpNewsData() { filter = filter, mpnews = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpnews" }; break; case GroupMessageType.video: baseData = new GroupMessageByFilter_MpVideoData() { filter = filter, mpvideo = new GroupMessageByGroupId_MediaId() { media_id = value }, msgtype = "mpvideo" }; break; case GroupMessageType.wxcard: baseData = new GroupMessageByFilter_WxCardData() { filter = filter, wxcard = new GroupMessageByGroupId_WxCard() { card_id = value }, msgtype = "wxcard" }; break; case GroupMessageType.text: baseData = new GroupMessageByFilter_TextData() { filter = filter, text = new GroupMessageByGroupId_Content() { content = value }, msgtype = "text" }; break; default: throw new Exception("参数错误。"); //break; } baseData.send_ignore_reprint = sendIgnoreReprint ? 0 : 1;//待群发的文章被判定为转载时,是否继续群发 baseData.clientmsgid = clientmsgid; return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync <SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut); }, accessTokenOrAppId)); }
/// <summary> /// Wysyła wiadomość czatu do danej grupy /// </summary> /// <param name="charData"></param> /// <param name="groupSlot"></param> /// <param name="messageType"></param> /// <param name="message"></param> public static void SendPlayerMessageGroup(Character charData, int groupSlot, GroupMessageType messageType, string message) { GroupMember groupPlayerData = Groups.Library.GetPlayerGroupBySlot(charData.PlayerHandle, groupSlot); if (groupPlayerData == null) { Ui.ShowError(charData.PlayerHandle, "Nie posiadasz grupy o takim slocie."); return; } Group groupData = Groups.Library.GetGroupData(groupPlayerData.GroupId); if (groupData == null) { Ui.ShowError(charData.PlayerHandle, "Wystąpił problem z pobraniem informacji o grupie."); return; } switch (messageType) { case GroupMessageType.Ic: if (!Groups.Library.DoesGroupHasPerm(groupData.Id, Permissions.SharedChatIc)) { Ui.ShowError(charData.PlayerHandle, "Grupa nie posiada dostępu do radia IC."); return; } if (!Groups.Library.DoesPlayerHasPerm(charData.PlayerHandle, groupData.Id, Permissions.SharedChatIc)) { Ui.ShowError(charData.PlayerHandle, "Nie posiadasz uprawnień do użycia radia IC."); return; } Groups.Library.SendGroupIcMessage(groupData.Id, $"{Player.GetPlayerIcName(charData)}: {Command.UpperFirst(message)}"); SendPlayerLocalMessage(charData, Command.UpperFirst(message), "mówi (radio)", charData.PlayerHandle); break; case GroupMessageType.Ooc: if (!Groups.Library.DoesGroupHasPerm(groupData.Id, Permissions.SharedChatOoc)) { Ui.ShowError(charData.PlayerHandle, "Grupa nie posiada dostępu do radia OOC."); return; } if (!Groups.Library.DoesPlayerHasPerm(charData.PlayerHandle, groupData.Id, Permissions.SharedChatOoc)) { Ui.ShowError(charData.PlayerHandle, "Nie posiadasz uprawnień do użycia radia OOC."); return; } if (groupData.ChatDisabled) { Ui.ShowError(charData.PlayerHandle, $"Czat OOC w grupie \"{groupData.Name}\" został wyłączony."); return; } Groups.Library.SendGroupOocMessage(groupData.Id, $"{Player.GetPlayerOocName(charData, true)}: {Command.UpperFirst(message)}"); break; default: return; } }