2008年5月27日

有备无患:增强豆瓣收藏对话框的 Greasemonkey 脚本

经常使用 del.icio.us 的人,一定也很熟悉 del.icio.us 的跟随键盘输入自动提示标签(Tag Suggest)的功能。它为用户管理大量的标签带来方便,比如不必去费神记忆单词的拼写,避免为同一语义定义多个标签等。这是靠我们的大脑来记忆管理,或者类似豆瓣只提供10个最常用的标签,不能做到的。

这个 Greasemonkey 脚本的主要功能,是为豆瓣收藏对话框提供类似 del.icio.us 的标签提示功能。另外还重新布置了读过/在读/想读等按钮的布局,并添加了删除收藏的按钮。

目前脚本的版本为0.1,欢迎试用。有什么建议或意见,欢迎留言:-)


Screenshot - Enhanced Douban Collecting Dialog

功能

  • 类似 del.icio.us 的随输入自动提示标签(Tag Suggest)
  • 重新安排了读过/在读/想读等按钮的布局,保证 UI 路径的一致性
  • 增加了删除收藏的按钮

下载

下载脚本


2008-05-31 UPDATE

脚本更新至0.2,有下列更新

  • 增加了对个人收藏页,标签页,豆瓣猜,TOP250等页面中的收藏对话框的支持
  • 修正了之前脚本中已知的 BUG

标签: , ,

2008年5月9日

有备无患:在 Google App Engine上应用豆瓣 API 的授权认证

上次说到了在 App Engine 上应用的豆瓣的 Python 客户端,但是那个版本(0.1.1)的客户端并没有包括 OAuth 授权认证的功能。如果想要让用户授权,以访问那些受保护的资源,以及添加、修改或删除用户的收藏,需要从豆瓣 Python 客户端的 SVN 中获取最新的开发版本(r22)。据豆瓣的开发人员 hongqn 说,OAuth Client 基本开发完毕,已经进入内测 bug 的阶段。

和 GData Python 客户端一样,开发版本的 OAuth Client 也是用 Python 自带的 httplib 模块来处理 HTTP 请求,所以原始的客户端不能直接在 App Engine 上使用,必须先将 httplib 替换成 urlfetch。现在只需要修改两个函数,但是豆瓣如果能像 GData Python 客户端一样把使用 httplib 的部分封装起来,甚至提供一个使用 urlfetch 的替换模块就更好了,希望豆瓣能采纳这个建议。下面是具体步骤,如果有什么问题,还请留言告知。

1,从 trunk 中 checkout 最新的豆瓣 Python 客户端开发版本
$ svn co http://douban-python.googlecode.com/svn/trunk/ douban-python/

2,修改客户端的 OAuth Client
$ cp douban-python/douban ~/doupye/douban -rf
$ cd ~/doupye/douban/
$ gvim client.py

client.py

# import httplib
from google.appengine.api import urlfetch

class OAuthClient:
    ... ...
    def fetch_token(self, oauth_request):
        # 被注释掉的是原来使用 httplib 的部分
        # connection = httplib.HTTPConnection("%s:%d" % (self.server, 80))
        # connection.request('GET', oauth_request.http_url,
        #     headers=oauth_request.to_header())
        # response = connection.getresponse()
        # r = response.read()
        url = oauth_request.http_url
        result = urlfetch.fetch(url, headers=oauth_request.to_header())
        r = result.content
        ... ...

    def access_resource(self, method, url, body=None):
        ... ...
        # connection = httplib.HTTPConnection("%s:%d" % (self.server, 80))
        # connection.request(method, url, body=body,
        #     headers=headers)
        # return connection.getresponse()
        result = urlfetch.fetch(url, payload=body, method=method, headers=headers)
        return result.content

3,使用 OAuth 授权的过程如下,在 App Engine SDK 提供的控制台(Interactive Console)中运行:
from douban.client import OAuthClient

client = OAuthClient(key=MY_API_KEY, secret=MY_SECRET)

# 获取未授权的Request Token
key, secret = client.get_request_token()
print key, secret
>>> c14023315549fe3743c17993ff4dfaa5 91af6245103ec3b7

# 获取请求用户授权的页面的 URL
url = client.get_authorization_url(key, secret)
print url
>>> http://www.douban.com/service/auth/authorize?oauth_token=a9e487ac36e0ba9efdba970534a22fce

# 将 URL 复制到浏览器中,用户可以选择同意或者拒绝授权

