新浪微博版twitese

2010-8-14 评论(10) 分类:作品 Tags:

sina_twitese

架设网址:http://cnbang.net/sinatwitese

项目主页:http://code.google.com/p/sinatwitese/

几个月前新浪微博找我做个实现微博所有功能的开源PHP客户端,换句话说就是把twitese改成用于新浪微博,但这样似乎没什么用,新浪微博又不用翻墙上,何必用到第三方网页客户端呢,想想可能是因为要有个微博应用的代码示例。

结果我花了点时间做出来,比较麻烦的是新浪微博的评论,下了挺多功夫的,其他都差不多,当时做到基本可以用了:

后来新浪的人有尝试修改一下外观,然后又很长一段时间毫无动静,我问了后才被告知他们不用这个了,打算自己写一个了,可能发现太难修改界面了,代码里还残留有很多twitter的东西,还不如自己写个效率高。于是我这个东西就无声无息地被埋葬了,现在掘出来晒晒太阳。

python版twitese排行榜(开源)

2010-2-26 评论(10) 分类:作品 Tags:

闲着没事,学下python,浏览完《dive into python》,想半天没想出来要做个什么东西实践好。此时twitese的排行榜功能已经停滞很久了,之前java版的代码也比较乱,索性用python重写这个功能好了。当然,这个程序还是架设在GAE上的。

这次做的基本上跟原版一样,只是抓数据时不用page这个参数了,用cursor这个参数分页,发现这个参数用来抓取数据实在是比page方便多了。另外通过一些小伎俩解决了原本只能获取前1000个用户的问题,现在可以直接通过分页看到所有抓取到的用户了。具体抓取方法见这里,最后做了独立页面:http://twiteseapi.appspot.com/

写旧程序,虽然是用不同语言写,但激情实在高不了~这次这个python应用感觉写得没什么python的风格,可能是因为程序太简单吧。python给我的初感觉就是很精简,跟java正好相反,只是奇怪为什么每个类方法的self参数为什么不自动传进去,还要手动写,这跟它的精简实在不符。

这个程序,也是开源的,并且做到很容易架设,只需要上传后执行一下init就行了。地址:http://twiteseapi.googlecode.com/

twiteseV1.3

2010-1-27 评论(25) 分类:作品 Tags:

考完试后,开始大改twitese,修复了很多大小bug,新增了一些功能,具体如下:

新增
新增官方RT,RT显示格式有两种,可以在“设置”里选择。
新增自定义API,发现默认API无法使用时可以自己设定API,在“设置”里自定义
新增停止自动刷新按钮
新增状态数值刷新按钮,更新好友数、关注者、推数三项数值
好友列表新增 关注/取消关注 按钮
侧边栏新增推群、热门消息
提示条新样式,固定在页面顶部,不会出现看不到的情况

细节
@自己的推高亮显示
ajax刷新时会更新旧推的时间
图片显示代码优化,每次刷新新推只检测新推里是否有图片。
搜索优化 纯中文字符间加空格
发推时显示的新推格式修整,链接,图片等都会显示
丰富出错提示,例如连接不上twitter、向没有关注你的人发私信都会有相应的提示

修复
修复中文标签乱码的bug
修复发送消息时过滤+ &等符号的bug
修复进入空页出错的bug
修复空间不支持加密函数时出现的错误

目前官方RT有一个问题,就是无法在timeline里显示自己是否RT过这条推,也就是说,你RT完一条推后,如果想undo,必须进入侧边栏的“RT消息”里删除那条推。自己RT过的消息在timeline里也无法高亮显示。这是官方API的缺陷,在开发者论坛上已经有人抱怨过,不知以后会不会加一个“rt_by_me”这样的参数。

之前最棘手的就是在某些空间不能加关注加收藏等问题,这些都是curl那块出的问题,貌似不同版本的PHP对这个curl语句支持不一样?没有空间可以测试不知道怎么修复。这次又小改了下这部分代码,但不确定之前那些问题是否解决了~

