豆瓣资讯小助手

好吧,我承认搞这个玩意儿基本上是因为这几天上班太无聊了,就想着弄点东西出来打发时间。对于哥这种只会做后台开发对客户端零基础的人,又不想花时间去折腾客户端方面的,就只能找个现成的方案。夏小波提到微信的开放开台,看了一下,普通开发者的权限就是让微信把发给公共账户的信息转发到后端的你指定的http server去,然后你按照微信规定好的格式响应即可,很简单,也符合我的预期,因为只是想提供一个豆瓣阅读和电影搜索的入口而已。

说了这么多,好像没扯到要做的是啥,其实真的只是一个豆瓣阅读跟电影搜索的入口而已啦,大致在微信上看了一下,找到一个类似的,但是它搜索比较死板,一定要你在搜索的时候加上前缀来指明是搜索什么样的内容(电影或者音乐等),返回的内容也完全是文字,好吧,哥来改良一下吧。

好吧,做就做吧,豆瓣提供的api跟微信post过来的数据都是xml的,对于这些简单的玩意儿我喜欢用python来写,但是python自带的库解析xml貌似不是很好用,加上我对js里面GetElementById跟GetElemetsByTag这样的接口极其厌烦,而xml本身又是被解析成dom树的,因此提供的接口也类似于这些,写得并不是很爽。

刚开始本来想直接用google app engine来托管服务器代码的,但搞完后用在微信开放平台验证接口时,发现根本通不过,gae那边根本没收到请求,问了一下微信那边的人,说有可能被墙,好吧,我死心。只能尝试国内的sina app engine,这个要实名验证什么的才有一定量的云豆送,基本上就是靠着云豆来撑着服务可以运行下去,但是基本上本人相片,身份证复印件,手机号码什么的都得给他们,如果服务里有什么不和谐的东西被传播,肯定作者很容易就被和谐掉了,恶心!我承认我很讨厌实名制这种中国特色的东西。

创建应用时也发现目前python还处于内测阶段,需要去申请,这个倒挺简单,都没人申请的,一下子就通过了。

大致看了一下它的官方文档,有提供django这个框架给你开发http server用,当然还有其他如mysql memcache的一些给你用,但目前还用不上。sae不像gae那样子自己开发了一套框架给你用,基本上服务器的还是直接拿第三方比较火的来用,当然你也不用在本地安装它的sdk来做开发调试用,只要框架版本符合搞完后直接commit上去就可以了,哦,对了,它是通过svn做版本控制的。

有了django,服务器上只需要做的基本上就全部是逻辑了,但是过程中还是有一些小问题。例如说豆瓣的api响应有返回了作品缩略图给你,但是微信公共平台要求你在做图文混排时图片的url域名必须跟你提供的server域名一样,也就是说必须跟sae的域名一样,但实际上还是容易解决的,代理可以轻易解决这件事。

内容基本上都抓取了,也开始思考内容如何安排,因为毕竟你只是提供一个搜索的途径,你在豆瓣那边可能搜索到多个结果,那你是返回第一个,还是前两个,或者说前N个呢?在只返回第一个的情况下,虽然你可以插入很多很详细的内容,但是结果只有一个,未必就是用户想要的;在多个的情况下,微信本身对图文混排做了限制,你返回多条条目的话就只会显示图片跟标题,在你点击条目的情况下可以跳转到你指定的url,目的是使内容清晰。

我做了折衷的方案,当只返回一条时,就直接返回具体的内容;当返回多条时,会显示出前四条的标题、评分和缩略图,并提供一个“更多”的条目,以防前几条都没有命中用户的需求时可以跳转到豆瓣的搜索页面。

搜索关键字也是一个问题,目前涉及到“图书”和“电影”两种,不能强求每个人都一定会在搜索关键字前面加上前缀;考虑到某一段时间内一个关键词可能多个搜索者会想命中同一个结果,例如说“哈利波特”,早期的时候你可能是更想搜索到书,但是现在,可能是电影也说不定。好吧,那就根据用户最近的搜索热度,来自动决定应该搜索电影或者是图书。目前做得比较简单,每个搜索关键字都会对应一个电影搜索热度值和图书搜索热度值,当用户指定一个关键字在电影或者是图书进行搜索时,就会对这个关键字对应的两个值进行更新,算法采用最近最佳算法,因为如果只是累计加1的话不一定符合当前的热度;当用户只输入搜索关键字时,就会判断是否命中缓存的结果,并通过比较两个值的大小来决定;当然如果关键词从来没被搜索过的话默认是命中图书搜索,这一点考虑后续进行改进。

基本上就是这样,整个程序并不复杂,只是麻烦而已,不到一千行代码搞定的东西似乎也不是很有劲,不知道为啥!目前刚开始关注量很少,数据直接从豆瓣同步抓取都可以获得很高的响应速度了;后续可能会考虑更新一下关键词热度算法,并把memcache缓存利用起来,毕竟数据都从豆瓣那边同步抓取并不是一件好事,加上这部分数据更新不会很频繁,可以长时间缓存下来来加快响应速度。

最后,还是做一下广告吧,大家看到欢迎试用一下,只要你有微信既可,扫一下下面的二维码或者直接添加微信号:douban_assistent

标签: , , ,
文章分类 Programming, Python

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*