# 用户完成授权后,使用授权后的 Request Token 换取 Access Token
key, secret = client.get_access_token(key, secret)
if key:
    # 使用 Access Token 登录
    login = client.login(key, secret)
    print login
>>> True

# 访问受保护资源
collections = client.access_resource(method='GET',
    url='http://api.douban.com/people/wyt/collection?cat=book')
for entry in collections.entry:
    print entry.title.text
>>>
听过 人として軸がぶれている
想读 Antipatterns
想读 新企业的起源与演进
看过 .hack//G.U. Trilogy
想听 ワイルドストロベリー
在听 The Flower Book
在听 E=MC²
听过 越长大越孤单
想读 Investing 101
想读 The Ecology of Commerce

标签: , ,

2008年4月21日

有备无患:在 Google App Engine 上应用豆瓣 Python 客户端

Google App Engine 是 Google 四月初推出的一个网络应用开发平台,它提供了一体化的分布式服务器群、供快速开发的网络应用开发框架、最多500MB的数据存储,以及可自动升级的后台流量统计服务。换言之,App Engine 让开发人员专注于应用本身,Google 将提供应用运行及维护所需要的一切平台资源。

App Engine 目前只支持 Python 作为唯一的开发语言(wyt:谁让“Python 之父” Guido van Rossum 也在 Google 工作呢,近水楼台先得月)。所以,如果想在 App Engine 上利用豆瓣开放的书影音和用户数据,我们可以使用豆瓣提供的 Python 客户端来开发。另外,由于以前的 GData Python 客户端 都是用 httplib 模块来处理 HTTP 请求,而 App Engine 则规定必须通过其自带的 urlfetch 才能实现,所以为了让豆瓣 Python 客户端所必须的 gdata.service 模块能够正常的在 App Engine 上工作,我们还需要版本号大于1.0.12.1的 gdata-python-client。下面是具体步骤,如果有什么问题,还请留言告知。

1,下载 gdata.py-1.0.12.1.tar.gz
2,解压缩到当前目录,并编译 gdata

$ tar xf gdata.py-1.0.12.1.tar.gz
$ cd gdata.py-1.0.12.1/
$ ./setup.py build

3,将编译好的 atom 和 gdata 目录复制到项目目录 ~/doupye/