修整的过程感觉挺爽的,把bug一个个改掉,新功能一个个加上,挺顺利的,也重整了部分代码,把timeline的代码统一放在twitese.php的一个函数里,所有页面通过传参数调用,统一管理,可惜搜索页面和刷新推的特殊参数太多没法放进去。发现做啥东西都是刚开始时激情十足,连续做得久做得多了就没多大激情了,得换换口味休息休息才行。于是,我之前计划想加入的“高级搜索”功能,就留到下个版本再实现吧~

项目主页:http://code.google.com/p/twitese/

抓取twitter中文用户数据GAE程序开源

2009-12-8 评论(14) 分类:作品 Tags:

起源

我对抓取和处理数据挺感兴趣的,以前试过用PHP抓取饭否用户的数据,得出饭否用户统计(放在秘饭里),当时特别需要能有定时执行一个程序持续抓取数据的功能,但找不到方法,暑假发现GAE有cron功能时挺兴奋,就琢磨着要做个什么东西,抓取一些什么数据玩玩。可惜饭否挂了,否则我做的肯定是饭否的应用,饭否没了,就捣鼓twitter了。

想着想着,就想出抓取twitter上说中文的用户,形成一个排行榜,一个圈子,就是推特中文圈了,因为可以不断抓取数据,每个人最新的一条推都保存在数据库里,更新时间也保存,然后读取数据库,根据更新时间排序取出数据,就能形成的“随便看看”功能了。我最初想做的,就是这两个东西。实实在在的一个“中文圈”,后来闲着也是闲着,干脆把使用twitter需要的功能都加上了。没想到后来受欢迎的是这些普通功能,最初的那两个功能反响反倒不怎么样。另外,在中文圈发消息的时候,会自动更新存在GAE数据库里对应的用户数据,所以会马上显示在随便看看里。用的人多了,随便看看的更新就比单纯后台抓取数据快多了。

后来GAE版被封,改写PHP版,不愿放弃排行榜和随便看看,于是修改了程序,还是那样抓取数据,再提供个页面输出json数据,让php程序调用。

本来打算开源PHP版twitese后下一步就是要开源这个抓取数据提供API的GAE程序的,但一因为懒,二因为大家似乎没这个需求,就搁置了,今天偶尔想起来,就放上吧。

程序

项目主页:http://code.google.com/p/twiteseapi/

原理

读取FecthHelper数据库获得用户id和页码(第一次用下面写的initFetch页面写入初始数据),抓取他的好友列表,循环每一个用户,判断他的姓名、desecration、最新的推里有没有中文,有的话保存进TwitterUser数据库,没有的话跳过。一个页面的好友列表处理完后,判断此页是否为末页(根据好友个数是否小于一个数),不是末页则把下一页的页码写入FecthHelper数据库,等待下次执行。是末页则读取数据库TwitterUser里另一个用户的数据,存入FetchHelper,等待下次执行。

使用

在eclipse新建一个GAE项目,再把文件覆盖进去。改一下appengine-web.xml里的名字,剩下的就是提交上传了。

页面

4个功能页面:

initFetch页面,源文件InitFetchData.java
上传程序后首先运行这个页面,初始化生成FetchData数据库,写入当前要抓取的用户和页码。

fetch页面,源文件FetchData.java
核心页面,读取FetchData数据库取出用户名和页码,抓取它的好友列表,保存进数据库TwitterUser,按照不同条件判断继续下一页抓取还是改变抓取的用户。

reset页面,源文件ResetData.java
读取过的twitter用户在数据库里会标志readed=true,fetch抓取时间过长可能会导致所有用户readed都为true,这个页面每次修改100个用户的readed为false。

delete页面,源文件DeleteData。java
删除数据库TwitterUser里的数据,每次删除300条。

其中fetch reset delete都应该通过cron不断执行。

2个输出页面:

rank.json页面,源文件RankJson.java

输出排行榜数据,格式:

[{
    "profile_img_url": "http://……",
    "screen_name": "bang590",
    "name": "bang",
    "description": "",
    "followers_count": 1455053,
    "friends_count": 72,
    "statuses_count": 586
  },
  ……
]

接受参数:页码page 条数count 均为optional

browse.json,源文件BrowseJson.java
输出随便看看数据,格式:

