Пример #1
0
        /// <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();
            }
        }
Пример #2
0
        /// <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);
 }
Пример #5
0
        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);
        }
Пример #6
0
        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;
                    }
                }
            }
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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));
        }
Пример #11
0
        /// <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);
        }
Пример #12
0
        /// <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));
        }
Пример #13
0
        /// <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));
        }
Пример #14
0
 /// <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));
 }
Пример #15
0
        /// <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));
        }
Пример #16
0
 /// <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));
 }
Пример #17
0
        /// <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));
        }
Пример #18
0
        /// <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));
        }
Пример #19
0
        /// <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));
        }
Пример #20
0
        /// <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));
        }
Пример #21
0
        /// <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);
        }
Пример #22
0
        /// <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));
        }
Пример #23
0
        /// <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));
        }
Пример #24
0
        /// <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;
            }
        }