博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

玩转StausNet API

Posted on 2011-08-28 11:08  三块石头  阅读(458)  评论(0)    收藏  举报

    公司最近搭建一个创新微博,系统基于StatusNet,由于StatusNet的Web界面不怎么友好(相对于新浪微博、腾讯微博),就研究了下StausNet的API,想自己写个桌面程序玩玩 :-)

  从官方文档来看,StausNet兼容Twitter API,文档可以参见http://status.net/wiki/Twitter-compatible_API。不过StausNet正在开发中,有些接口和Twitter API还是有所区别的,大家可以参考上面的链接。

  先看个简单的例子,我们来发送一条信息:

#coding=utf-8
import urllib2
import urllib
import base64
data=urllib.urlencode({"status":"I love python!"})
request
= urllib2.Request("http://localhost/weibo/index.php/api/statuses/update.json",data=data)
request.add_header(
"Authorization","Basic %s"%(base64.b64encode("jluflyingzl:password")))
res
=urllib2.urlopen(request)
print res.read()

  返回的结果如下:

{"text":"I love python!","truncated":false,"created_at":"Sun Aug 28 11:04:59 +0800 2011","in_reply_to_status_id":null,"source":"api","id":26,"in_reply_to_user_id":null,"in_reply_to_screen_name":null,"geo":null,"favorited":false,"user":{"id":1,"name":"jluflyingzl","screen_name":"jluflyingzl","location":null,"description":null,"profile_image_url":"http:\/\/localhost\/weibo\/avatar\/1-48-20110827115139.jpeg","url":null,"protected":false,"followers_count":0,"profile_background_color":"","profile_text_color":"","profile_link_color":"","profile_sidebar_fill_color":"","profile_sidebar_border_color":"","friends_count":0,"created_at":"Sat Aug 27 19:41:34 +0800 2011","favourites_count":1,"utc_offset":"0","time_zone":"UTC","profile_background_image_url":"","profile_background_tile":false,"statuses_count":24,"following":true,"statusnet:blocking":false,"notifications":true,"statusnet_profile_url":"http:\/\/localhost\/weibo\/index.php\/jluflyingzl"},"statusnet_html":"I love python!"}

  效果如下:

  如果是通过web页面发送的消息,消息上会显示:“通过网页”;如果是通过程序调用,就会显示“通过api”,我们可以通过程序改变这些字符。

data=urllib.urlencode({"status":"I love python!","source":"My API"})

  增加一个source属性,发送消息后,页面上就会显示 消息“通过My API”发送。

  只发送一个消息很没趣,我们上传个图片吧。参考StausNet的官方API,我们只需要增加一个media属性即可,但是post的数据必须是multipart/form-data的格式,这个其实就是html中的表单提交。由于urllib2不支持,我们需要用poster这个类(可以通过easy_install安装)。由于我本机的StausNet微博存在一些问题,所以我选择官方的微博https://qq.status.net/flyingzl/

#coding=utf-8
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2
import base64

# 在 urllib2 上注册 http 流处理句柄
register_openers()

# 开始对文件 "a.jpg" 的 multiart/form-data 编码
#
"media" 是参数的名字,一般通过 HTML 中的 <input> 标签的 name 参数设置
# headers 包含必须的 Content-Type 和 Content-Length
#
datagen 是一个生成器对象,返回编码过后的参数
datagen, headers = multipart_encode(
{
"status": "一个简单的测试", "source": "flyingzl", "media": open("a.jpg", 'rb')}
)

# 创建请求对象
request = urllib2.Request("https://qq.status.net/index.php/api/statuses/update.json ", datagen, headers)
request.add_header(
"Authorization", "Basic %s" % (base64.b64encode("flyingzl:password")))
# 实际执行请求并取得返回
res = urllib2.urlopen(request)
print res.read()

  效果如下:

  其实还是比较简单的,接下来我想用wxPython写个桌面客户端,希望可以完成 :-)