[{
    "profile_img_url": "http://……",
    "screen_name": "bang590",
    "name": "bang",
    "text": "推内容",
    "created_at": "Tue Dec 08 15:15:50 UTC 2009",
    "id": 6465851422,
    "source": "web"
  },
  ……
]

接受参数:页码page 条数count 均为optional

目前存在的问题是,没判断API Rate limit,抓取时超过了API限制直接跳过了。
偶尔一些外国人的推里出现了中文,也会被抓取进数据库。程序写得很乱,没去整理,挺多地方有摇摇欲坠的感觉。不过上线运行了挺长时间,应该还算靠谱吧~

twitese1.1 新增list功能

2009-11-27 评论(11) 分类:作品 Tags:

更新

个人挺喜欢twitter的list功能,在follow的人多的时候尤为有用,这两天抽出时间给twitese加上了list功能,顺便改正一些小bug。

修改的bug:

php空间开启magic_quotes情况下单引号双引号前多了”的问题
消息自动刷新时执行时间超时出现的错误
修正国内空间无法搜索的问题
……还有其他一些小错误

更新:

list的查看,新增list、list成员等功能 P.S list消息界面会自动刷新
新增API limit显示
去除config.php里的SEARCH_API设置,改成在程序里自动判断
FAQ页面

待增加的功能:

图片上传、黑名单、短网址、cookie加密(原先的有错误,暂时不用了)、ajax自定义(自动刷新时间间隔,提示条隐藏等)

项目主页:http://code.google.com/p/twitese/

预览:http://twitese.webbang.net/

命名

在twitter上咨询了list翻译成中文要叫啥好,推友的答案是“列表 推列 李斯特 群组 自分类 圈子”,个人倾向于推列和群组,那么就组合一下,叫推群好了,觉得这名字还算合适吧。

API Limit

做twitese,受twitter API rate limit的限制太大了,也就是一小时限制请求150次API,超过了就要等下个小时重置才能继续。一般可以申请twitter白名单,能将每小时限制次数提高到20000次,这样几乎就没什么限制了,但做twitese是开源由大家自由架设的,总不可能要求每个架设的人都申请白名单。于是都得小心翼翼地使用API,能省既省,于是不能每次刷新页面的时候都更新用户数据,省略了每次进入用户页面就要判断是否已经加入黑名单的功能,等等。做list的时候发现要用的请求数太多了,于是,现在的list添加成员方法只有那么很不方便的一种,以后再想办法改进吧。

list API

做的过程着实被list的API恶心了不止一次。总结一下:

1.先看看list的所有API

List Methods
POST lists (create)
POST lists id (update)
GET lists (index)
GET list id (show)
DELETE list id (destroy)
GET list statuses
GET list memberships
GET list subscriptions

List Members Methods
GET list members
POST list members
DELETE list members
GET list members id

List Subscribers Methods
GET list subscribers
POST list subscribers
DELETE list subscribers
GET list subscribers id

你单看名字能知道这个API是干嘛的吗?能的话算你牛,这是第一个恶心的地方。以前的API功能是什么都是一目了然的。
例如GET list subscribers id是检查用户是是否已经follow某个list ,而GET list subscribers是返回用户follow的所有list,两者名字上的差别就是差一个单词”id”,牛。

2.每一个list API地址都是http://api.twitter.com/1/开头的,旧的API都是以http://twitter.com开头的,接下来说的你可能会看晕:
list大部分API可以用http://twitter.com代替http://api.twitter.com/,结果一样,但有些就不行:

http://api.twitter.com/1/bang590/lists.xml 可行
http://twitter.com/1/bang590/lists.xml 可行

http://api.twitter.com/1/bang590/lists/subscriptions.xml 可行
http://twitter.com/1/bang590/lists/subscriptions.xml 不可行

犯晕了没?后来无意中发觉,把所有http://api.twitter.com/1/改成http://twitter.com/就都可行了,这才让我可以继续做下去:
http://twitter.com/bang590/lists/subscriptions.xml 可行
官方API文档完全没有提到这回事,这在考验程序员的悟性么?

3.有些API完全不可用,例如GET list subscribers id,怎么搞都是出现404找不到页面,于是现在还没有判断用户是否已经关注某个list的功能。

