早就想写一个微信墙了,毕竟这玩意儿很好用嘛。javascript
一直计划计划计划了一个学期,结果一事无成。有一次跟廖总聊天时候还说,赶忙积累点东西吧,大三了,再不作点什么就真的一事无成一无全部毕业之后废人一个。html
写一个微信墙倒也不是什么大事。但好歹作点什么吧。java
动手写代码以前固然要先理清思路。python
第一个思路:其实没作过任何微信公众平台的功能开发,基于本身简单的了解,最初的想法是将接收消息接口给接上。大概是之前用过的一个免费微信墙的模式,接收特定消息内容,进入微信墙模式。接收以后的全部信息显示到墙上,直到输入特定退出消息内容。jquery
好像这么作是比较正常的。可是缺点是,把消息所有导到本身的数据库以后,本身就得作完完整的一套工具来完成微信正常的其余功能(是这样吧?我也没确认过……)。工做量太大了。事实上并不须要什么本身写的工具去代替微信自己的后台,它的功能很好用,并且在愈来愈好用。web
刚好廖总(又是廖总=。=)在另一次聊天中提到:咱们可不能够写一个能够很轻易复用的东西?不要那么多功能,就是一个网页,有输入框,你进来就能够输入内容,而后给你显示在墙上。因而顺着这个思路想下去,最后产生了第二个思路。ajax
第二个思路:用微信公众号的网页服务,给网页受权获取用户基本信息,将基本信息存入数据库,并设定cookie
,让受权成功的用户得到发消息的权限。用户提交表单,微信墙页面用ajax
异步更新数据,将最新的用户消息显示在墙上。这样忽然就感受好不少,只须要在公众号后台设置一个受权回调页面域名,以及将AppID
和AppSecret
做为参数修改入网站源码中,而后即可以随便复用了。数据库
那么最终肯定的思路就是思路二了。json
思路理了以后,须要大概列一下要作的事情。api
决定仍是用 Python
+ Tornado
+ MongoDB
来写。已经迷上了非关系型数据库。
Handlers: MainHandler/微信墙页面 -渲染微信墙页面 AuthHandler/获取受权信息 -接受用户受权参数 code -使用 code 换取 access_token(解析json数据) -使用 access_token 获取用户信息 -将用户信息保存到数据库 -set_cookie FormHandler/发送消息用表单 -渲染发送消息表单 -接受表单数据,并存入数据库 ApiHandler/微信墙消息数据接口 -以json数据格式输出微信墙页面请求的数据 Templates: index.html微信墙页面 -未受权用户 -显示数据库内容 -即时更新并显示最新内容 -从服务器获取json数据 -解析json数据 -格式化消息并添加至消息列表中 -受权用户 -包括未受权用户功能 -发送消息(此处的方案是在底部增长一个内联框架,专门用于表单提交,同时不干扰其余内容) form.html表单页面 -将表单提交给FormHandler api.html数据接口页面
这篇记录就不写得那么详细了,我把我以为可能值得记录分享一下的东西总结总结。
<script type="text/javascript"> var len=0;//已获取的消息的总数 var cur=0;//当前位置 var data=new Array();//用于存放获取的消息 var lastid=0;//最近获取的消息的id function messageAdd(){//新增消息函数 if(cur==len){ messageData(); return false; } var str='<div class=\"event\" id=\"event-'+data[cur][0]+'\" onclick=\"viewOne('+cur+',this);\" style=\"display:none\"><div class=\"label\"><img src=\"'+data[cur][1]+'\"><label>'+data[cur][2]+'</label></div><div class=\"content\"><div class=\"summary\">'+data[cur][3]+'</div></div></div>'; //格式化消息 $("#list").prepend(str); //将消息增长到列表中 $("#event-"+data[cur][0]).slideDown(); //调用jquery函数,显示新消息 cur++; messageData(); } function messageData(){ var url='/api';//设置数据接口地址 $.getJSON(url,{lastid:lastid},function(d) { //此处经过get方法传递参数lastid获取最新数据 if(d['ret']==1){//当获取到数据 $.each(d['data'], function(i,v){ data.push(new Array(v['id'],v['avatar'],v['nickname'],v['content'])); //将获取的json数据添加入data数组 lastid=v['id']; len++; }); }else{ window.setTimeout('messageData();', 2000);//等待2000毫秒后从新执行该函数 } }); } window.onload=function(){ setInterval(messageAdd,500);//每隔500毫秒执行一次 } </script>
此处代码可复用于”js
获取json
数据“,”评论即时更新“
class AuthHandler(tornado.web.RequestHandler): @tornado.web.asynchronous//记得加上这一句 def get(self): http = tornado.httpclient.AsyncHTTPClient() http.fetch("http://127.0.0.1:8002/api?lastid=0",callback=self.on_response) //fetch(参数一,参数二),参数一为获取页面的地址,参数二为回调函数 def on_response(self, response): import json if response.error: raise tornado.web.HTTPError(500) result = json.loads(response.body) self.write(result["data"][0]["content"]) self.finish()
这是使用 Tornado
内置的异步请求 HTTP
客户端来获取数据的例子。
经测试,数据获取功能正常,json
数据解析正常。可复用。
import json //引入json包 if response.error://当发生错误时,请求出现错误提示500 raise tornado.web.HTTPError(500) result = json.loads(response.body) self.write(result["data"][0]["content"]) json.loads(json数据):将数据从json类型向python原始类型转化。
不须要进行特殊处理的话,不必对json
数据作“解析”。
转化好的数据能够直接经过下标进行操做,例如:
result = [[1, 2, 3], 123, u'abc', {u'key2': [4, 5, 6], u'key1': [1, 2, 3]}]
咱们要输出key2
列表中的第二个元素5:result[3][“key2″][1]
。(要记得下标从0开始)
先写到这里,待续吧。
睡觉了。
早上修改了些许内容。就等拿一个公众帐号测试了=。=。如今去把请求构造好,@杨老板求给力。