新浪微博API OAuth2 python客户端改进
来源:互联网 发布:科比跟腱断裂赛季数据 编辑:程序博客网 时间:2024/05/23 10:34
#!/usr/bin/python# -*- coding:utf-8 -*-from weibo import APIClientimport urllib,httplib,codecsAPP_KEY="APP_KEY"APP_SECRET="APP_SECRET"CALLBACK_URL="CALLBACK_URL"userId = 'userId'passwd = 'passwd'uid = uidclient = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)url = client.get_authorize_url()def get_code():conn= httplib.HTTPSConnection('api.weibo.com')postdata = urllib.urlencode({'client_id':APP_KEY,'response_type':'code','redirect_uri':CALLBACK_URL,'action':'submit','userId':userId,'passwd':passwd})conn.request('POST','/oauth2/authorize',postdata,{'Referer':url,'Content-Type':'application/x-www-form-urlencoded'})res = conn.getresponse()x = str(res.getheader('location'))xh = "?code="pa = x.find(xh)code = x[pa+6:]conn.close()return codecode = get_code()r = client.request_access_token(code)access_token = r.access_token expires_in = r.expires_in client.set_access_token(access_token, expires_in)x = client.statuses.friends_timeline.get(count=100)f = codecs.open('/home/yuanyunxu/test/weibo.text','w+','utf-8')for st in x.statuses:print st.textf.write(st.text)f.close()
特点:
- 使用了新浪微博python sdk中的weibo.py
- 定义了get_code()函数,能够自动返回code值
OAuth2.0机制:
有关httplib模块:
httplib是一个相对底层的http请求模块,其上有专门的包装模块,如urllib内建模块,goto等第三方模块,但是封装的越高就越不灵活,比如urllib模块里请求错误时就不会返回结果页的内容,只有头信息,对于某些需要检测错误请求返回值的场景就不适用,所以就得用这个模块了。
1、class httplib.HTTPConnection
该类用于创建一个http类型的请求链接
原型:
HTTPConnection(host[, port[, strict[, timeout]]])
host: 请求的服务器host,不能带http://开头
port: 服务器web服务端口
strict: 是否严格检查请求的状态行,就是http1.0/1.1 协议版本的那一行,即请求的第一行,默认为False,为True时检查错误会抛异常
timeout: 单次请求的超时时间,没有时默认使用httplib模块内的全局的超时时间
[python] view plaincopy 实例: conn1 = HTTPConnection('www.baidu.com:80') conn2 = HTTPconnection('www.baidu.com',80) conn3 = HTTPConnection('www.baidu.com',80,True,10) 错误实例: conn3 = HTTPConnection('www.baidu.com:80',True,10)
返回:
HTTPConnection类会实例并返回一个HTTPConnection对象
2、class httplib.HTTPSConnection
说明:
该类用于创建一个https类型的请求链接
原型:
HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout]]]]])
key_file:一个包含PEM格式的私钥文件
cert_file:一个包含PEM格式的认证文件
other:其它同http参数
实例:[python] view plaincopy conn3 = HTTPSConnection('accounts.google.com',443,key_file,cert_file,True,10)
返回:
同样返回一个HTTPSConnection对象
注意:
要创建https链接,必须要保证底层的socket模块是支持ssl的编译模式,即编译时ssl选项的开关是开着的
3、HTTPConnection对象request方法:
说明:
发送一个请求
原型:
conn.request(method, url[, body[, headers]])
method: 请求的方式,如'GET','POST','HEAD','PUT','DELETE'等
url: 请求的网页路径。如:'/index.html'
body: 请求是否带数据,该参数是一个字典
headers: 请求是否带头信息,该参数是一个字典,不过键的名字是指定的http头关键字
实例:
[python] view plaincopy conn.request('GET', '/', '', {'user-agent':'test'})
返回:
无返回,其实就是相对于向服务其发送数据,但是没有最后回车
4、HTTPConnection对象getresponse方法
说明:
获取一个http响应对象,相当于执行最后的2个回车
原型/实例:
[python] view plaincopy res = conn.getresponse()
返回:
HTTPResponse对象
5、HTTPConnection对象close()方法
说明:
关闭指定的httpconnect链接
实例:
[python] view plaincopy conn.close()
6、HTTPResponse对象read方法
说明:
获得http响应的内容部分,即网页源码
原型:
body = res.read([amt])
amt: 读取指定长度的字符,默认为空,即读取所有内容
实例:
[python] view plaincopy body = res.read() pbody = res.read(10)
返回:
网页内容字符串
7、HTTPResponse对象的其它方法或属性
方法:
getheaders()
获得所有的响应头内容,是一个元组列表[(name,value),(name2,value2)]
getheader(name[,default])
获得指定的头内容
fileno()
socket的fileno
属性:
msg
所有的头信息,和getheaders方法一样,只不过这个是原始未处理的字符串
status
当次请求的状态
version
当次请求的http协议版本,10是http1.0, 11是http/1.1
reason
当次请求的结果的表述内容,200是ok,404是Not Found
这个程序中用到的是getheader()方法,获取了Location的值,然后用字符串方法提取出code值。
conn.request('POST','/oauth2/authorize',postdata,{'Referer':url,'Content-Type':'application/x-www-form-urlencoded'})这一句中,postdata是携带的post数据,后面的字典是headers。
API调用规则
首先查看新浪微博API文档,例如:
API:statuses/user_timeline
请求格式:GET
请求参数:
source:string,采用OAuth授权方式不需要此参数,其他授权方式为必填参数,数值为应用的AppKey?。
access_token:string,采用OAuth授权方式为必填参数,其他授权方式不需要此参数,OAuth授权后获得。
uid:int64,需要查询的用户ID。
screen_name:string,需要查询的用户昵称。
(其它可选参数略)
调用方法:将API的“/”变为“.”,根据请求格式是GET或POST,调用get()或post()并传入关键字参数,但不包括source和access_token参数:
r = client.statuses.user_timeline.get(uid=123456)for st in r.statuses: print st.text
若为POST调用,则示例代码如下:
r = client.statuses.update.post(status=u'测试OAuth 2.0发微博')
若需要上传文件,传入file-like object参数,示例代码如下:
f = open('/Users/michael/test.png', 'rb')r = client.statuses.upload.post(status=u'测试OAuth 2.0带图片发微博', pic=f)f.close() # APIClient不会自动关闭文件,需要手动关闭
请注意:上传的文件必须是file-like object,不能是str,因为无法区分一个str是文件还是字段。可以通过StringIO把一个str包装成file-like object。
本程序是调用的朋友微博的接口。写入txt文件是,使用write方法默认为ascii,所以使用codecs模块,把编码方式改为utf-8.
运行结果截图如下:
- 新浪微博API OAuth2 python客户端改进
- 新浪微博Python客户端接口OAuth2
- 新浪微博Python客户端接口OAuth2
- 新浪微博Python客户端接口OAuth2
- 新浪微博Python3客户端接口OAuth2
- 新浪微博Python3客户端接口OAuth2
- 新浪微博API Oauth2.0 认证。。。
- 新浪微博API OAuth 2 Python客户端
- Python: 发送新浪微博(使用oauth2)
- 新浪微博OAUTH2验证
- 新浪微博OAuth2授权
- 新浪微博API OAuth1 Python3客户端
- 新浪微博API OAuth1 Python3客户端
- 新浪微博OAUTH2.0授权验证(基于SSO客户端验证)
- 基于新浪微博API Oauth2.0 javaSDK开发的WebAPI微博管家
- 新浪微博Oauth2.0授权 获取Access Token以及API的使用
- 新浪微博Oauth2.0授权 获取Access Token以及API的使用
- 新浪微博Oauth2.0授权 获取Access Token以及API的使用
- hdu 1272 小希的迷宫
- ios --- 动态获取键盘高度
- java 泛型的内部原理:类型擦除以及类型擦除带来的问题
- NSString类的常用方法
- java 简单爬虫
- 新浪微博API OAuth2 python客户端改进
- hoj2681Magic-Pen1
- qt /usr/bin/ld: cannot find -lGL
- java 去除或者替换字符串里面的数字或者字母
- HDU3371 - Connect the Cities(最小生成树 合并费用为0的点)
- hdu1159 LCS模板题
- linux下TCP通讯相关问题:select控制数据收发 对网络异常情况(如拔网线)的处理 停止程序后如何能快速再次bind
- 杭电 1846(巴什博弈)
- Android Tween动画之RotateAnimation实现图片不停旋转