4.最恶心的一点,为list添加和删除成员,竟然不接受“bang590”这样的用户名,而只支持一长串数字的用户ID。一直以来screen_name一直都被当做id用,在这里竟然不被支持,这下脑残了,我必须通过screen_name请求users/show,返回这个用户对应的id,再传给list添加成员的API,才能成功添加成员。list添加成员是不限制API的,但users/show要,也就是说,每添加和删除一个成员,就要用到一次API请求……巨脑残,难道是我没找到更好的办法?

总结四个字:乱七八糟

list功能没经过很多测试,所以应该还有大大小小挺多错误的,大家指正吧。

开源 php版twitese

2009-10-28 评论(141) 分类:作品 Tags:

推特中文圈

暑假完成了推特中文圈,放在GAE上,大家的反响挺好,呼吁开源的人也很多,但我一直没开源,这里写了我开源的顾虑。

好像是10月14日那天,众多twitter第三方web客户端都被封了,itweet dabr twitzap 等,还有推特中文圈。被封的时候其实我挺平静的,因为如果要禁twitter,不封推特中文圈实在没道理,早有心理准备。

其实我还没完全了解他们封的是什么,我本来以为封了IP,没戏了,有一天一推友告诉我说用一个新域名绑定到twitese,就能继续免翻墙打开了。试过后,果真如此:http://t.webbang.net,到写这篇博客为止,这个地址还能访问。看来他们封的只是twitese.appspot.com这个网址?不过ghs.google.com的很多IP都被封了,仅剩下几个残种,不知道ghs.google.com有多少个IP,要是少的话,还是不要用twitter应用摧残GAE了~

开源GAE版的twitese无济于事,再怎样都是放在GAE上,只会更加摧残GAE,于是10月23日我开始动手写php版的twitese,希望开源后网友们能把twitese架设在多个不同的php主机上,躲避功夫网的封锁。

用另一种语言重写一个网站比想象中要容易,至少前端几乎不用改。php版的twitese与GAE版的几乎完全一样,随便看看与排行榜是通过GAE版的twitese开放出API进行调用,由于怕原版的twitese流量不足,所以另开了一个GAE重新抓取数据,所以开放出来的用户数据量没有原版的twitese那么多,随便看看里的更新也没原版那么频繁,但应该已经足够了。

开源

对开源协议没有了解多少,简单的说大家修改twitese是没有限制的,也不要求修改过后的twitese同样要开源。这次发布得有点仓促,小错误应该挺多,大家碰到的话可以在这里提一下~希望有热心的人能一起改进twitese~

开源项目主页:http://code.google.com/p/twitese/(因被墙,改为http://tuite.googlecode.com)

预览:http://twitese.webbang.net/

特点

1.相对于dabr,twitese对php空间要求低

dabr对php空间要求如下:

* PHP 5.2+
* curl PHP module
* mcrypt PHP module
* mod_rewrite apache module

而twitese只需要curl PHP module,另外我在本地测试的php版本是5.2.6,没有在其他版本的php上测试过,应该问题不大。

2.twitese主要是作为web客户端,但完整支持手机ucweb浏览,网页上JavaScript的各种操作都留有后路,即使浏览器禁用JavaScript也能正常使用,所以对不太支持JavaScript的手机浏览器也是友好的。

3.twitese可以架设在国外空间,也可以架设在国内空间,只需修改twitter api为未被封的api proxy即可。

待增加的功能

1.OAuth认证:本来是想一开始就做的,由于有其他事情要做,精力有限,就暂时没有这个功能了。不过对于中国用户来说,这个功能可有可无,因为需要翻墙。

2.短网址:目前还没有提供短网址功能,待增加~

安装教程

下载源文件:
方法一:通过SVN工具下载:http://twitese.googlecode.com/svn/trunk/ 此下载方法可以保证下载的是最新的程序。
方法二:进入项目主页 点击右边的Featured downloads下载压缩后的源程序。此方法不保证下载到最新的程序。
(目前程序不稳定,随时会更新错误,请使用SVN工具下载确保得到最新程序)

下载后,打开lib/config.php,按上面的说明修改一些参数,修改完后,传到php空间,就能使用了。

(更多…)