新博客地址:http://gorthon.sinaapp.com/
注:本文为了叙述方便,没有将UI与逻辑分离。本文只是介绍方法,至于代码的可读性,还请原谅。
1. 获取API Key和SECRET,在创建应用的时候会告诉你这两个值。
以下是一些全局变量:
APIKEY = '11111111111111111' # 这里假设用1表示获得的api key
SECRET = '2222222222222222' # 这里假设用2表示获得的secret
ACCESS_TOKEN = ''
# 获取Authorization Code 的URI
AUTHORIZATION_URI = 'https://graph.renren.com/oauth/authorize'
# 获取Access Token 的URI
ACCESS_TOKEN_URI = 'https://graph.renren.com/oauth/token'
# 人人API Server URI,以后通过POST的方式获取数据,都从这个URI获得
API_SERVER = 'http://api.renren.com/restserver.do'
得到access token之后现在不用session key了。查看详情
2. 引导用户授权
url = '%s?client_id=%s&redirect_uri=http://graph.renren.com/oauth/login_success.html&response_type=token&display=popup' % (AUTHORIZATION_URI, APIKEY)
print url
将打印出来的url输入浏览器就会进入授权页面
这里我用了PyQt4所以直接在客户端里面嵌入了一个QWebView
def oauth(self):
url = QUrl('%s?client_id=%s&redirect_uri=http://graph.renren.com/oauth/login_success.html&\
response_type=token&display=popup' % (AUTHORIZATION_URI, APIKEY))
self.web_view.load(url)
这样就可以直接在客户端嵌入的浏览器里面进行用户授权。这里由于要拦截授权后的一个url(因为这个url里面包含了access token),要响应QWebView的urlChanged信号,
所以事先在__init__中设置self.web_view.urlChanged.connect(self.urlChanged)
然后:
def urlChanged(self, url):
url = unicode(url.toString())
if url.find('access_token') > 0:
global ACCESS_TOKEN
try:
ACCESS_TOKEN = re.findall(r'access_token=(.*)&', url)[0]
QMessageBox(
QMessageBox.Information,
u'授权成功',
u'您已成功为此程序授权!',
).exec_()
except IndexError:
ACCESS_TOKEN = ''
file('./conf.txt', 'w').write('access_token:%s' % ACCESS_TOKEN)
这里我只是简单的将access token保存在了一个txt文件中。
这样之后,基本上就算是完成一半了,以后都要代上这个ACCESS_TOKEN进行POST。
3. sig的计算以及POST
为了安全起见,需要将POST的参数进行签名认证。
计算sig的方法,这里借用官方的demo:
def _getParams(self, params):
params['sig'] = self._getSig(params)
return params
def _getSig(self, params):
return hashlib.md5(''.join(['%s=%s' % (x, params[x])
for x in sorted(params.keys())]) + SECRET).hexdigest()
这两个也可以组合成一个函数来用。其中_getSig为计算要POST的参数的字典,此时字典里面不包含sig(因为还没有计算出来……),然后返回计算好的sig(一个md5值)。这样以后在要POST的时候将要POST的字典进行下面类似操作即可:
params = {'uid':'10086', 'name':'shuji'}
params = _getParams(params)
post(url, params)
像上面这样的伪代码就可以了。
这里我进行了简单地“封装”,就不用像上面这样写这么多代码:
def post(self, params):
'''
返回一个json格式的字典
'''
result = json.loads(self.net.post(API_SERVER, self._getParams(params)))
if isinstance(result, list):
return result[0]
return result
以后要POST的时候只需:
params = {'uid':'10086', 'name':'shuji'}
self.post(params)
就可以了。注意:这里默认的POST的url是API_SERVER。
其中有个self.net.post这个是我另外写的一个专门用来POST的类,因为这个代码可以我经常用,我就直接拉过来还用了。
代码如下(netbase.py)
# _*_ encoding:utf-8 _*_
import urllib2
import urllib
import cookielib
class Net(object):
def __init__(self):
self.cookie = cookielib.LWPCookieJar()
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
self.opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1;\
zh-CN; rv:1.9.2.3) #Gecko/20100401 Firefox/3.6.3')]
urllib2.install_opener(self.opener)
def post(self, url, params):
return self.opener.open(urllib2.Request(url, urllib.urlencode(params))).read()
def get(self, url):
return self.opener.open(urllib2.Request(url)).read()
4. 使用举例
比如我们要获取某个用户最近来访好友的列表:
def getVisitors(self):#获得某个用户最近来访的列表
info = ''
visitors = self.post({'access_token':ACCESS_TOKEN,
'method':'users.getVisitors', 'v':'1.0', 'format':'JSON'})[u'visitors']
for visitor in visitors:
#print visitor[u'name'], visitor[u'time'], visitor[u'uid'], visitor[u'headurl']
info += '%s, %s, %s, %s\n' % (visitor[u'name'], visitor[u'time'], visitor[u'uid'], visitor[u'headurl'])
self.label.setText(u'最近访问好友列表:\n%s' % info)
可以用一个QLabel来显示最近访问好友的列表,当然如果你要显示头像也是可以的,如下:
head = QPixmap()
head.loadFromData(self.net.get(vistor[u'headurl']))
self.label_head.setPixmap(head)
其余的到官网的API文档里面看就是了, 猛击这里。
代码就不上传了,写得很烂。
应网友要求,放到Github上面了,以后不要在这里求代码了哈。https://github.com/Shu-Ji/xiaonei_oauth
最后来几张烂图: