1.模拟登录

 public WeiXinRetInfo ExecLogin(string name, string pass)
{
CookieContainer cc = new CookieContainer();//接收缓存
WeiXinRetInfo retinfo = null; try
{
string password = Common.GetMd5Str32(pass).ToUpper(); HttpClientHandler hchandler = new HttpClientHandler()
{
CookieContainer = cc
}; HttpClient hclient = new HttpClient(hchandler);
hclient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36");
hclient.DefaultRequestHeaders.Add("Referer", "https://mp.weixin.qq.com");
//hclient.DefaultRequestHeaders.Add("Host", "mp.weixin.qq.com");
//hclient.DefaultRequestHeaders.Add("ContentType", "application/x-www-form-urlencoded");
//hclient.DefaultRequestHeaders.ExpectContinue = false; HttpContent hcontent = new FormUrlEncodedContent(new Dictionary<string, string>()
{
{"username",name},
{"pwd",password},
{"imgcode",""},
{"f","json"}
}); //https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN
HttpResponseMessage hresponse = hclient.PostAsync(Wx_Const.LOGIN_URL, hcontent).Result; hresponse.EnsureSuccessStatusCode(); string str_response = hresponse.Content.ReadAsStringAsync().Result; retinfo = Newtonsoft.Json.JsonConvert.DeserializeObject<WeiXinRetInfo>(str_response); if (retinfo.base_resp.err_msg.Equals("ok"))
{
string token = retinfo.redirect_url.Split(new char[] { '&' })[].Split(new char[] { '=' })[].ToString();//取得令牌
lgin.CreateDate = DateTime.Now;
lgin.Token = token; string[] strCookies = (string[])hresponse.Headers.GetValues("Set-Cookie");
HttpClientCookies hcckis = new HttpClientCookies();
hcckis.AddCookie(strCookies);
lgin.hcckis = hcckis; lgin.LoginCookie = cc;
}
}
catch (Exception ex)
{
Console.WriteLine(string.Format("ExecLogin Exception[{0}]", ex.Message));
//throw;
} return retinfo;
}

2.新增图文消息(返回msgid),后续发送图文消息是用到

 /// <summary>
/// 新增图文消息
/// </summary>
/// <returns></returns>
public CreateMsgRs AddWeixinImgTextMsg()
{
string str_url_add_appmsg = string.Format("https://mp.weixin.qq.com/cgi-bin/operate_appmsg?t=ajax-response&sub=create&type=10&token={0}&lang=zh_CN", this.lgif.Token); //https://mp.weixin.qq.com/cgi-bin/operate_appmsg?t=ajax-response&sub=create&type=10&token={0}&lang=zh_CN HttpClientHandler httpClientHandler = new HttpClientHandler()
{
CookieContainer = this.lgif.LoginCookie,
}; HttpClient client = new HttpClient(httpClientHandler); client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36"); client.DefaultRequestHeaders.Add("Origin", "https://mp.weixin.qq.com"); client.DefaultRequestHeaders.Add("Referer", string.Format("https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=10&lang=zh_CN&token={0}", this.lgif.Token));
//
//client.DefaultRequestHeaders.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); //client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded")); //client.DefaultRequestHeaders.ty string fileid0 = ""; UploadImgRs uploadImgRs = AddImg(); if (uploadImgRs.base_resp.ErrMsg.Equals("ok"))
{
fileid0 = uploadImgRs.content;
} HttpContent content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
{"token",this.lgif.Token},
{"lang","zh_CN"},
{"f","json"},
{"ajax",""},
{"random","0.9338385944720358"},
{"AppMsgId",""},
{"count",""},
{"title0","张静初出演电影版《三体》 获小说作者肯定"},
{"content0","2015年,被媒体称为中国“科幻元年”,多部科幻片启动了拍摄计划,《三体》当然是最受瞩目的,宣布的开机消息如是说“影片由小说原作者刘慈欣出任监制、游族影业CEO孔二狗担任总制片人、新锐导演张番番历经三年苦心筹备出任影片导演,台前众多国内实力派艺人担纲出演,幕后则由国际团队承担起拍摄、特效等重任,力求将本片打造成一部制作精良、高度还原的史诗级国产科幻片开山之作。”看着这依然模棱两可的说辞,网友们忧心忡忡,去年一片“求不渣”的请求声再起"},
{"digest0","2015年,被媒体称为中国“科幻元年”,多部科幻片启动了拍摄计划,《三体》当然是最受瞩目的"},
{"author0","李晓婕 仲敏"},
{"fileid0",fileid0},//图片文件ID
{"show_cover_pic0",""},
{"shortvideofileid0",""},
{"copyright_type0",""},
{"can_reward0",""},
{"reward_wording0",""},
{"sourceurl0",""},
{"vid",""},
//{"preusername",""}
});
HttpResponseMessage response = client.PostAsync(str_url_add_appmsg, content).Result;
//{"base_resp":{"ret":0,"err_msg":"ok"},"ret":"0","msg":"","appMsgId":204514536}
string s = response.Content.ReadAsStringAsync().Result; CreateMsgRs cmrs = Newtonsoft.Json.JsonConvert.DeserializeObject<CreateMsgRs>(s); return cmrs;
}

