示例#1
0
        /// <summary>
        /// 查看现在拥有的多图文信息,主要是为了得到信息的appmsgid
        /// </summary>
        /// <param name="pubUser">登陆后的用户信息</param>
        /// <returns>WxMsgListRetInfo包含了请求返回信息和多图文信息</returns>
        public static WxMsgListRetInfo GetMsgList(WxPublicUser pubUser)
        {
            //请求格式
            //GET /cgi-bin/appmsg?token=1269820950&lang=zh_CN&random=0.9757365568075329&f=json&ajax=1&type=10&action=list&begin=0&count=10 HTTP/1.1
            //Host: mp.weixin.qq.com
            //Connection: keep-alive
            //Accept: application/json, text/javascript, */*; q=0.01
            //X-Requested-With: XMLHttpRequest
            //User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
            //Referer: https://mp.weixin.qq.com/cgi-bin/masssendpage?t=mass/send&token=1269820950&lang=zh_CN
            //Accept-Encoding: gzip,deflate,sdch
            //Accept-Language: zh-CN,zh;q=0.8

            string url = string.Format("https://mp.weixin.qq.com/cgi-bin/appmsg?token={0}&lang={1}&random={2}&f=json&ajax=1&type=10&action=list&begin=0&count=10",
                                       pubUser.Token,
                                       pubUser.Lang,
                                       new Random().NextDouble().ToString());
            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);

            wr.Method          = "GET";
            wr.CookieContainer = pubUser.LoginCookie;
            wr.Accept          = "application/json, text/javascript, */*; q=0.01";
            wr.UserAgent       = UserAgent;
            wr.Referer         = string.Format("https://mp.weixin.qq.com/cgi-bin/masssendpage?t=mass/send&token={0}&lang={1}", pubUser.Token, pubUser.Lang);
            HttpWebResponse  rp      = (HttpWebResponse)wr.GetResponse();
            string           retInfo = new StreamReader(rp.GetResponseStream(), Encoding.UTF8).ReadToEnd();
            WxMsgListRetInfo msgList = Newtonsoft.Json.JsonConvert.DeserializeObject <WxMsgListRetInfo>(retInfo);

            return(msgList);
        }
示例#2
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
            }
        }