zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#实现微信公众号群发消息(解决一天只能发一次的限制)实例分享

c#实例消息微信 实现 解决 分享 限制
2023-06-13 09:15:05 时间

总体思路:

1.首先必须要在微信公众平台上申请一个公众号。

2.然后进行模拟登陆。(由于我对http传输原理和编程不是特别懂,在模拟登陆的地方,不是特别清楚,希望有大神指教)

3.模拟登陆后会获得一个token(令牌)和cookie。

4.因为模拟登陆后相当于就进入了微信公众平台,在这个里面就可以抓取到需要的数据,如公众好友的昵称,fakeId。其中的fakeid非常重要,因为传输数据必须要知道对方的fakeid。

5.知道对方的fakeid就可以进行数据的发送了。

不过里面还有一些小问题,希望有人继续修改和讨论!也有人说这样会被封号,所以请谨慎操作
讲一下我项目里面的主要内容
1.WeiXinLogin.cs类是用来执行登陆功能的

复制代码代码如下:

//对密码进行MD5加密
 staticstringGetMd5Str32(stringstr)
   {
       MD5CryptoServiceProvidermd5Hasher=newMD5CryptoServiceProvider();
       //Converttheinputstringtoabytearrayandcomputethehash. 
       char[]temp=str.ToCharArray();
       byte[]buf=newbyte[temp.Length];
       for(inti=0;i<temp.Length;i++)
       {
           buf[i]=(byte)temp[i];
       }
       byte[]data=md5Hasher.ComputeHash(buf);
       //CreateanewStringbuildertocollectthebytes 
       //andcreateastring. 
       StringBuildersBuilder=newStringBuilder();
       //Loopthrougheachbyteofthehasheddata  
       //andformateachoneasahexadecimalstring. 
       for(inti=0;i<data.Length;i++)
       {
           sBuilder.Append(data[i].ToString("x2"));
       }
       //Returnthehexadecimalstring. 
       returnsBuilder.ToString();
   }
//执行登陆操作
   publicstaticboolExecLogin(stringname,stringpass)
   {
       boolresult=false;
       stringpassword=GetMd5Str32(pass).ToUpper();
       stringpadata="username="+name+"&pwd="+password+"&imgcode=&f=json";
       stringurl="http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN";//请求登录的URL
       try
       {
           CookieContainercc=newCookieContainer();//接收缓存
           byte[]byteArray=Encoding.UTF8.GetBytes(padata);//转化
           HttpWebRequestwebRequest2=(HttpWebRequest)WebRequest.Create(url); //新建一个WebRequest对象用来请求或者响应url
           webRequest2.CookieContainer=cc;                                     //保存cookie 
           webRequest2.Method="POST";                                         //请求方式是POST
           webRequest2.ContentType="application/x-www-form-urlencoded";      //请求的内容格式为application/x-www-form-urlencoded
           webRequest2.ContentLength=byteArray.Length;
           StreamnewStream=webRequest2.GetRequestStream();          //返回用于将数据写入Internet资源的Stream。
           //Sendthedata.
           newStream.Write(byteArray,0,byteArray.Length);   //写入参数
           newStream.Close();
           HttpWebResponseresponse2=(HttpWebResponse)webRequest2.GetResponse();
           StreamReadersr2=newStreamReader(response2.GetResponseStream(),Encoding.Default);
           stringtext2=sr2.ReadToEnd();
           //此处用到了newtonsoft来序列化
           WeiXinRetInforetinfo=Newtonsoft.Json.JsonConvert.DeserializeObject<WeiXinRetInfo>(text2);
           stringtoken=string.Empty;
           if(retinfo.ErrMsg.Length>0)
           {
               token=retinfo.ErrMsg.Split(newchar[]{"&"})[2].Split(newchar[]{"="})[1].ToString();//取得令牌
               LoginInfo.LoginCookie=cc;
               LoginInfo.CreateDate=DateTime.Now;
               LoginInfo.Token=token;
               result=true;
           }
       }
       catch(Exceptionex)
       {
           thrownewException(ex.StackTrace);
       }
       returnresult;
   }
   publicstaticclassLoginInfo
   {
       ///<summary>
       ///登录后得到的令牌
       ///</summary>       
       publicstaticstringToken{get;set;}
       ///<summary>
       ///登录后得到的cookie
       ///</summary>
       publicstaticCookieContainerLoginCookie{get;set;}
       ///<summary>
       ///创建时间
       ///</summary>
       publicstaticDateTimeCreateDate{get;set;}
   }