3.获取图文列表

 /// <summary>
/// 获取图文消息列表
/// </summary>
/// <returns></returns>
public WeixinImgTextMsg GetImgTextList()
{
WeixinImgTextMsg wxImgText = null; string str_url_get_list = string.Format("https://mp.weixin.qq.com/cgi-bin/appmsg?type=10&action=list&begin=0&count=10&f=json&token={0}&lang=zh_CN&token={0}&lang=zh_CN&f=json&ajax=1&random={1}", this.lgif.Token, "0.18148761289194222"); HttpClientHandler httpClientHandler = new HttpClientHandler()
{
CookieContainer = this.lgif.LoginCookie,
}; HttpClient client = new HttpClient(httpClientHandler); client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36"); HttpResponseMessage response = client.GetAsync(str_url_get_list).Result; string s = response.Content.ReadAsStringAsync().Result; wxImgText = Newtonsoft.Json.JsonConvert.DeserializeObject<WeixinImgTextMsg>(s); return wxImgText; }

4.获取订阅用户

 /// <summary>
/// 获取fakeid
/// </summary>
/// <returns></returns>
public ArrayList SubscribeMP()
{
string token = this.loginInfo.Token; string str_url_sendmsg = string.Format("https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize=10&pageidx=0&type=0&groupid=0&token={0}&lang=zh_CN", token); try
{
HttpClientHandler hchandler = new HttpClientHandler()
{
CookieContainer = this.loginInfo.LoginCookie
}; HttpClient hclient = new HttpClient(hchandler); hclient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36"); HttpResponseMessage response = hclient.GetAsync(str_url_sendmsg).Result; response.EnsureSuccessStatusCode(); string str_response_html = response.Content.ReadAsStringAsync().Result; MatchCollection mc; //由于此方法获取过来的信息是一个【html网页】所以此处使用了正则表达式,注意:(此正则表达式只是获取了fakeid的信息如果想获得一些其他的信息修改此处的正则表达式就可以了。)
Regex r = new Regex("\"id\"\\:\\d+,\"nick_name\""); //定义一个Regex对象实例
mc = r.Matches(str_response_html);
Int32 friendSum = mc.Count; //好友总数 string fackID = ""; ArrayList fackID1 = new ArrayList(); for (int i = ; i < friendSum; i++)
{
//"id":208989515,"nick_name"
fackID = mc[i].Value.Replace(",\"nick_name\"", "").Split(new char[] { ':' })[];
fackID = fackID.Replace("\"", "").Trim();
fackID1.Add(fackID);
} return fackID1;
}
catch (Exception ex)
{
throw new Exception(ex.StackTrace);
}
}

5.发送消息

 /// <summary>
/// 发送消息
/// </summary>
/// <param name="Message"></param>
/// <param name="fakeid"></param>
public SendMsgRs SendWxMessage(Wx_MsgType WxMsgType, string Message, string fakeid, string msgIdOrFileId)
{
SendMsgRs sendMsgRs = new SendMsgRs(); string token = this.loginInfo.Token; string str_url_sendmsg = string.Format("https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&f=json&token={0}&lang=zh_CN", token); try
{
HttpClientHandler hchandler = new HttpClientHandler()
{
CookieContainer = this.loginInfo.LoginCookie
}; //HttpContent hcontent = new FormUrlEncodedContent(new Dictionary<string, string>()
//{
// {"type","1"},
// {"content",Message},
// {"error","false"},
// {"tofakeid",fakeid},
// {"token",token},
// {"ajax","1"},
//}); HttpContent hcontent = new FormUrlEncodedContent(this.GetMsgContentByMsgType(WxMsgType, msgIdOrFileId, Message, fakeid)); HttpClient hclient = new HttpClient(hchandler); hclient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36");
hclient.DefaultRequestHeaders.Add("Referer", string.Format("https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token={0}&fromfakeid={1}&msgid=&source=&count=20&t=wxm-singlechat&lang=zh_CN", token, fakeid)); HttpResponseMessage response = hclient.PostAsync(str_url_sendmsg, hcontent).Result; response.EnsureSuccessStatusCode(); string s = response.Content.ReadAsStringAsync().Result; sendMsgRs = Newtonsoft.Json.JsonConvert.DeserializeObject<SendMsgRs>(s);
}
catch (Exception ex)
{
throw;
}
return sendMsgRs;
}

6.新增图文消息是,需要上传一张封面图片,返回fileid

 /// <summary>
///
/// </summary>
public UploadImgRs AddImg()
{
UploadImgRs uUploadImgRs = new UploadImgRs(); string str_rs = string.Empty; //ticket_id,ticket可从一下地址解析获取
//https://mp.weixin.qq.com/cgi-bin/settingpage?t=setting/index&action=index&token=1985674500&lang=zh_CN
//https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=1437387422
//string ticket_id = "gh_982977c20410";
//string ticket = "62b2f4612b5b2f30583b517a21a1b76ffb8a7711"; string ticket_id = this.lgif.user_name;
string ticket = this.lgif.CurTicket; string str_url_uploadimg = string.Format("https://mp.weixin.qq.com/cgi-bin/filetransfer?action=upload_material&f=json&writetype=doublewrite&groupid=1&ticket_id={0}&ticket={1}&token={2}&lang=zh_CN", ticket_id, ticket, this.lgif.Token); HttpClientHandler httpClientHandler = new HttpClientHandler()
{
CookieContainer = this.lgif.LoginCookie,
}; using (HttpClient client = new HttpClient(httpClientHandler))
{
client.DefaultRequestHeaders.Add("Connection", "keep-alive");
client.DefaultRequestHeaders.Add("Origin", "https://mp.weixin.qq.com");
client.DefaultRequestHeaders.Add("Referer", "https://mp.weixin.qq.com/cgi-bin/filepage?type=2&begin=0&count=12&t=media/img_list&token=" + this.lgif.Token + "&lang=zh_CN");
//client.DefaultRequestHeaders.Add("", "");
//client.DefaultRequestHeaders.Add("", "");
//client.DefaultRequestHeaders.Add("", "");
//client.DefaultRequestHeaders.Add("", "");
client.DefaultRequestHeaders.ExpectContinue = false; client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36"); using (MultipartFormDataContent content = new MultipartFormDataContent())
{
//*******************************************
//*******************************************
//!!!!!!!!!非常重要的地方,致命重要的设置!!!!!!!!!!
//*******************************************
//*******************************************
var boundaryValue = content.Headers.ContentType.Parameters.FirstOrDefault(p => p.Name == "boundary");
boundaryValue.Value = boundaryValue.Value.Replace("\"", String.Empty);
//*******************************************
//*******************************************
//!!!!!!!!!非常重要的地方,致命重要的设置!!!!!!!!!!
//*******************************************
//******************************************* string str_file_path = Environment.CurrentDirectory + @"\ac345982b2b7d0a2f9d24887c9ef76094b369a95.jpg";
FileStream fileStream = File.OpenRead(str_file_path); StringContent sc_id = new StringContent("WU_FILE_0");
sc_id.Headers.Remove("Content-Type");
content.Add(sc_id, "\"id\"");
//content.Add(new StringContent("WU_FILE_0"), "\"id\""); StringContent sc_name = new StringContent("2b5906a9da28784e4a36d6db.jpg");
sc_name.Headers.Remove("Content-Type");
content.Add(sc_name, "\"name\"");
//content.Add(new StringContent("2b5906a9da28784e4a36d6db.jpg"), "\"name\""); StringContent sc_type = new StringContent("image/jpeg");
sc_type.Headers.Remove("Content-Type");
content.Add(sc_type, "\"type\"");
//content.Add(new StringContent("image/jpeg"), "\"type\""); StringContent sc_lastModifiedDate = new StringContent("Thu Mar 19 2015 17:11:58 GMT+0800 (中国标准时间)");
sc_lastModifiedDate.Headers.Remove("Content-Type");
content.Add(sc_lastModifiedDate, "\"lastModifiedDate\"");
//content.Add(new StringContent("Thu Mar 19 2015 17:11:58 GMT+0800 (中国标准时间)"), "\"lastModifiedDate\""); StringContent sc_size = new StringContent(Convert.ToInt32(fileStream.Length).ToString());
sc_size.Headers.Remove("Content-Type");
content.Add(sc_size, "\"size\"");
//content.Add(new StringContent(Convert.ToInt32(fileStream.Length).ToString()), "\"size\""); //***************************
var streamContent = new StreamContent(fileStream); //Content-Disposition: form-data; name="file"; filename="2b5906a9da28784e4a36d6db.jpg"
//Content-Type: image/jpeg
//Content-Disposition: form-data; name="file"; filename="2b5906a9da28784e4a36d6db.jpg"
//Content-Type: image/jpeg
streamContent.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"" + Path.GetFileName(str_file_path) + "\"");
streamContent.Headers.Add("Content-Type", "image/jpeg"); content.Add(streamContent, "file", Path.GetFileName(str_file_path)); HttpResponseMessage response = client.PostAsync(str_url_uploadimg, content).Result; response.EnsureSuccessStatusCode(); string s = str_rs = response.Content.ReadAsStringAsync().Result; uUploadImgRs = Newtonsoft.Json.JsonConvert.DeserializeObject<UploadImgRs>(s);
} //返回结果
//{"base_resp":{"ret":0,"err_msg":"ok"},"location":"bizfile","type":"image","content":"204535433"}
} return uUploadImgRs;
}

