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(); } }
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; } }
private void SendProfMsg() { string errMsg = null; if (!WxSimulater.CheckMsgList(profMsg, out errMsg)) { warnMsg.Text = errMsg; return; } Response.Redirect("Submitting.aspx"); }
//登陆,得到 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); } }
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 } }