Skip to content
michaelliao edited this page Jul 21, 2012 · 5 revisions

新浪微博API OAuth 1 Python客户端

最新源码

https://github.com/michaelliao/sinaweibopy/blob/master/src/weibo1.py

使用简介

注册微博App后,可以获得app key和app secret,然后定义网站回调地址:

from weibo1 import APIClient, OAuthToken

APP_KEY = '1234567' # app key
APP_SECRET = 'abcdefghijklmn' # app secret
CALLBACK_URL = 'http://www.example.com/callback' # callback url

在网站放置“使用微博账号登录”的链接,当用户点击链接后,引导用户跳转至如下地址:

client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, callback=CALLBACK_URL)
request_token = client.get_request_token()
# 保存request_token:
save_request_token_to_db(request_token.oauth_token, request_token.oauth_token_secret)
url = client.get_authorize_url(request_token)
# TODO: redirect to url

用户授权后,将跳转至网站回调地址,并附加参数oauth_token和oauth_verifier:

# 获取URL参数:
oauth_token = your.web.framework.request.get('oauth_token')
oauth_verifier = your.web.framework.request.get('oauth_verifier')
# 使用oauth_token查表获取上一步保存的oauth_token_secret:
oauth_token_secret = load_request_token_secret_from_db(oauth_token)
# 构造完整的request token:
request_token = OAuthToken(oauth_token, oauth_token_secret, oauth_verifier)
# 用request token获取access token:
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, token=request_token)
access_token = client.get_access_token()
# 通过access token调用一个API获取用户uid信息:
client = APIClient(_APP_KEY, _APP_SECRET, access_token)
account = client.account__verify_credentials()
uid = account.id
# 保存uid和access token以后使用:
save_access_token_to_db(uid, access_token.oauth_token, access_token.oauth_token_secret)

然后,可通过access token调用任意API:

user_id = 12345
access_token = load_access_token_from_db(user_id);
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, token=access_token)
print client.get.statuses__user_timeline()
print client.post.statuses__update(status=u'测试OAuth 1发微博')

API调用规则

首先查看新浪微博API文档,例如:

API:statuses/user_timeline

请求格式:GET

请求参数:

source:string,采用OAuth授权方式不需要此参数,其他授权方式为必填参数,数值为应用的AppKey?。

access_token:string,采用OAuth授权方式为必填参数,其他授权方式不需要此参数,OAuth授权后获得。

uid:int64,需要查询的用户ID。

screen_name:string,需要查询的用户昵称。

(其它可选参数略)

调用方法:将API的“/”变为“__”,并传入关键字参数,但不包括source和access_token参数:

r = client.get.statuses__user_timeline(uid=123456)
for st in r.statuses:
    print st.text

若为POST调用,则示例代码如下:

r = client.post.statuses__update(status=u'测试OAuth 1.0发微博')

若为上传调用(Multipart Post),传入file-like object参数,示例代码如下:

f = open('/Users/michael/test.png')
r = client.upload.statuses__upload(status=u'测试OAuth 1.0带图片发微博', pic=f)
f.close() # APIClient不会自动关闭文件,需要手动关闭

考虑到大部分调用是GET操作,get可省略,例如,以下两种写法是等价的:

r = client.statuses__user_timeline(uid=123456)
r = client.get.statuses__user_timeline(uid=123456)

使用限制

仅支持Web方式调用,不支持口令方式验证。

补充说明

所有API调用均为动态调用,需要根据新浪API文档由HTTP调用方式(GET,POST或POST Multipart)决定APIClient的属性(get,post或upload),方法名(新浪微博API名称替换“/”为“__”),以及关键字参数。

若调用出错,会抛出APIError异常,该异常包含error_code,error和request三个字段,与新浪返回的出错json对应。具体错误原因请查询新浪文档。

若HTTP响应出错(例如404),会抛出urllib2.HTTPError异常。