今天下载了新浪微博的api,python版本的。不过后来发现新浪平台上的python api 居然不是官方版本,而是由廖雪峰提供的。这个版本的python api只适合用于网站开发,不合适用于客户端开发。因为本来是不知道这些的,所以我在这两种方式上吃了一些苦头。
weibo的认证有两种方式,一种是使用pin码的认证方法,另一种是code码的认证方法。当然这两种都是oauth2认证。我就用实例来说明一下这两种方法。
第一种使用pin码的方法,适合用于客户端开发。先看看下面的程序:
auth = OAuthHandler(consumer_key, consumer_secret)
auth_url = auth.get_authorization_url()
webbrowser.open(auth_url)
print 'Please authorize: ' + auth_url
verifier = raw_input('PIN: ').strip()
auth.get_access_token(verifier)
api = API(self.auth)
代码中consumer_key 和 consumer_secret是你创建一个应用程序的时候新浪开放平台自动给你生成的app_key和app_secret。我们使用这两个常量创建了一个OAuthHandler,然后得到一个认证的地址。我使用webbrowser这个类来打开这个网址,需要填写你的用户名和密码后获得授权。
这一步的出现主要是为了让应用得不到用户的用户名和密码,用户只需要和新浪进行交互。在得到授权码也就是pin码之后,auth将使用这个pin码得到一个access token 和 token secret。这一步说明了用户信任这个应用。这样应用就能得到一个可以用于处理微博的api类。
这个类的方法可以用于信息的获取和上传。比如下面的代码:
def update(self, message):
message = message.encoding('utf-8')
result = self.api.update_status(message)
print result.id, result.text
上面的代码就是用户发微博的代码了,只要是获得了api这个类,一切的信息交互就靠这个类了。
下面是示例代码:
#!/usr/bin/python
#coding=utf-8
from weibopy.auth import OAuthHandler, BasicAuthHandler
from weibopy.api import API
import webbrowser
class Test(unittest.TestCase):
consumer_key= "984974179"
consumer_secret ="37db179174e0a56c082b90ef1705a640"
def auth(self):
if len(self.consumer_key) == 0:
print "Please set consumer_key£¡£¡£¡"
return
if len(self.consumer_key) == 0:
print "Please set consumer_secret£¡£¡£¡"
return
self.auth = OAuthHandler(self.consumer_key, self.consumer_secret)
auth_url = self.auth.get_authorization_url()
webbrowser.open(auth_url)
print 'Please authorize: ' + auth_url
verifier = raw_input('PIN: ').strip()
self.auth.get_access_token(verifier)
self.api = API(self.auth)
def update(self, message):
message = message.encode("utf-8")
status = self.api.update_status(status=message)
print status.id, status.text
test = Test()
test.auth()
test.update("auth2-test")
详细的api请大家下载之后去好好看看weibopy.api这个模块,里面有很多方法用于与新浪的交互。
这种方法所需要的api文件我在新浪的官网上并没有下到,而是在google当中搜索weibopy后在某个人的github上下到的。
新浪官网上提供的api是用于网站开发的。在新浪api提供的链接上提供了一份使用文档。
这是上面的代码:
from weibo import APIClient
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, redirect_uri=CALLBACK_URL)
url = client.get_authorize_url()
相信大家对这种访问方式都很熟悉,就是把自己的网页设置为回调网页,然后用get_authorize_url()这个函数得到新浪的认证网页并访问。
只要用户在新浪的认证网页上填写了正确的信息,认证网页就会跳回到你的回调网页上并返回一个code码。
# 获取URL参数code:
code = your.web.framework.request.get('code')
r = client.request_access_token(code)
access_token = r.access_token # 新浪返回的token,类似abc123xyz456
expires_in = r.expires_in # token过期的UNIX时间:
# TODO: 在此可保存access token
client.set_access_token(access_token, expires_in)
我们可以看到,你还是需要得到access_token来完成client这个对象。当然在这之后,你得到了一个可以用于信息交互的client对象,所有的操作都是使用这个client对象进行的。
比如:
print client.get.statues__user_timeline()
这个函数就可以打印出用户最近发出的20条微博。
接下来的操作你需要去新浪api提供的链接上提供的使用文档上认真看看了。
说了这么多,你一定会觉得奇怪,是不是所有的认证方法都必须链接到新浪的认证网页上去啊。这样不是很麻烦吗!后来我在weibopy.auth这个模块中找到了一个BasicAuthHandler类,使用这个类,可以不需要经过新浪的认证网页。
self.auth = BasicAuthHandler(self.username, self.password)
self.api = API(self.auth, source = self.app_key)
这个类需要你提过app_key,username和password来进行验证。不知道这种方法是不是oauth1。