微信主动推送文本消息C#

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"/>

DemoWXPush完整项目下载地址

相关资料地址:

http://blog.csdn.net/zhangzhilai8/article/details/9213517

微信主动推送文本消息C#,布布扣,bubuko.com

时间: 2024-10-13 16:06:49

微信主动推送文本消息C#的相关文章

微信客服消息群发微信定时群发微信主动推送客服消息

功能介绍:针对微信新关注粉丝的无限推送,在粉丝关注公众号之后,48小时之内,可以定时自动推送文本或者图文给他. 使用说明: 在微信营销系统后台设置好要定时推送的消息,可以设置文本或者图文,先编辑好要推送的内容,发送的时间,比如粉丝关注后5分钟,发送一个图文,10分钟,再发送另一个图文. 只要设置好内容.推送时间,到时间就会自动推送.可以关注下面的公众号体验效果. 需要使用该系统或者源码的可以联系 851 488 243 具体效果可以查看下图 原文地址:https://www.cnblogs.co

C#微信公众号开发系列教程五(接收事件推送与消息排重)

微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) 在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型.包括:关注/取消关注事件,扫描带参数二维码事件,上报地理位置事件,自定义菜

.net开发微信公众号(3)-接收微信推送的消息

接收微信推送的消息 一.消息发送发式 用户发送的消息会被微信服务器转发到开发者服务器上(启动开发者模式时填的那个URL),开发者服务器接收到消息并处理完成会把消息再发回给微信服务器,再由微信服务器推送给用户.流程也非常简单. 二.接收消息分类 根据微信官方的文档说明,把接收消息分成两类: 1.普通消息 2.事件消息 事件消息除了这6种以为,还有一种是发送模板消息后返回的结果. 三.消息处理 接下来我们看下这些消息如何处理. 首先,做消息有效性验证.上一篇我们已经写了验证的方法,在这里直接用就行了

微信推送短消息

推送短消息:按照级别由低到高>> 公众号---->已认证公众号----->服务号----->已认证服务号------>企业号 前提:基于微信认证服务号 主动推送微信消息 1,关注服务号 2.在沙箱环境小操作 实现步骤: 1.注册账号 appID appsecret a.在网页授权获取用户基本信息, IP或者域名,正式环境必须是域名 b.关注公众号(已认证的服务号) c.生成二维码,用户扫描    此时,将用户信息发送给微信,微信再将数据发送给设置redirect_url

微信公共平台开发-(.net实现)3--发送文本消息

最近,项目这边比较忙,没来得及续写,哎,先吐吐槽吧,在这个周六还得来上班,以后每个周六多要上,一天的滋味真有点受不鸟呀.还不习惯ing... 嗯,别的不说了现在开始接着上次http://www.cnblogs.com/QLJ1314/p/3838058.html  获取ACCESSTOKEN,开始吧,接下来我们就写发送文本消息吧. 首先建立一个微信消息实体类. 1 class wxmessage 2 { 3 public string FromUserName { get; set; } 消息发

(转)移动端主动推送消息原理

转:https://www.zhihu.com/question/19628406/answer/77205019 一.服务端主动推送消息到客户端过程 作者:谢泽帆   李琰链接:https://www.zhihu.com/question/24938934/answer/85359794来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 服务端主动推送到客户端是怎么一个过程 目前服务端给客户端推送,普遍做法是客户端与服务端维持一个长连接,客户端定时向服务端发送心跳以

开发版速达微信订单推送

在开发如何进行微信推送订单信息之前,我们需要先了解下微信的一些规定和技术: 公众平台服务号.订阅号.企业号的相关说明 1.订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息: 2.服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月可群发4条消息: 3.企业号:主要用于公司内部通讯使用,需要先验证身份才可以关注成功企业号. 温馨提示: 1)如果想简单的发送消息,达到宣传效果,建议可选择订阅号: 2)如果想用公众号获得更多的功能,例如开通微

SpringBoot2.x服务器端主动推送技术

一.服务端推送常用技术介绍 服务端主流推送技术:websocket.SSE等 1.客户端轮询:ajax定时拉取后台数据 js   setInterval定时函数  +  ajax异步加载  定时向服务器发送请求 服务器压力会较大 2.服务端主动推送:websocket<推荐使用> 全双工即双向通讯,本质上是一个额外的TCP连接,建立和关闭时握手使用http协议,其他数据传输不使用http协议,更加复杂一些,适用于需要进行复杂双向数据通讯的场景,支持大部分主流浏览器. 开发成本较高,适用性较好,

使用SignalR从服务端主动推送警报日志到各种终端(桌面、移动、网页)

原文:使用SignalR从服务端主动推送警报日志到各种终端(桌面.移动.网页) 微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 使用SignalR从服务端主动推送警报日志到各种终端(桌面.移动.网页) 阅读导航 本文背景 代码实现 本文参考 1.本文背景 工作上有个业务,.Net Core WebAPI作为服务端,需要将运行过程中产生的日志分类,并实时推送到各种终端进行报警,终端有桌面(WPF).移动(Xamarin.Forms).网站(