微信墙

上一篇文章中已经用PHP搭建了一个微信墙获取信息的服务器,我这里使用微软的signalr搭建一个客户端,signalr是一个为开发者开发实时应用的 一个库文件,支持windows server 2008 r2+,win7,win8 windows azure,可以使用iis8托管,iis7必须支持 extensionless URLs 。下图是浏览器支持情况

其实据我所知,你可以再微软的任何技术中使用signalr比如wpf,winform等等中都可以,只不过要引入相应的dll文件,而且可以在高强度的环境下使用signalr,比如股市网站实时绘制波形图。更多信息请直接去官网查看,传送门 。项目源码 传送门

准备工作

首先创建一个asp.net mvc 5 的项目

在项目中引入必要的文件,我这里使用了mongo做数据库所以要引入mongo的驱动,直接使用nuget搜索即可,如下图

这里我们使用signalr做实时推送,直接安装Microsoft Asp.Net AsignalR即可,他会引入项目中所需要的必要依赖项

项目中使用模拟登陆获取人物图片,我用了自己写好的Utility库,里面有常用的cookie封装,cache封装,http客户端等等几十个操作,nuget搜索yeanzhi即可(p.s.这一步理论上应该在服务器中直接获取图片信息的,因为服务器用的PHP,图片没办法和这个项目共享(除非使用第三方图床),所以图片在这里下载,其实可以服务器都用.NET做,短时间直接一个ConsoleApplication就行,长时间的话写一个服务用定时器调用就好了,不过这两天在做PHP的实时推送,到时候还要用PHP写一个后台怪麻烦的,后期会放出来PHP的微信墙客户端)

这些都完成了,我们的准备工作也就差不多了

编码工作

我在项目中创建了微信常用的模拟操作,如下图,一会和微信打交道的操作都有他们完成,源码在github上面

我们首先要更改Home下的index,更换email和password即可登录微信,登陆成功会跳转到GetInfo,这里之所以会单独初始化一下是为了防止以后每次去微信拿数据都要登录一遍来获取token和cookie,如果单位时间内登录次数过多微信会有一个二维码的校验,这个就十分麻烦了,所以我们登录一次,将cookie和token放到缓存中,以后从缓存中拿数据

  1. public ActionResult Index()
  2. {
  3. if (WeiXinLogin.ExecLogin("email", "password"))
  4. {
  5. return RedirectToAction("GetInfo");
  6. }
  7. return View();
  8. }

下面的方法是从mongo中拿到我们PHPserver存放进去的数据,同时检测有没有下载这个人的头像,如果没有下载,就去下载,其中判断函数和下载函数直接去源码中查看即可,我都放到了HomeController 里面,没有进行进一步封装

  1. public ActionResult GetInfo()
  2. {
  3. MongoUtil mongo = new MongoUtil();
  4. var colloction = mongo.getCollection("message");
  5. var res = colloction.FindAll().ToList();
  6. foreach (var item in res)
  7. {
  8. if (!IsExitImage(item.fakeid))
  9. {
  10. DownImage(item.fakeid);
  11. }
  12. }
  13. return View(res);
  14. }

一切顺利的话我们访问/Home/Index 微信模拟登陆登陆成功,页面就会重定向到/Home/GetInfo 这里,我是用了bootstrap简单的写了一个页面,时间戳没有处理直接输出了如下图


接下来该准备推送的事情了,我们再一次明确一下需求,上一个图中我们点击上墙,这条消息应该就会被推送到微信墙那个页面,下面我们做推送的事情,首先肯定是要初始化signalr的一些操作的,我们创建一个Hubs的文件夹,在文件夹中创建一个WeChatHub的类继承Hub,如下

  1. public class WeChatHub : Hub
  2. {
  3. public void Send(string name, string message)
  4. {
  5. Clients.All.addData(name, message);
  6. }
  7. }

