Esempio n. 1
0
    protected void Page_Load(object sender, EventArgs e)
    {
        string ErrMsg = null;

        profMsg = Profile.ProfileMsg.MsgList;
        if (!WxSimulater.CheckMsgList(profMsg, out ErrMsg))
        {
            //maybe a attack!
            FormsAuthentication.SignOut();
            Response.Redirect("../Account/Login.aspx");
        }

        uidUser = Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString();
        logFile = Server.MapPath(string.Format("~/UploadedImages/{0}/log.txt", uidUser));
        if (!IsPostBack)
        {
            WxSimulateWebHelper.UserDirectory.Creat(Server.MapPath(string.Format("~/UploadedImages/{0}", uidUser)), User.Identity.Name);

            divProcMsg.InnerHtml = string.Empty;

            Thread th = new Thread(SubmitMsg);
            th.IsBackground = true;
            th.Start();
        }
    }
Esempio n. 2
0
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        Guid uidUser = (Guid)Membership.GetUser(User.Identity.Name).ProviderUserKey;
        //首先判断是否已存在该公众号
        var    db         = Database.Open();
        string addUid     = Base64.base64Decode(hfUid.Value);
        string addPw      = Base64.base64Decode(hfPw.Value);
        string addImgCode = Base64.base64Decode(hfImgCode.Value);
        bool   isExist    = db.WxPubUsersDB.Exists(db.WxPubUsersDB.pubAccount == addUid &&
                                                   db.WxPubUsersDB.uidUser == uidUser);

        if (isExist)
        {
            warnAdd.Text = "已存在该公众号!若要修改请先删除!";
            return;
        }

        //检查账号是否能正常登陆
        WxPublicUser usr    = WxSimulater.ExecLogin(addUid, addPw, addImgCode);
        string       retMsg = WxSimulater.ParseLoginRetInfo(usr.LoginRetInfo);

        switch (usr.LoginRetInfo.ErrCode)
        {
        case 65201:
        case 65202:
        case 0:
            //登陆成功后,可以添加到数据库
            try
            {
                db.WxPubUsersDB.Insert(uidUser: uidUser, pubAccount: addUid, pubPw: addPw, pubName: usr.User_name);
                warnAdd.Text    = "添加成功";
                hfUid.Value     = "";
                hfPw.Value      = "";
                hfImgCode.Value = "";
                gvUserList.DataBind();
            }
            catch (Exception ex)
            {
                warnAdd.Text = "添加失败,无法保存到数据库中<br />" + ex.Message;
            }
            break;

        case -6:
        case -32:
            warnAdd.Text       = "请输入图中的验证码";
            imImgCode.ImageUrl = "https://mp.weixin.qq.com/cgi-bin/[email protected]&r=" + DateTime.Now.Ticks;
            divImgCode.Visible = true;
            break;

        default:
            warnAdd.Text = retMsg;
            break;
        }
    }
Esempio n. 3
0
    private void SendProfMsg()
    {
        string errMsg = null;

        if (!WxSimulater.CheckMsgList(profMsg, out errMsg))
        {
            warnMsg.Text = errMsg;
            return;
        }
        Response.Redirect("Submitting.aspx");
    }
Esempio n. 4
0
        //登陆,得到 WxPublicUser curPubUsr
        private bool TryLogin(DbWaitingTask task, Dictionary <Guid, DictPubUser> dictPubUsers,
                              out WxPublicUser curPubUsr, out string errMsg)
        {
            var    db         = Database.Open();
            string pubAccount = dictPubUsers[task.uidWxPubUsr].pubAccount;
            string pubPw      = dictPubUsers[task.uidWxPubUsr].pubPw;

            logger.Log(string.Format("尝试登陆公众号:{0}", pubAccount));
            curPubUsr = WxSimulater.ExecLogin(pubAccount, pubPw, string.Empty);
            if (curPubUsr.IsLogin())
            {
                logger.Log("登陆成功");
                errMsg = null;
                return(true);
            }
            else
            {
                errMsg = WxSimulater.ParseLoginRetInfo(curPubUsr.LoginRetInfo);
                logger.Log(string.Format("登陆失败,跳过该用户,错误:errCode:{0} {1}", curPubUsr.LoginRetInfo.ErrCode, errMsg));

                int tmpStatCode = 0;
                switch (curPubUsr.LoginRetInfo.ErrCode)
                {
                case -6:
                case -32:
                    tmpStatCode = 1;    //验证码错误
                    break;

                case -2:
                case -3:
                case -4:
                    tmpStatCode = 2;    //密码或账号错误
                    break;

                default:
                    tmpStatCode = 3;    //其他登陆错误
                    break;
                }
                db.SendTask.UpdateBytaskId(taskId: task.taskId,
                                           taskStatus: tmpStatCode,
                                           taskEndTime: DateTime.Now,
                                           taskRetCode: curPubUsr.LoginRetInfo.ErrCode,
                                           taskRetMsg: errMsg);


                return(false);
            }
        }
Esempio 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
            }
        }