-
Notifications
You must be signed in to change notification settings - Fork 501
OAuth1 HOWTO
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: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异常。