前几天偶尔上 Twitter 的时候看到别人的一条推,说是 Twitter 可以导出自己过去发布的所有消息了。这是我一直想做的,原因之一是 Twitter 自己限制了它是一个快速更新的消息发布集中地,而已经发布了的消息就不是它所关注的了。所以过去你要是在 Twitter 页面上不断的点“上一页”,能看到的页面是有效的,印象里好像回退到 20 几页就不能再往前看了,不知道现在有没有改进。因此我很早之前就有把我所有的 Twitter 条目都导出来的想法,可惜 Twitter 的 API 也有类似的限制,因此这个想法一直没有实现。
第二个原因是让我在国内的父母可以看到我的推。由于我经常发推,因此从我的 Twitter 记录中可以看到我的生活。这样我父母能更放心一些。
我写 tweets-page 是从 2009 年 7 月开始的。那个时候我刚刚回国,Twitter 已经被封锁了。当时我和家人在北京的饭店住着,父母正好有假期,准备带我在北京转转,看看鸟巢等新建设的地方。我因为时差关系到凌晨三点多就睡不着了。自己住在一间客房里没事干,又不想看电视,于是就想解决从国内上 Twitter 的问题。一开始时我用 ssh -D 给自己开个通道用,一会后嫌麻烦,因为代理的速度不高,一些国内的页面用代理会更慢,而且每次开代理还麻烦(那时我还不会 screen)。所以我就自己写了一个程序,让我可以浏览 Twitter 并发布新推。当时的代码怎么写的我早就忘了,好像也没有备份。浏览了一下当时的推特记录,说是用的 Perl 调用 curl 来用官方的 API 来更新,印象里时一个 CGI 小程序,非常简陋,还有不少的问题,当时仅仅是临时用用。
然后回加拿大后,我用 Ruby 写了一个小程序,通过 twitter4r 来获取我的 tweets,保存在数据库中,然后用程序生成页面浏览。API 在那时已经不支持 since 参数了,我只能从某个时间段开始抓取,之前的内容就只好放弃。程序最终写成了,不过我当时对服务器的知识太少,用的还是 Dreamhost 共享主机,最终用 Crontab 让程序定时运行的时候,发现无论怎么样都找不到我用 gem 安装的 twitter4r。如果程序不能定时运行,我每天要登陆到主机上手动执行一遍程序?非常不现实。所以最后我只好放弃,最后的生成结果部分我也懒得弄了。
印象里之后还试过几次,好像都没有成功。
到了 2012 年 5 月,我重新写了一次,结果弄成了。这次用了 Twitter 库和 Sequel,在服务器上我也不再用 SQLite 了,而是用 MySQL。除了保存到数据库之外,它还能在刷新后立即生成输出页面。输出的页面是一个比较大的 HTML 静态文件,我曾经想写一个分页功能的,后来一直没有兴趣碰它。在解决了 Crontab 的问题后,它就一直在我的服务器上工作着,一直到了现在。
当我看到了 Twitter 可以导出的消息后,我就导出了我的记录。看着一个几兆大小的 CSV 文件,我有了把它们添加进我的数据库的想法。于是就尝试了一下,中间也遇到了一些小问题。
开始时我觉得 CSV 文件没有什么难度的,于是就直接读取一行,用逗号拆分。但输出的时候我发现了几个空行,查看了一下原来 CSV 文件并不是严格的每行是一条记录的。记录中有的值有换行符,体现在 CSV 文件中就是直接的换行,我按行处理就会出错。我当时的想法是不要这些有问题的条目了,不过它们太多、太分散,我没有完成。之后我用了 CSV 库,它没有任何问题处理了换行。
第二个问题是时区。导出的 CSV 文件中的发布时间是用的 UTC 时间,看上去是这样的 2013-03-12 01:35:28 +0000。我要把它转换成我所在的时区,于是就做了各种尝试。或许由于 Rails 太火的原因,我搜索到的很多条都是如何在 Rails 里完成的,而不是 Ruby。最后经过尝试,我找到了解决方法。
第三点是如何插入数据库的问题。我开始的想法是直接在 CSV 文件中把我已经保存了的条目删除,然后运行一遍我的程序。现在想想这种方法其实也行,弄进数据库中再排一下序就可以了。不过我当时是直接新建了一个表,导入到这个表后检查结果正常后,就把表改名,跟过去用的表换过来,然后我就有了一个比较大的数据表了。
这次我不想生成静态页面了,为了练习,我改用 PHP 写了一个动态页面。我过去从来没有写过 PHP 程序。之前有想过要学一下 PHP,当时的想法是读别人写的代码,反正 PHP 的语法也不难。但是我悲剧的选了 WordPress,因为它是最流行的 PHP 软件之一。我现在对 PHP 的了解不深,对于 WordPress 的代码写的好坏没什么发言权。不过我觉得 WordPress 的代码非常非常非常不适合初学者用来学习模仿,非常不清晰,几下子就能把人绕晕了。所以我到现在都没有认真学习过 PHP。不过 PHP 在我印象中不难,当然不包括它面向对象的部分。我从网上找了一些它跟 MySQL 合作的介绍,选择了 PDO 方式来操纵数据库,写出了不到一页的代码,很容易的就完成了任务。
新的页面在:http://liuf.net/tweets/。
当然这个页面目前其实是比较糟糕的。动态页面每次都要生成,这么多条目导致了这个页面的速度比较慢,要将近 10 秒才能完成。所以有机会我一定会给它安上分页功能,或许加点 JavaScript 来动态载入。
旧的代码我还没有修改,其实我想把它生成页面的部分去掉,单独的干刷新数据库功能。等有机会再说吧。
生成的代码我还没有往 Github 上传,因为当中我直接把数据库的用户名和密码写进代码里了,估计从 git 里回滚几下就能看到。虽然我的数据库仅限 localhost 访问,但还是再考虑一下吧。不过代码库的链接在这里。
《升级了 tweets-page》有1条评论