Exemplo n.º 1
0
        protected virtual string Execute(string content)
        {
            var        t        = WxMsg.Deserialize(content);
            WxReplyMsg replyMsg = null;

            switch (t.GetType().Name)
            {
            case "TextMsg": replyMsg = DoMsg(OnTextMsg, (TextMsg)t); break;

            case "ImageMsg": replyMsg = DoMsg(OnImageMsg, (ImageMsg)t); break;

            case "VoiceMsg": replyMsg = DoMsg(OnVoiceMsg, (VoiceMsg)t); break;

            case "VideoMsg": replyMsg = DoMsg(OnVideoMsg, (VideoMsg)t); break;

            case "LocationMsg": replyMsg = DoMsg(OnLocationMsg, (LocationMsg)t); break;

            case "LinkMsg": replyMsg = DoMsg(OnLinkMsg, (LinkMsg)t); break;

            case "SubscribeEventMsg": replyMsg = DoMsg(OnSubscribeEventMsg, (SubscribeEventMsg)t); break;

            case "UnSubscribeEventMsg": replyMsg = DoMsg(OnUnSubscribeEventMsg, (UnSubscribeEventMsg)t); break;

            case "EnterEventMsg": replyMsg = DoMsg(OnEnterEventMsg, (EnterEventMsg)t); break;

            case "LocationEventMsg": replyMsg = DoMsg(OnLocationEventMsg, (LocationEventMsg)t); break;

            case "ClickEventMsg": replyMsg = DoMsg(OnClickEventMsg, (ClickEventMsg)t); break;

            case "ViewEventMsg": replyMsg = DoMsg(OnViewEventMsg, (ViewEventMsg)t); break;

            case "ScancodePushEventMsg": replyMsg = DoMsg(OnScancodePushEventMsg, (ScancodePushEventMsg)t); break;

            case "ScancodeWaitmsgEventMsg": replyMsg = DoMsg(OnScancodeWaitmsgEventMsg, (ScancodeWaitmsgEventMsg)t); break;

            case "PicEventMsg": replyMsg = DoMsg(OnPicEventMsg, (PicEventMsg)t); break;

            case "LocationSelectEventMsg": replyMsg = DoMsg(OnLocationSelectEventMsg, (LocationSelectEventMsg)t); break;

            case "BatchJobResultEventMsg": replyMsg = DoMsg(OnBatchJobResultEventMsg, (BatchJobResultEventMsg)t); break;

            case "MasssEndjobFinishEventMsg": replyMsg = DoMsg(OnMasssEndjobFinishEventMsg, (MasssEndjobFinishEventMsg)t); break;

            case "TemplateSendJobfinishEventMsg": replyMsg = DoMsg(OnTemplateSendJobfinishEventMsg, (TemplateSendJobfinishEventMsg)t); break;

            case "WxMsg": replyMsg = DoMsg(OnUnknownMsg, (WxMsg)t); break;

            case "WxEventMsg": replyMsg = DoMsg(OnUnknownEventMsg, (WxEventMsg)t); break;

            default: break;
            }

            if (replyMsg == null)
            {
                return("");
            }
            return(EncryptMsg(replyMsg.ToString()));
        }
Exemplo n.º 2
0
        private void SaveWxMessageToken(WeChatMsgModel model)
        {
            var msg = new WxMsg()
            {
                LastActivityTime = model.CreateTime,
                FromUser         = model.FromUserName,
                MsgType          = model.MsgType,
                Metadata         = model.SerializeToJson(),
                ToUser           = model.ToUserName
            };

            this.OS.TransactionManager.GetSession().SaveOrUpdate(msg);
        }
Exemplo n.º 3
0
 private void SaveProfMsg(int i)
 {
     profMsg[i] = new WxMsg
     {
         Title        = Base64.base64Decode(hfTitle.Value),
         FileId       = hfCoverImgUrl.Value,
         Author       = Base64.base64Decode(hfAuthor.Value),
         SourceUrl    = Base64.base64Decode(hfSourceUrl.Value),
         Digest       = Base64.base64Decode(hfDigest.Value),
         Content      = Base64.base64Decode(hfContent.Value),
         ShowCoverPic = true
     };
 }
