标签:
微信墙
上一篇文章中已经用PHP搭建了一个微信墙获取信息的服务器,我这里使用微软的singnalr搭建一个客户端,singnalr是一个为开发者开发实时应用的 一个库文件,支持windows server 2008 r2+,win7,win8 windows azure,可以使用iis8托管,iis7必须支持 extensionless URLs 。下图是浏览器支持情况
其实据我所知,你可以再微软的任何技术中使用singnalr比如wpf,winform等等中都可以,只不过要引入相应的dll文件,而且可以在高强度的环境下使用singnalr,比如股市网站实时绘制波形图。更多信息请直接去官网查看,传送门 。项目源码 传送门
准备工作
首先创建一个asp.net mvc 5 的项目编码工作
我在项目中创建了微信常用的模拟操作,如下图,一会和微信打交道的操作都有他们完成,源码在github上面
我们首先要更改Home下的index,更换email和password即可登录微信,登陆成功会跳转到GetInfo,这里之所以会单独初始化一下是为了防止以后每次去微信拿数据都要登录一遍来获取token和cookie,如果单位时间内登录次数过多微信会有一个二维码的校验,这个就十分麻烦了,所以我们登录一次,将cookie和token放到缓存中,以后从缓存中拿数据
public ActionResult Index()
{
if (WeiXinLogin.ExecLogin("email", "password"))
{
return RedirectToAction("GetInfo");
}
return View();
}
下面的方法是从mongo中拿到我们PHPserver存放进去的数据,同时检测有没有下载这个人的头像,如果没有下载,就去下载,其中判断函数和下载函数直接去源码中查看即可,我都放到了HomeController 里面,没有进行进一步封装
public ActionResult GetInfo()
{
MongoUtil mongo = new MongoUtil();
var colloction = mongo.getCollection("message");
var res = colloction.FindAll().ToList();
foreach (var item in res)
{
if (!IsExitImage(item.fakeid))
{
DownImage(item.fakeid);
}
}
return View(res);
}
一切顺利的话我们访问/Home/Index 微信模拟登陆登陆成功,页面就会重定向到/Home/GetInfo 这里,我是用了bootstrap简单的写了一个页面,时间戳没有处理直接输出了如下图
然后我们在根目录下创建一个Startup文件用来在程序运行之处初始化SignalR,代码如下
public class WeChatHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addData(name, message);
}
}
接下来我们需要一个action创建一个代理去调用hub,将信息推送出去,代码如下
[assembly: OwinStartup(typeof(WeChatWallClient.NET.Startup))]
namespace WeChatWallClient.NET
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
接下来我们创建一个Client页面用来展现微信墙的一些操作,效果如下
public ActionResult Sq(string id)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<WeChatHub>();
if (hubContext != null)
{
ObjectId objid = new ObjectId(id);
MongoUtil mongo = new MongoUtil();
var colloction = mongo.getCollection("message");
var msg = colloction.AsQueryable<Msg>().FirstOrDefault(a => a.Id == objid);
if (msg!=null)
{
hubContext.Clients.All.addData(msg);
}
}
return RedirectToAction("GetInfo");
}
现在所有的工作都做好了,我们点击一下上墙,看看效果还不错,如下图
<script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="~/signalr/hubs"></script>
<script type="text/javascript">
$(function () {
var chat = $.connection.weChatHub;
chat.client.addData = function (data) {
$("#UL").append(‘<li>\
<div class="single">\
<div class="pic">\
<img src="/corvers/‘ + data.fakeid + ‘.jpg">\
</div>\
<div class="message">\
<div class="s-name">\
<span>‘ + data.nick_name + ‘</span> :\
</div>\
<div class="s-word">‘ + data.content + ‘\
</div>\
</div>\
</div>\
</li>‘);
Slide();
$("#total-num").text(++total);
};
});
</script>
后记&总结
其实整个流程很清楚了,我是从我给我们OurEDA实验室做的微信公众平台中抽取出来的这部分代码,也去除了一些无关的功能,demo中没有什么高级的oop手法,除了伸手党,真想学的看起来应该会很轻松,这个功能当时做也就花了不到两个小时前端后端服务器就都出来了。本来是想给出PHP下的,但是这两天放假回家想来实时通信这块需要后台PHP再写一个socket,和singnalr一比较好像有点得不偿失,还不如ajax长轮询,但是这样的话就与平台无关了,想想还有没有什么别的方法,如果想出来了再写一个PHP版本的,欢迎大家一起讨论
另外求助园友一个事情,我回家以后github,composer访问不稳定,连mongo官网都上不去了,nydusvpn,GreenVPN都试过了,不好用,我怀疑是电信禁用了vpn,大家有什么建议没,我家的网是电信10M光纤。。。谢谢了
标签:
原文地址:http://www.cnblogs.com/yeanzhi/p/4231916.html