2.在WeiXin.cs类中实现发送数据
复制代码代码如下:

publicstaticboolSendMessage(stringMessage,stringfakeid)
   {
       boolresult=false;
       CookieContainercookie=null;
       stringtoken=null;
       cookie=WeiXinLogin.LoginInfo.LoginCookie;//取得cookie
       token= WeiXinLogin.LoginInfo.Token;//取得token
       stringstrMsg=System.Web.HttpUtility.UrlEncode(Message); //对传递过来的信息进行url编码
       stringpadate="type=1&content="+strMsg+"&error=false&tofakeid="+fakeid+"&token="+token+"&ajax=1";
       stringurl="https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN";
       byte[]byteArray=Encoding.UTF8.GetBytes(padate);//转化
       HttpWebRequestwebRequest2=(HttpWebRequest)WebRequest.Create(url);
       webRequest2.CookieContainer=cookie;//登录时得到的缓存
       webRequest2.Referer="https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token="+token+"&fromfakeid="+fakeid+"&msgid=&source=&count=20&t=wxm-singlechat&lang=zh_CN";
       webRequest2.Method="POST";
       webRequest2.UserAgent="Mozilla/5.0(WindowsNT5.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1";
       webRequest2.ContentType="application/x-www-form-urlencoded";
       webRequest2.ContentLength=byteArray.Length;
       StreamnewStream=webRequest2.GetRequestStream();
       //Sendthedata.           
       newStream.Write(byteArray,0,byteArray.Length);   //写入参数   
       newStream.Close();
       HttpWebResponseresponse2=(HttpWebResponse)webRequest2.GetResponse();
       StreamReadersr2=newStreamReader(response2.GetResponseStream(),Encoding.Default);
       stringtext2=sr2.ReadToEnd();
       if(text2.Contains("ok"))
       {
           result=true;
       }
       returnresult;
   }

3.SendMessage.aspx.cs中主要实现获取fakeid
复制代码代码如下:
publicstaticArrayListSubscribeMP()
   {
       try
       {
           CookieContainercookie=null;
           stringtoken=null;
           cookie=WeiXinLogin.LoginInfo.LoginCookie;//取得cookie
           token=WeiXinLogin.LoginInfo.Token;//取得token
           /*获取用户信息的url,这里有几个参数给大家讲一下,1.token此参数为上面的token2.pagesize此参数为每一页显示的记录条数
           3.pageid为当前的页数,4.groupid为微信公众平台的用户分组的组id,当然这也是我的猜想不一定正确*/
           stringUrl="https://mp.weixin.qq.com/cgi-bin/contactmanagepage?t=wxm-friend&token="+token+"&lang=zh_CN&pagesize=10&pageidx=0&type=0&groupid=0";
           HttpWebRequestwebRequest2=(HttpWebRequest)WebRequest.Create(Url);
           webRequest2.CookieContainer=cookie;
           webRequest2.ContentType="text/html;charset=UTF-8";
           webRequest2.Method="GET";
           webRequest2.UserAgent="Mozilla/5.0(WindowsNT5.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1";
           webRequest2.ContentType="application/x-www-form-urlencoded";
           HttpWebResponseresponse2=(HttpWebResponse)webRequest2.GetResponse();
           StreamReadersr2=newStreamReader(response2.GetResponseStream(),Encoding.Default);
           stringtext2=sr2.ReadToEnd();
           MatchCollectionmc;
           //由于此方法获取过来的信息是一个html网页所以此处使用了正则表达式,注意:(此正则表达式只是获取了fakeid的信息如果想获得一些其他的信息修改此处的正则表达式就可以了。)
            Regexr=newRegex("\"fakeId\"\\s\\:\\s\"\\d+\"");//定义一个Regex对象实例
           mc=r.Matches(text2);
           Int32friendSum=mc.Count;         //好友总数
           stringfackID="";
           ArrayListfackID1=newArrayList();
           for(inti=0;i<friendSum;i++)
           {
               fackID=mc[i].Value.Split(newchar[]{":"})[1];
               fackID=fackID.Replace("\"","").Trim();
               fackID1.Add(fackID);
           }
           returnfackID1;
  }
       catch(Exceptionex)
       {
           thrownewException(ex.StackTrace);
       }
   }