Exemplo n.º 4
0
    private void LoadProfMsg(int i)
    {
        WxMsg msg = profMsg[i];

        hfTitle.Value = msg.Title != null?Base64.base64Encode(msg.Title) : string.Empty;

        hfAuthor.Value = msg.Author != null?Base64.base64Encode(msg.Author) : string.Empty;

        hfContent.Value = msg.Content != null?Base64.base64Encode(msg.Content) : string.Empty;

        hfDigest.Value = msg.Digest != null?Base64.base64Encode(msg.Digest) : string.Empty;

        hfSourceUrl.Value = msg.SourceUrl != null?Base64.base64Encode(msg.SourceUrl) : string.Empty;

        hfCoverImgUrl.Value = msg.FileId != null ? msg.FileId : string.Empty;
        CoverImage.ImageUrl = hfCoverImgUrl.Value;

        hfCurMsg.Value = i.ToString();
        BindProfMsg();
    }
Exemplo n.º 5
0
        public void ExecTask(List <WxMsg> msgs)
        {
            //创建公众号账号和密码词典 PubUserDict
            var db = Database.Open();
            List <DbPubUser> pubUsers = db.WxPubUsersDB.FindAllByuidUser(uidUser);
            Dictionary <Guid, DictPubUser> dictPubUsers = new Dictionary <Guid, DictPubUser>(pubUsers.Count);

            foreach (var pubUsr in pubUsers)
            {
                dictPubUsers.Add(pubUsr.uidWxPubUsr, new DictPubUser {
                    pubAccount = pubUsr.pubAccount, pubPw = pubUsr.pubPw
                });
            }

            //获取待执行任务
            List <DbWaitingTask> waitingTasks = db.SendTask.FindAllByuidUserAndtaskStatus(uidUser, 0);
            WxPublicUser         curPubUsr    = null;
            string errMsg = null;

            foreach (var task in waitingTasks)
            {
                // 登陆,得到 WxPublicUser curPubUsr
                if (!TryLogin(task, dictPubUsers, out curPubUsr, out errMsg))
                {
                    continue;
                }

                #region   MsgList
                int          idx     = 1;
                List <WxMsg> newMsgs = new List <WxMsg>();
                WxMsg        newMsg  = null;  //为了不修改Prof的内容
                bool         failMsg = false; //标记是否有失败操作
                //string CntImgUrl = null;
                //string newMsgCnt = null;//暂时保存新的正文内容
                string outFileID = null;
                string ImgPath   = null;
                string ImgUrl    = null;//暂时保存上传后的Url
                foreach (var msg in msgs)
                {
                    logger.Log(string.Format("开始上传第{0}条信息的相关图片", idx));
                    newMsg = new WxMsg(msg);//为了不修改Prof的内容
                    #region   封面图片,得到FileId
                    logger.Log("正在上传封面图片");
                    string coverFileName = msg.FileId.Substring(msg.FileId.LastIndexOf('/') + 1);
                    int    retCode       = WxSimulater.UpCoverImg(curPubUsr, ImgsPath + '\\' + coverFileName, out outFileID, out errMsg);
                    if (retCode != 0 || outFileID == null)
                    {
                        logger.Log(string.Format("上传第条{0}信息的封面图片失败!请选择上传更小的图片!错误码:{1}{2}", idx, retCode, errMsg));
                        failMsg = true;
                        break;
                    }
                    newMsg.FileId = outFileID;
                    logger.Log("上传成功!");
                    #endregion

                    #region   正文图片
                    logger.Log("正在上传正文图片");
                    string strTargetString = newMsg.Content;

                    string strRegex = string.Format(@"<img([^<]+?)src=[\""']([^<]+?)/{0}/(?<fileName>([^<]+?))[\""']([^<]*?)>", uidUser.ToString());
                    Dictionary <string, string> dictCntImgs = new Dictionary <string, string>();//fileName as key, and Url as value

                    Regex matchImgs = new Regex(strRegex, RegexOptions.IgnoreCase);
                    foreach (Match myMatch in matchImgs.Matches(strTargetString))
                    {
                        if (myMatch.Success)
                        {
                            ImgPath = myMatch.Groups["fileName"].Value;
                            if (WxSimulater.UpCntImg(curPubUsr, Path.Combine(this.ImgsPath, ImgPath), out ImgUrl, out errMsg) && ImgUrl != null)
                            {
                                dictCntImgs.Add(ImgPath, ImgUrl);
                            }
                            else
                            {
                                logger.Log("上传正文图片出错:" + errMsg);
                                failMsg = true;
                                break;
                            }
                        }
                    }

                    if (failMsg)
                    {
                        break;
                    }

                    Regex  replaceImgs           = null;
                    string strMatchRegexTemplate = @"<img([^<]+?)src=[\""']([^<]+?)/{0}/{1}[\""']([^<]*?)>";
                    string strReplaceTemplate    = @"<img src=""{0}"" style=""float:none;"" />";
                    foreach (var img in dictCntImgs)
                    {
                        replaceImgs     = new Regex(string.Format(strMatchRegexTemplate, uidUser.ToString(), img.Key), RegexOptions.IgnoreCase);
                        strTargetString = replaceImgs.Replace(strTargetString, string.Format(strReplaceTemplate, img.Value));
                    }

                    newMsg.Content = strTargetString;//保存替换后的正文
                    logger.Log("上传成功");
                    #endregion

                    newMsgs.Add(newMsg);
                    idx++;//上传下一条
                }
                if (failMsg)
                {
                    logger.Log("该用户上传图片失败!跳过该用户!");
                    db.SendTask.UpdateBytaskId(taskId: task.taskId,
                                               taskStatus: 4, //上传图片错误
                                               taskEndTime: DateTime.Now,
                                                              //taskRetCode: ,
                                               taskRetMsg: errMsg);

                    continue;
                }

                logger.Log("开始上传图文信息的正文内容");
                int tmpCode = WxSimulater.UpMultiMsg(curPubUsr, newMsgs, out errMsg);
                if (tmpCode != 0)
                {
                    logger.Log("上传正文失败!跳过该用户!");
                    db.SendTask.UpdateBytaskId(taskId: task.taskId,
                                               taskStatus: 5,                  //上传正文内容失败
                                               taskEndTime: DateTime.Now,
                                               taskRetCode: tmpCode,
                                               taskRetMsg: errMsg);
                    continue;
                }
                logger.Log("上传成功!");
                #endregion

                #region 开始群发
                logger.Log("获取公众平台的APP_ID");
                WxMsgListRetInfo newUploadMsg = WxSimulater.GetMsgList(curPubUsr);
                logger.Log("开始群发");
                tmpCode = -1;
                tmpCode = WxSimulater.SendMsg(curPubUsr, newUploadMsg.app_msg_info.item[0].app_id.ToString(), out errMsg);
                int taskStat = 0;
                switch (tmpCode)
                {
                case 0:
                    logger.Log("群发发送成功!");
                    taskStat = 100;
                    break;

                case 64004:    //今天的群发数量已到,无法群发
                    logger.Log("今天该公众号的群发数量已超过微信限制");
                    taskStat = 99;
                    break;

                case 67008:    //消息中可能含有具备安全风险的链接,请检查
                    logger.Log("消息中可能含有具备安全风险的链接,请检查");
                    taskStat = 98;
                    break;

                case -6:    //请输入验证码
                    logger.Log("发送信息时需要人工输入验证码,无法发送!");
                    taskStat = 97;
                    break;

                default:
                    logger.Log("发送失败,未知代码");
                    taskStat = 96;
                    break;
                }
                db.SendTask.UpdateBytaskId(taskId: task.taskId,
                                           taskStatus: taskStat,
                                           taskEndTime: DateTime.Now,
                                           taskRetCode: tmpCode,
                                           taskRetMsg: errMsg);
                //"{\"ret\":\"64004\", \"msg\":\"not have masssend quota today!\"}"
                //if (r.ret && r.ret == "0") {
                //  i.suc("发送成功"), t && t(r);
                //  return;
                //}
                //r.ret && r.ret == "64004" ? i.err("今天的群发数量已到,无法群发") :
                //r.ret && r.ret == "67008" ? i.err("消息中可能含有具备安全风险的链接,请检查") :
                //r.ret == "-6" ? i.err("请输入验证码") : i.err("发送失败"), n && n(r);
                #endregion
            }
        }