[每月一作品]唐诗机器人小小
“每月做一件作品”的计划从去年就有,并一直持续不断的实施中。“唐诗机器人”可以算是2012年3月的最突出的作品吧。
唐诗机器人(@唐诗机器人小小)是一个本人开发的每隔几分钟就自动从全唐诗中挑选一首唐诗发送一条微博的程序。从诞生之日起,已经连续运行了15天,发送了3573条微博,并且在几乎没有怎么宣传的情况下吸引了756个粉丝,其中有效粉丝100余人。(截止2012年8月11日,已经连续运行146天,发送微博26848条,吸引了10519位忠实的粉丝)
作为一个完善的唐诗自动发布程序,她已经具备了灾难恢复(确保灾难之后唐诗不会重发、漏发)、灾难报警(确保发生故障之后可以准确判断故障来源)的功能并且具备了友好的用户界面。之所以把这个唐诗机器人取名为“小小”是因为她现在功能还太弱,目前仅仅是最初版本,仅仅具备一条一条的把唐诗发送到微博上的功能。将来她还会在本人不断的学习“人工智能”、“汉字语义理解”、“遗传算法”等理论的过程中不断的增加“唐诗归类”、“唐诗筛选”、“与人类对话”、“像人类一样思考”的能力。到了那个时候,“唐诗机器人中中”、“唐诗机器人大大”、“唐诗机器人超超”、“唐诗机器人特特”会相继诞生。
唐诗机器人最初是受到华中科技大学“华科的秘密”树洞程序的启发,在2012年3月9日下午4点左右突发灵感,并在15分钟之后下定决心要做一个出来。于是当天晚上放下手中所有的事情开始研究新浪微博的API函数并在晚上11点05分的时候取得了关键性的突破,搞定了发送微博部分的函数功能。
3月12日,从一些网站论坛拼凑下载了全部的唐诗的数据库。
3月13日,“唐诗机器人小小”的帐号注册成功,并开启使用。
3月13日,“唐诗机器人小小”的应用程序“唐诗机器人”创建成功。
3月14日,因为TX所Web服务器助管的工作职责的原因,“唐诗机器人小小”的架构设计暂时告一段落。
3月16日,“唐诗机器人小小”程序重新开张,主框架书写完成,但是遇到一个小小的制作瓶颈。
3月20日,“唐诗机器人小小”程序Preview版开始投入使用。
3月21日 ,“唐诗机器人小小”运行5小时之后宕机。
3月21日,“唐诗机器人小小”宕机故障解决,是由于40098错误导致循环不断发送重复的文本所致。
3月22日,“唐诗机器人小小”正常工作中。
3月25日,本人以“唐诗机器人小小君”的名义帮助中山大学化学学院制作了一个“中大化院女生节树洞”程序,并且当即投入运营。
3月27日,“唐诗机器人小小”得到了中山大学部分同学的关注,并且得到了n多中山大学在读同学的膜拜。
4月4日,“唐诗机器人小小”在连续运行10天之后,再度罢工12小时。经查,是由于新浪微博API改变,导致20032错误无法正确被“小小”捕捉所致。
4月5日(现在),“唐诗机器人小小”已经连续运行了15天,发送了3573条微博,并且在几乎没有怎么宣传的情况下吸引了756个粉丝,其中有效粉丝100余人。
“唐诗机器人小小”是我做过的第一个完全凭借JavaScript语言编程实现的一个具有完整意义上的“程序”或者“系统”的“应用程序”。所有代码均基于HTML+CSS2.1+JavaScript+jQuery1.4.2+Ajax编写,使用了新浪微博的API以及谷歌浏览器的调试器。
经过实际的测试,全部使用js编写的应用程序具有很多普通应用程序不可比拟的优点:
1.科学的内存管理机制。目前,主流浏览器的JS引擎可以对内存做很好的管理,一般不会发生Windows操作系统应用程序经常存在的“内存泄露”的问题。
2.对程序员及其友好的编写调试方式。使用js编写代码,对于我们这种电脑较烂的吊丝而言简直就是一种享受,因为编辑器用Windows自带的记事本、调试程序使用浏览器即可,不管编写代码还是调试程序,都简直是飞速。如果开发其他的应用程序则需要又大又笨重的IDE(集成开发环境),被拖慢的系统速度让本来就很无聊的coding变得度日如年。
3.Chrome浏览器下飞快的处理速度。目前各种浏览器对js解释引擎越来越重视,js虽然是一种解释语言,但是Chrome之流的浏览器的js引擎却可以把js代码的运行速度变得跟目标文件执行速度几乎一样。而且目前浏览器的JS引擎可以对JS代码做优化,可以忽略掉无效的操作与循环,进一步增快了js的执行速度。
4.写一次应用程序,就可兼容各种不同操作系统、不同版本的客户端。如果采用其他编程语言进行编写,那么换到其他机器上的时候可能就无法使用了。而使用js编写应用程序,只要确保在不同的客户端上运行同样的浏览器,那么就一定可以保证js程序的正确运行。
5.Windows8也即将兼容这种应用程序。Windows8也宣布提供对纯JS应用程序的支持。这可能就是未来的应用程序的发展方向。
在编写“唐诗机器人小小”的过程中,遇到的主要问题归结如下:
加载唐诗库。由于唐诗的数据库存放在txt文件中,而由于系统安全的考虑,默认情况下,js是不能加载本地的文件的。但是在jQuery的Ajax部分有个很好的函数可以帮助实现加载一个文件的功能:$.load()。load函数本身是用来加载xml文件或者html文件的,但是用它来加载txt文件也未尝不可。在load函数的回调函数之中把接收到的数据传递给后来的唐诗处理函数,即可完成将txt文件中的唐诗数据库加载到内存中的功能。
发送微博。发送微博算是整个系统中最让人纠结的部分了。新浪微博的API做的很宽很大,貌似什么语言都支持,甚至连E语言都支持了,但是对每种支持的语言的文档、参考资料、客户支持却很少。不知道这是不是新浪微博的一个策略。刚开始使用$.ajax()函数发送微博,却总是得不到返回值,而且系统提示“XMLHttpRequest cannot load https://api.weibo.com/2/statuses/update.json. Origin http://***.***.***.** is not allowed by Access-Control-Allow-Origin.”,后来到处找原因找了很久才知道原来是新浪微博API具有两个版本的API,新版的API采用WB2.anyWhere()以及W.parseCMD()来实现跨域发送的功能(参见新浪微博官方参考资料http://open.weibo.com/wiki/Weibo-JS_V2)。其实用Chrome浏览器就可以看到,这两个函数实现了在一个页面上插入一个跨域的iframe的功能,iframe不再具有浏览器的跨域安全限制,因此不再需要1.0版的新浪微博的xd.html文件。这估计也是新浪微博为什么推出2.0版的WeiboJS的原因:2.0版的WeiboJS使用起来明显比1.0版的方便很多。
灾难恢复。为了保证发送失败之后不会重发、漏发,因此花了很大的时间在这上面。可能对于一个普通的应用程序而言,做这个功能很简单,但是在这上面做这个功能却费尽了千辛万苦。保证无论如何(刷新、服务器断电、浏览器重启等)都仍然可以接着上一次发送的最简单的方法就是把一些运行状态保存在本地。在浏览器上保存到本地的一个最简单的方法就是采用cookies了。可是在刚开始将一个数字型的数据存到cookies中的时候,读出来的数据却死活不是原来存进去的数据。费了好长时间查找原因,最终终于发现,存在cookies中的数据是不分数据类型的,数字型的数据存进去再取出来的时候,最好加上一个parseInt函数,将数字从其中取出来。
cookies读取写入。分享一段很好用的cookies代码(jQuery环境下)
//Cookie操作
jQuery.cookie = function(name, value, options) {
if (typeof value != ‘undefined’) {
options = options || {};
if (value === null) {
value = ”;
options = $.extend({}, options);
options.expires = -1;
}
var expires = ”;
if (options.expires && (typeof options.expires == ‘number’ || options.expires.toUTCString)) {
var date;
if (typeof options.expires == ‘number’) {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = ‘; expires=’ + date.toUTCString();
}
var path = options.path ? ‘; path=’ + (options.path) : ”;
var domain = options.domain ? ‘; domain=’ + (options.domain) : ”;
var secure = options.secure ? ‘; secure’ : ”;
document.cookie = [name, ‘=’, encodeURIComponent(value), expires, path, domain, secure].join(”);
} else {
var cookieValue = null;
if (document.cookie && document.cookie != ”) {
var cookies = document.cookie.split(‘;’);
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + ‘=’)) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
};
使用方法很简单:只需要将这段代码添加到js文件中即可。如使用$.cookie(“name”,”LiLei”);即可在cookie中创建name字段并赋值为LiLei,$.cookie(“name”,”HanMeiMei”);即可把name字段改为HanMeiMei,$.cookie(“name”,null);即可删除该字段,var name=$.cookie(“name”);即可读出name字段。
总之,把唐诗机器人小小做出来并不难,难就难在,要保证唐诗机器人日夜24小时运行,连续运行一年时间还不会发生故障。
因为“唐诗机器人小小”的程序运行之后就开始通过“唐诗机器人小小”的帐号发布微博了。因此我不是特别想公开“唐诗机器人小小”的源代码。如果有需要或者对此感兴趣,请联系我。
唐诗机器人小小的运行界面如下:
1 条回复
[…] 唐诗机器人小小。点此查看 […]