使用命令行+xauth方式更新饭否消息的脚本

饭否API将于2012.01.01起,不再支持Basic认证方式了。对于习惯了命令行方式更新饭否消息的人来说,是个坏消息⋯⋯不过,XAuth方式也不错。下面是我整理的方法,供感兴趣者参考。下面的程序在Ubuntu11.10下正常运行。

Basic 认证 v.s. OAuth 认证

简言之,Basic认证是使用Base64算法加密用户名、密码,该算法是可逆的;Oauth认证是使用不可逆的算法(例如HMAC-SHA1)计算签名,用来认证、确定请求者身份。可以参考如下链接:

脚本工具

使用脚本每次生成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
  • curlicuecurlicue-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真是一门很方便、很强大的语言。
  1. markdown 写的??

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>