1.
登陆,根据用户名和密码登陆到微信公众平台管理页面,获取token,模拟登陆请求地址:http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN,
2.
登陆后,获取用户所有的信息,地址:https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&token=,根据前面的token。
3.
发送消息,地址:https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN,这个只支持文本发送。fromfakeid是用户的id
说明,在获取所有用户信息的,用的是循环页数,设置最大的页数(1000000)配置
/// <summary>
/// 发送
/// </summary>
///
<param name="sender"></param>
/// <param
name="e"></param>
protected void Button1_Click(object
sender, EventArgs e)
{
lblMsg.Text = "";
Button1.Enabled = false;
if (TextBox1.Text.Trim() == "")
{
lblMsg.Text = "内容不能为空!";
return;
}
string username = TextBox2.Text.Trim();
string
password = TextBox3.Text.Trim();
Wx_MoniLoGin wx = new
Wx_MoniLoGin();
//登陆,获取Token.
bool flag =
wx.ExecLogin(username, password);
if (flag)
{
//登陆成功后,去获取fakeid,所有的用户唯一标识
Dictionary<string, string> di = wx.SubscribeMP();
if (di != null)
{
_log.Info("总数:" +
di.Count);
foreach (string key in di.Keys)
{
_log.Info("key 值是" + key.ToString());
bool re = false;
re =
wx.SendMessage(TextBox1.Text.Trim(), key.ToString());
if (re)
{
lblMsg.Text
+= key.ToString() + "发送成功!";
}
else
{
lblMsg.Text += key.ToString() +
"发送失败!";
}
}
}
}
Button1.Enabled = true;
}
/// <summary>
/// 执行登陆操作
/// </summary>
/// <param name="name"></param>
/// <param
name="pass"></param>
/// <returns></returns>
public bool ExecLogin(string name, string pass)
{
bool result = false;
string password =
GetMd5Str32(pass).ToUpper();
string padata = "username=" + name +
"&pwd=" + password + "&imgcode=&f=json";
string url =
"http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN ";//请求登录的URL
try
{
CookieContainer cc = new
CookieContainer();//接收缓存
byte[] byteArray = Encoding.UTF8.GetBytes(padata);
// 转化
HttpWebRequest webRequest2 = (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;
webRequest2.Referer = "https://mp.weixin.qq.com/";
Stream
newStream = webRequest2.GetRequestStream(); //返回用于将数据写入 Internet 资源的
Stream。
// Send the data.
newStream.Write(byteArray, 0,
byteArray.Length); //写入参数
newStream.Close();
HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse();
StreamReader sr2 = new StreamReader(response2.GetResponseStream(),
Encoding.Default);
string text2 = sr2.ReadToEnd();
//此处用到了newtonsoft来序列化
WeiXinRetInfo retinfo =
Newtonsoft.Json.JsonConvert.DeserializeObject<WeiXinRetInfo>(text2);
string token = string.Empty;
if
(retinfo.Redirect_url.Length > 0)
{
token = retinfo.Redirect_url.Split(new char[] { ‘&‘ })[2].Split(new char[] {
‘=‘ })[1].ToString();//取得令牌
LoginInfo.LoginCookie = cc;
LoginInfo.CreateDate = DateTime.Now;
LoginInfo.Token =
token;
result = true;
}
}
catch (Exception ex)
{
throw new Exception(ex.StackTrace);
}
return result;
}
/// <summary>
/// 获取所有用户fakeid
///
</summary>
/// <returns></returns>
public Dictionary<string, string> SubscribeMP()
{
try
{
Dictionary<string,string>
di=new Dictionary<string,string>();
CookieContainer
cookie = null;
string token = null;
cookie
= LoginInfo.LoginCookie;//取得cookie
token =
LoginInfo.Token;//取得token
int pageID =
Util.TrimIntNull(ConfigurationManager.AppSettings["WXMaxPageID"].ToString());
for (int j = 0; j < pageID; j++)
{
string Url =
"https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&token=" + token
+ "&lang=zh_CN&pagesize=10&pageidx=" + j +
"&type=0&groupid=0";
HttpWebRequest webRequest2 =
(HttpWebRequest)WebRequest.Create(Url);
webRequest2.CookieContainer = cookie;
webRequest2.ContentType = "text/html; charset=UTF-8";
webRequest2.Method = "GET";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
webRequest2.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1)
Gecko/20100101 Firefox/4.0.1";
//webRequest2.ContentType
= "application/x-www-form-urlencoded";
HttpWebResponse
response2 = (HttpWebResponse)webRequest2.GetResponse();
StreamReader sr2 = new StreamReader(response2.GetResponseStream(),
Encoding.GetEncoding("UTF-8"));
string text2 =
sr2.ReadToEnd();
#region 解析字符串
string jsonString = "";
int start = text2.IndexOf("friendsList");
int end =
text2.IndexOf(".contacts,");
if (start <= -1 || end <= -1)
{
//没有找到数据
break;
}
jsonString = text2.Substring(start, end - start);
if (jsonString != "")
{
int c = jsonString.IndexOf("contacts");
jsonString = jsonString.Substring(c, jsonString.Length - c - 1);
jsonString = "{\"" + jsonString;
JObject
jo = (JObject)JsonConvert.DeserializeObject(jsonString);
if (jo["contacts"] != null)
{
int k = (jo["contacts"]).AsEnumerable().Count();
if (k > 0)
{
for (int i = 0; i < k; i++)
{
string id =
jo["contacts"][i]["id"].ToString();
string nick_name = jo["contacts"][i]["nick_name"].ToString();
//fackID1.Add(id);
di.Add(id, nick_name);
}
}
else
{
break;
}
}
}
else
{
break;
}
#endregion
}
return di;
}
catch (Exception ex)
{
_log.Error(ex);
}
return null;
}
/// <summary>
/// 发送文本消息
/// </summary>
/// <param name="Message"></param>
/// <param
name="fakeid"></param>
///
<returns></returns>
public bool SendMessage(string
Message, string fakeid)
{
bool result = false;
CookieContainer cookie = null;
string token = null;
cookie = LoginInfo.LoginCookie;//取得cookie
token =
LoginInfo.Token;//取得token
string strMsg =
System.Web.HttpUtility.UrlEncode(Message); //对传递过来的信息进行url编码
string padate =
"type=1&content=" + strMsg + "&error=false&tofakeid=" + fakeid +
"&token=" + token + "&ajax=1";
string url =
"https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN";
byte[] byteArray = Encoding.UTF8.GetBytes(padate); //
转化
HttpWebRequest webRequest2 = (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";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
webRequest2.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101
Firefox/4.0.1";
webRequest2.ContentType =
"application/x-www-form-urlencoded";
webRequest2.ContentLength =
byteArray.Length;
Stream newStream =
webRequest2.GetRequestStream();
// Send the data.
newStream.Write(byteArray, 0, byteArray.Length); //写入参数
newStream.Close();
HttpWebResponse response2 =
(HttpWebResponse)webRequest2.GetResponse();
StreamReader sr2 =
new StreamReader(response2.GetResponseStream(), Encoding.Default);
string text2 = sr2.ReadToEnd();
_log.Info(text2);
if (text2.Contains("ok"))
{
result = true;
}
return result;
}
相关配置说明:
<!--微信查询用户信息的最大页数-->
<add key="WXMaxPageID"
value="1000000"/>
相关资料地址:
http://blog.csdn.net/zhangzhilai8/article/details/9213517