以上代码仅是大概流程,又问提的可以留言我.

.Net HttpClient 模拟登录微信公众平台发送消息的更多相关文章

  1. curl 模拟登录微信公众平台带验证码

    这段时间一直写个项目, 从切图到前端到后台都要搞定,真tm累. 今天下午手残,不停用错误的密码去模拟登录微信公众平台,结果后来出现验证码,瞬间悲剧(菜鸟从来没搞过带验证码的). 研究了一下,发现其实很 ...

  2. 微信开发——微信公众平台实现消息接收以及消息的处理(Java版)

    本文主要讲述了如何在微信公众平台实现消息接收以及消息的处理,使用java语言开发,现在把实现思路和代码整理出来分先给兄弟们,希望给他们带来帮助. 温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微 ...

  3. ASP.NET 微信公众平台模板消息推送功能完整开发

    最近公众平台的用户提出了新需求,他们希望当收到新的邮件或者日程的时候,公众平台能主动推送一条提醒给用户.看了看平台提供的接口,似乎只有[模板消息]能尽量满足这一需求,但不得不说微信提供的实例太少,而且 ...

  4. 微信公众号发送消息模板(java)

    这段时间接触公众号开发,写下向用户发送消息模板的接口调用 先上接口代码 public static JSONObject sendModelMessage(ServletContext context ...

  5. Python 微信公众号发送消息

    1. 公众号测试地址 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index 2. ...

  6. 微信公众号发送消息给用户 php

    1.微信公众号 这里得话 一开始先去看了 微信公众号的接口 发现网页授权需要时认证的服务号,一开始想的是那去申请一个认证的服务号岂不是很费事,然后网上搜了搜,发现了还有微信公众号个人测试号这个东西,所 ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(73)-微信公众平台开发-消息管理

    系列目录 前言 回顾上一节,我们熟悉的了解了消息的请求和响应,这一节我们来建立数据库的表,表的设计蛮复杂 你也可以按自己所分析的情形结构来建表 必须非常熟悉表的结果才能运用这张表,这表表的情形涵盖比较 ...

  8. 微信公众平台开发教程Java版(三) 消息接收和发送

    https://www.iteye.com/blog/tuposky-2017429 前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息, ...

  9. Java微信公众平台开发_02_启用服务器配置

    源码将在晚上上传到 github 一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[  Java微信公众平台开发_01_本地服务器映射外网  ] 2.一个微信公众平台账号: 去注册: ...

随机推荐

  1. thrift之TTransport类体系原理及源码详细解析1-类结构和抽象基类

    本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图,如下: 由上面的类 ...

  2. css3 animation 动画属性简介

    animation 动画属性介绍 animation 属性是一个简写属性,用于设置动画属性: 1. animation-name----规定需要绑定到选择器的 keyframe 名称. 语法:anim ...

  3. jQuery版本引发的血案 iframe error 和 checkbox 无法勾选

    问题介绍: 1.由于我们的项目里面用了很多Iframe,在初始话加载的时候页面就会报错.一开始调试很久没找到什么原因,看打印结果页面会被两次load,只能一步步找, 最后发现在document rea ...

  4. swfupload上传

    swfupload多文件异步上传 多文件选择异步上传的原理 传统上:多个文件逐一选.PHP开始处理,循环上 PHP+Flash上:JS调用flash控,Flash批量选取并保持选取所有文件列 swfu ...

  5. ionic框架,快速开发webAPP神器。

    官网地址 http://www.ionicframework.com/ 这个国外框架已经很火了.会使用插件的话更好,例如支付宝支付插件,调用摄像头拍照,二维码扫描,通讯录,文件上传,推送信息等等. 最 ...

  6. phpEXCEL操作全解

    phpExcel中文帮助手册,列举了各种属性,以及常用的操作方法,难得是每一个都用实例加以说明,希望对大家有所帮助. phpExcel中文帮助手册,不可多得的好文章,供大家学习参考. 1.设置exce ...

  7. Android Framework------之Property子系统

    概述 Property是Android系统中一个重要的概念,在Android系统内,主要用于系统配置,以及不同服务间的简单信息分享.比如设备名字,蓝牙名字,编译信息,网络dns地址,以及其他的一些基本 ...

  8. 一个使用CSocket类的网络通信实例

    http://www.cppblog.com/changshoumeng/archive/2010/05/14/115413.html 3.8 一个使用CSocket类的网络通信实例 本例采用CSoc ...

  9. 文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ

    本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个red ...

  10. 第几天 switch做法 杭电

    第几天? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...