$ cp build/lib/* ~/doupye/

4,下载 douban-python-0.1.1.tar.gz
5,解压缩到当前目录,并编译 douban-python

$ cd ..
$ tar xf douban-python-0.1.1.tar.gz
$ cd douban-python-0.1.1/
$ ./setup.py build

6,将编译好的 douban 目录复制到项目目录 ~/doupye/

$ cp build/lib/* ~/doupye/

7,修改豆瓣的 Python 客户端文件 service.py

$ cd ~/doupye/douban/
$ gvim service.py

service.py

import gdata.service
# 添加下面两行,让所有的 HTTP 请求调用 App Engine 的 urlfetch (?)
import gdata.urlfetch
gdata.service.http_request_handler = gdata.urlfetch


演示网页

http://doupye.appspot.com/demo/douban_python_client/

标签: , ,

2008年4月16日

有备无患:订阅所有豆瓣用户的广播

以前写过输出单个用户的友邻广播 feeds 的脚本,后来豆瓣把原来的“友邻”一分为二成双向的“朋友”和单向的“关注”,那个脚本就过时了。所以我重写了 pydmb.py,并让它能够输出多层友邻关系的豆瓣广播 feeds 的 OPML 文件根据六度分割理论,平均只需要六层关系就可以联系到任何两个互不相识的人。那么,从任何一个豆瓣用户出发输出六层友邻关系的广播,是不是最终也可以得到几乎所有豆瓣用户的广播呢?我没有试过,因为即使只输出了两层友邻关系的广播,我已经得到 8825个 feeds,如果输出六层的话会吓到人的。

使用方法

1,下载 pydmb.py

pydmb-0.2.tar.gz

2,解压缩到当前目录。

3,运行脚本。这里举一个例子,比如你想获得 keso阿北的三层朋友(不包括他们关注的人)的广播 feeds,可以输入命令:

$ ./pydmb.py keso ahbei --friend --depth 3

4,需要帮助可以运行命令:

$ ./pydmb.py --help
Usage: python pydmb.py [-fc] [-d DEPTH] user1 user2 ...

Options:
  -h, --help            show this help message and exit
  -f, --friend          output douban miniblog rss of your friends
  -c, --contact         output douban miniblog rss of your contact
  -d DEPTH, --depth=DEPTH
                        the depth of relationship to output


2008-04-18 UPDATE:

NullPointer 留言说想看看六度连接的试验结果,我也很感兴趣,所以昨天先试了试二度和三度的连接。结果从阿北出发的二度空间能连接到10214个人,三度空间能连接到117113个。

>>> from pydmb import *
>>> graph = UserGraph('ahbei')
>>> graph.search(2, 'fc')
>>> len(graph.dict.keys())
10214
... ...
>>> graph.search(3, 'fc')
>>> len(graph.dict.keys())
117113

结果还算理想,可是用的时间比较厉害,二度连接还好只用了十几分钟,但三度连接用了将近八个小时。照这样推算,分析六度连接(理论上说,就是要分析将近140万豆瓣用户的朋友和关注的人)可能会超过800个小时。所以用这个脚本来做就不太现实了,如果要做的话,最好把 urllib2BeautifulSoup 换成更快的库,然后用两个线程分别来抓取和分析网页,这样效率会高一些。

标签: ,

2007年11月26日

有备无患:如何在GTalk / Skype / MSN上收听豆瓣的友邻广播

友邻广播是豆瓣的Twitter式微内容发布服务。令人遗憾的是,和Twitter不同,豆瓣广播既不能通过IM或手机收发内容,也不能通过API扩展功能。对于广播的深度中毒者,可能希望至少能够在IM里接收,这里有一个能够在GTalk / Skype / MSN上收听友邻广播的办法。

如何在GTalk / Skype / MSN上收听豆瓣的友邻广播

第一步,抓取友邻们的广播feed。如果你不希望全手动去找的话,我写了一个简单的自动抓取这些feed的python脚本pydmb.py。

下载pydmb.tar.gz

不过,首先你需要安装PythonuTidyLib。(wyt:Python有啥自带又好用的htmltidy库?)

Linux上大多默认装有Python,所以只需安装uTidyLib。如果你使用Gentoo的话,可以直接emerge:

# echo "dev-python/utidylib ~x86" >> /etc/portage/package.keywords
# emerge -av utidylib

下载pydmb.tar.gz之后,解压缩到当前目录,然后运行:

$ python pydmb.py -u uid
(比如,我的豆瓣主页是:http://www.douban.com/people/wyt/,那么我的uid就是wyt。)

脚本执行完之后,你会在目录下找到一个export.opml文件,里面包含了所有友邻的feed。

第二步,在哪吒上订阅这些feed。哪吒是一个feed的订阅、提醒与分享服务,通过哪吒的GTalk/Skype/MSN机器人,可以在这些IM上获得feed更新消息。你可以在哪吒上导入刚才用脚本输出的OPML文件。然后,按照哪吒的说明,你还需要在GTalk、Skype或者MSN上添加哪吒的IM机器人。

大功告成,等着哪吒抓取这些feed就好。以我的经验来看,第一次抓取的等待时间比较长,大约花了四个小时哪吒才开始陆陆续续处理这些feed。不过之后的更新速度还不错,一般在7~14分钟内都会把最新的广播推送过来。另外,导出的OPML文件也可以一样用于Google Reader和抓虾等feed阅读器,或者其他和哪吒类似的IM机器人。
如果有什么意见建议或bug,无论是在这里,还是在pydmb.py脚本的项目主页上都欢迎留言。下一步我希望可以抓取更多层关系的友邻广播feed,也就是说可以看到朋友的朋友的。。。朋友的朋友的广播。不过要等到豆瓣有友邻的API以后。

标签: , ,

2007年11月10日

悠言悠闲:豆瓣新界面测试中

欢迎到flickr继续讨论豆瓣新界面

豆瓣开始了新版界面的前期测试

新版界面最突出的变化就是采用了当下流行的标签式导航栏——把所有的导航链接想象成笔记本或字典上的方便识别和翻页的标签,选中的标签在最前端高亮显示,而未选中的在后端被淡化,Amazon的导航栏大概是最著名的范例。

新版还在读书电影音乐的首页新增了最关注的书籍/电影/音乐的最新评论和讨论。这也许是这次改版中最出彩的功能,只是豆瓣“很小气的”只给出了8篇最新评论和15个最新讨论,也没有提供feed。

另一个彩蛋是豆瓣又丰富了广播的功能:在广播中显示友邻想看、在看、评论过的书/电影/音乐的封面;把广播更细化分作书影音,友邻说,小组,评论和博客,以及推荐。

豆瓣终于推出了自己的排行榜,不过目前只有新书榜和豆友读过最多的书。读书/电影/音乐的首页新增加了友邻关注的书影音。另外,豆瓣还把所有链接的下划线给去掉了。

总的来说,新版豆瓣增加了很多新体验的同时,也很好的保留了豆瓣特色,不会让用户产生“啊咧,我是不是‘走’错网站了?”的感觉。不过在“享受”了GMail2.0和它那重写过的javascript带来的“快感”之后,能明显感觉到豆瓣的jQuery反应比较慢,虽然换成Dojo、prototype或者其他Ajax库大概速度上也没差,不知道豆瓣能否这方面有所改善。好在域名中的alpha也说明了开发状态,所以功能还不完善,bug也比较多。继续期待新版的改进。

另外,我发现9点的测试页面似乎也准备就绪了,什么时候会开工呢?

标签: ,

2007年3月4日

南言北哲:豆瓣和IMDb

刚发现平野绫Canvas2~七彩素描~中也有出演,她是我最喜欢的声优之一,虽然只是一个小角色,我还是打算把这部动画添加到我的豆瓣中去。但是,很快我就发现了一个问题,这部动漫迷中口碑相当不错的动画,无论是在豆瓣上,还是IMDb上都找不到它的影子。我决定剑走偏锋,hack一下豆瓣,用一个并不存在的imdb编号提交上去,作为Canvas2的编号。然后我在日文Wiki中文Wiki上还没有这个条目)上找到了Canvas2的资料,把监督和声优等资料补充完整,甚至小有私心的把平野绫也添加到主演当中。以后搜索“平野绫”,别人就会和我一样发现,“啊~原来綾ちゃん在Canvas2中也有出演。”

但是我也点担心,这样的“非法”条目是否会在某一天不知不觉地就被删除了呢?

每天,一些希望把心爱的电影添加到豆瓣中,却在IMDb上失望而回的豆友们,可能会像我一样添加一些“非法”条目;每天,另一些坚持游戏规则的豆友们,会把那些重复的条目或者滥用imdb的条目,报告给豆瓣;而每天,豆瓣的管理员brant总是尽忠职守的完成工作,删除这些被发现的“非法”条目。但是,这可能是一场以一敌万的战争。“很多用户发现某部电影没有,imdb也找不到,他就擅自加了,他们甚至不知道可以找管理员来加……这究竟是谁的过失呢?”玉米^ō^麦兜经常会向豆瓣bug小组提交一些重复条目。“有些(电影)是因为豆瓣先用临时编号添加了,imdb编号后来才放出,所以重复了。”brant说,合并重复条目的功能正在开发中。

那些IMDb上没有列出的电影,豆瓣也不是完全拒之于门外。官方的解决方法是,向管理员申请添加这些电影。在豆瓣帮助论坛上,经常可以看到“添加某某电影”的请求。其中的一部分,可以得到满意的答复,因为这部电影已经收录到IMDb的数据库中,只是没有被发现罢了。或者,更确切地说,用户只是没有找到“如何发现”的窍门,尤其是如何发现非欧美语言的电影。有些困难来自于特有名词的翻译,比如,三部哪咤“主演”的电影就有两种翻译,Nazha和Nezha;而有些则是翻译格式的混乱,以日文动画为例,IMDb上的翻译有时全用罗马拼音,有时全用英语翻译,有时则是平假名用罗马拼音,片假名用相应的英文单词。模糊匹配的结果,几乎不能提供任何的帮助,它是针对欧美用户的语言习惯而开发的。

如果有些电影确实没有imdb编号,管理员会寻找一些临时的解决办法,比如添加临时编号之类的,但前提可能是它要有足够的人气或者足够的幸运,比如“银魂”、“死亡笔记”等;不然,可能就像“摸摸姜”同志一样,准备了一整页的材料,但是壮志未酬身先死,最后被告知,“目前还不添加没有imdb编号的剧集,抱歉。”

豆瓣希望保证条目的准确性与权威性。但是,是不是有了imdb编号的条目就能做到准确和权威,而没有imdb编号的条目就必定是粗制滥造的呢?

顺便说,平野绫算是声优中的劳模了。从2002年出道至今,共出演过17部TV动画,豆瓣上有8部,而3部是没有所谓的“非法”条目,Canvas2~七彩素描~是其中之一。

标签: , ,