然后我们在根目录下创建一个Startup文件用来在程序运行之处初始化SignalR,代码如下

  1. [assembly: OwinStartup(typeof(WeChatWallClient.NET.Startup))]
  2. namespace WeChatWallClient.NET
  3. {
  4. public class Startup
  5. {
  6. public void Configuration(IAppBuilder app)
  7. {
  8. app.MapSignalR();
  9. }
  10. }
  11. }

接下来我们需要一个action创建一个代理去调用hub,将信息推送出去,代码如下

  1. public ActionResult Sq(string id)
  2. {
  3. var hubContext = GlobalHost.ConnectionManager.GetHubContext<WeChatHub>();
  4. if (hubContext != null)
  5. {
  6. ObjectId objid = new ObjectId(id);
  7. MongoUtil mongo = new MongoUtil();
  8. var colloction = mongo.getCollection("message");
  9. var msg = colloction.AsQueryable<Msg>().FirstOrDefault(a => a.Id == objid);
  10. if (msg!=null)
  11. {
  12. hubContext.Clients.All.addData(msg);
  13. }
  14. }
  15. return RedirectToAction("GetInfo");
  16. }

接下来我们创建一个Client页面用来展现微信墙的一些操作,效果如下

接着引入jquery.signalR.js ,注册signalr路由,创建一个代理与后端addData进行通讯,代码如下

  1. <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
  2. <script src="~/signalr/hubs"></script>
  3. <script type="text/javascript">
  4. $(function () {
  5. var chat = $.connection.weChatHub;
  6. chat.client.addData = function (data) {
  7. $("#UL").append('<li>\
  8. <div class="single">\
  9. <div class="pic">\
  10. <img src="/corvers/' + data.fakeid + '.jpg">\
  11. </div>\
  12. <div class="message">\
  13. <div class="s-name">\
  14. <span>' + data.nick_name + '</span> :\
  15. </div>\
  16. <div class="s-word">' + data.content + '\
  17. </div>\
  18. </div>\
  19. </div>\
  20. </li>');
  21. Slide();
  22. $("#total-num").text(++total);
  23. };
  24. });
  25. </script>

现在所有的工作都做好了,我们点击一下上墙,看看效果还不错,如下图

后记&总结

其实整个流程很清楚了,我是从我给我们OurEDA实验室做的微信公众平台中抽取出来的这部分代码,也去除了一些无关的功能,demo中没有什么高级的oop手法,除了伸手党,真想学的看起来应该会很轻松,这个功能当时做也就花了不到两个小时前端后端服务器就都出来了。本来是想给出PHP下的,但是这两天放假回家想来实时通信这块需要后台PHP再写一个socket,和signalr一比较好像有点得不偿失,还不如ajax长轮询,但是这样的话就与平台无关了,想想还有没有什么别的方法,如果想出来了再写一个PHP版本的,欢迎大家一起讨论

另外求助园友一个事情,我回家以后github,composer访问不稳定,连mongo官网都上不去了,nydusvpn,GreenVPN都试过了,不好用,我怀疑是电信禁用了vpn,大家有什么建议没,我家的网是电信10M光纤。。。谢谢了

