饭否API将于2012.01.01起,不再支持Basic认证方式了。对于习惯了命令行方式更新饭否消息的人来说,是个坏消息⋯⋯不过,XAuth方式也不错。下面是我整理的方法,供感兴趣者参考。下面的程序在Ubuntu11.10下正常运行。
Basic 认证 v.s. OAuth 认证
简言之,Basic认证是使用Base64算法加密用户名、密码,该算法是可逆的;Oauth认证是使用不可逆的算法(例如HMAC-SHA1)计算签名,用来认证、确定请求者身份。可以参考如下链接:
- OAuth基本流程简介
- 在线调试OAuth的工具 OAuth Test Client
脚本工具
使用脚本每次生成HMAC-SHA1签名太复杂,何况是使用Bash脚本方式。不过有高人已经写好了代码,我们Fork来用就可以了。我基于decklin/curlicue,Fork 之以便发送饭否消息。修改的地方包括:
- 摒弃全局的Oauth方式,明确指定为只处理饭否Xauth认证;
-d|--data|-F模式为POST请求,其它为GET。- 添加对含中文、空格、多个空格的消息的支持。
饭否版curlcue在这里:zhasm/curlicue。
如果你是开发者,而且已经申请了自己的consumer token/secret,可以使用方法如下:
- 将curlicue 代码clone到本地:
git clone git://github.com/zhasm/curlicue.git- 将
curlicue和curlicue-setup加入$PATH中。- 调用
curlicue-setup,生成token。默认放置在$HOME/.fftoken/$fanfouid.token文件中。按提示输入各个选项值即可。例如图示:- 此时已经做好了身份验证,以下就是如何调用API了。
1
2
3
4
5
6
7 #post message
curlicue -f $HOME/.fftoken/test.token -- -d "status=hello world" http://api.fanfou.com/statuses/update.xml
#or
curlicue -f $HOME/.fftoken/test.token http://api.fanfou.com/statuses/update.xml -d "status=helloworld"
#post image
curlicue -f ~/.fftoken/test.token http://api.fanfou.com/photos/upload.xml -F 'photo=@Selection_023.png' -F status='st'- 以上两例已经能够说明用法,你可以举一反三。
其它事项
- 在调试Oauth/Xauth时,如果出错,请时时留意
Expected Basestring的输出,并使用-v模式来观测自己程序的输出。我就是使用这种方法,一点一点调试中文、空格消息的。- 虽然饭否无差异地支持JSON/XML输出模式,但在Bash下最好使用XML格式的API。原因是格式清晰。
- 上面的发消息、发图的例子很直白,但不简洁。其实可以使用Bash的Alias/Function封装一下,以便更好记。 例如封装成
ff发饭否消息,fimg发图,等等,你懂的。- Bash命令行里,
--表示清空参数设置。因此命令
1 curlicue -f $HOME/.fftoken/test.token -- -d "status=hello world" http://api.fanfou.com/statuses/update.xm以该符号为界,前半部分的参数由
curlicue响应;后半部分的参数则由curl响应。详细可见源码。- Bash真是一门很方便、很强大的语言。

markdown 写的??
vim手写html。
强~