人人开放平台客户端OAuth认证及API的使用[python]

新博客地址: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


最后来几张烂图:







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 34
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值