signalR制作微信墙 开源的更多相关文章

  1. PHP微信墙制作,开源

    PHP微信墙制作 微信墙 PHP 注意:由于微信官网不定时会更新,其中模拟登陆以及爬取数据的方式可能会失效,最近这12个月里,就有两次更新导致此功能需要重写. 服务端源码->github地址传送 ...

  2. HTML5服务器端推送事件 解决PHP微信墙推送问题

    问题描述 以前的文章中<PHP微信墙制作,开源>已经用PHP搭建了一个微信墙获取信息的服务器,然后我就在想推送技术应该怎么解决,上一篇已经用了.NET 的signalr做了一个微信墙,PH ...

  3. 教你用Python制作微信好友背景墙

    目录: 0 引言 1 环境 2 代码实现 3 后记 0 引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这 ...

  4. PHP微信墙制作

    微信墙 PHP 注意:由于微信官网不定时会更新,其中模拟登陆以及爬取数据的方式可能会失效,最近这12个月里,就有两次更新导致此功能需要重写. 服务端源码->github地址传送门 思路 其实实现 ...

  5. .Net Webapi SignalR与微信小程序的交互

    .Net Webapi SignalR与微信小程序的交互 一.SignalR与Webapi 1.SignalR的安装: Signalr与跨域仅需要安装两个开源库 Microsoft.Owin.Cors ...

  6. Pygame制作微信打飞机游戏PC版

    使用Pygame制作微信打飞机游戏PC版 转至:http://www.cnblogs.com/dukeleo/p/3339780.html   前一阵子看了一篇文章:青少年如何使用Python开始游戏 ...

  7. 如何制作微信动态表情包 GIF制作工具哪个好

    表情包已经成为我们生活聊天中必不可少的一部分,但是如何制作微信动态表情包呢?自己制作的表情包更加独有个性,今天小编带大家看一波原创表情包的制作方法吧! 使用工具:电脑 操作方法: 1.首先在手机上也是 ...

  8. [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】

    [教程]微信官方开源UI库-WeUI使用方法 [ 教程]微信官方开源UI库-WeUI使用方法 地址:http://www.weui.org.cn/?/article/1 微信公众号开发-WeUI使用说 ...

  9. 如何利用python制作微信好友头像照片墙?

    这个不难,主要用到itchat和pillow这2个库,其中itchat用于获取微信好友头像照片,pillow用于拼接头像生成一个照片墙,下面我简单介绍一下实现过程,代码量不多,也很好理解,实验环境wi ...

随机推荐

  1. Python自动化 【第八篇】:Python基础-Socket编程进阶

    本节内容: Socket语法及相关 SocketServer实现多并发 1. Socket语法及相关 sk = socket.socket(socket.AF_INET,socket.SOCK_STR ...

  2. CLR VIA C#委托

    1.什么是委托?委托就是一种回调函数的机制,将函数作为一个参数传递给其他对象,当该对象需要的时候调用委托来达到回调函数的目的. 通俗点的说法是:你将一件事情交给别人去做.例如你QQ里的自动回复,为了第 ...

  3. 性能改善之For与Foreach

    关于For与Foreach的区别,博客园里已经有好多这样文章了,都分析的挺好:http://www.cnblogs.com/jobs/archive/2004/07/17/25218.aspx  不过 ...

  4. iOS获取设备型号、装置类型等信息

    iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设 ...

  5. 写shell脚本速查笔记

    linux shell脚本的语法蛋疼,而且对于java开发人员来说又不常用,常常是学了一次等到下次用的时候又忘记了.因此制作这个速查笔记,用于要写shell脚本时快速回忆&速查. 获取当前脚本 ...

  6. Selenium2+python自动化13-多窗口、句柄(handle)

    前言 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 本篇以打开百 ...

  7. IE、FF、Safari、OP不同浏览器兼容报告

    IE.FF.Safari.OP不同浏览器兼容报告 1         浏览器内核简介 Trident IE浏览器(GreenBrowser绿色浏览器, 遨游浏览器....都是IE) Geckos Fi ...

  8. linux 下搭建 storm

    搭建storm  需要搭建: 1.zookeeper 搭建 2.下载/安装 storm 的依赖包  zeromq, jzmq,python 2.storm 搭建 一.Zookeeper 安装 下载安装 ...

  9. gtest vs2015配置

    1. 下载gtest https://github.com/google/googletest 2. 解压文件 使用vs2015 打开googletest-master\googletest\msvc ...

  10. 用PHP将Unicode 转化为UTF-8

    function unescape($str) { $str = rawurldecode($str); preg_match_all("/(?:%u.{4})|&#x.{4};|& ...