本节将改进上一节中发微博的程序,主要的改进功能是:能够保存授权的access_token,不用进行重复授权。先看一下本节工程的目录结构(如图1所示)。

图1

send_weibo.py为发微博的主程序,与上一节中的程序没有什么差别。目录initclient是我自己定义的一个包,目录中的initclient.py封装了授权过程,后面详细解释,token-record.log是一个数据文件,用来存储授权的access_token,__init__.py是自定义包所必须的,文件为空(关于__init__.py不明白的朋友可以查看Python相关文档)。

首先看一下initclient.py的内容:

#! /usr/bin/pythonimport weibo
import urllib
import time
import osclass myAPIClient(weibo.APIClient):"""myAPIClient类继承自weibo包中的APIClient类,对其进行了扩展。SDK中的APIClient类没有根据已授权的access_token获取授权详细信息的接口。另外,SDK中的APIClient不能保存当前授权用户的uid,该继承类实现了这两个功能,使得用起来更加方便。"""def __init__(self, app_key, app_secret, redirect_uri=None, response_type='code', domain='api.weibo.com', version='2'):weibo.APIClient.__init__(self, app_key, app_secret, redirect_uri=None, response_type='code', domain='api.weibo.com', version='2')#保存当前授权用户的uidself.uid = ""def request_access_token_info(self, at):"""该接口传入参数at为已经授权的access_token,函数将返回该access_token的详细信息,返回Json对象,与APIClient类的request_access_token类似。"""r = weibo._http_post('%s%s' % (self.auth_url, 'get_token_info'), access_token = at)current = int(time.time())expires = r.expire_in + currentremind_in = r.get('remind_in', None)if remind_in:rtime = int(remind_in) + currentif rtime < expires:expires = rtimereturn weibo.JsonDict(expires=expires, expires_in=expires, uid=r.get('uid', None))def set_uid(self, uid):self.uid = uidTOKEN_FILE = 'token-record.log'
def load_tokens(filename=TOKEN_FILE):acc_tk_list = []try:filepath = os.path.join(os.path.dirname(__file__), filename)f = open(filepath)acc_tk_list.append(f.readline().strip())print "===> Get the access_token from file token-record.log : ", acc_tk_list[0]except IOError:print "===> File token-record.log does not exist."f.close()return acc_tk_listdef dump_tokens(tk, filename=TOKEN_FILE):try:filepath = os.path.join(os.path.dirname(__file__), filename)f = open(filename, 'a')f.write(tk)f.write('\n')except IOError:print "===> File token-record.log does not exist."f.close()print "===> The new access_token has been written to file token-record.log."def get_client(appkey, appsecret, callback):client = myAPIClient(appkey, appsecret, callback)at_list = load_tokens()if at_list:access_token = at_list[-1]r = client.request_access_token_info(access_token)expires_in = r.expires_inprint "===> The access_token's expires_in : %f" % expires_in#授权access_token过期if r.expires_in <= 0:return Noneclient.set_uid(r.uid)else:auth_url = client.get_authorize_url()print "===> auth_url : " + auth_url print """===> Note! The access_token is not available, you should be authorized again. Please open the url above in your browser,
then you will get a returned url with the code field. Input the code in the follow step."""code = raw_input("===> input the retured code : ")r = client.request_access_token(code)access_token = r.access_tokenexpires_in = r.expires_inprint "===> the new access_token is : ", access_tokendump_tokens(access_token)client.set_access_token(access_token, expires_in)client.set_uid(r.uid)return client

【说明】:

(1)myAPIClient类继承自weibo包中的APIClient类,增加了两个功能:第一,保存当前授权用户的uid,该值在后面需要用到,所以保存到类成员变量中;第二,根据授权的access_token获取授权信息,这里实际是调用新浪微博提供的API,具体参考官方文档(http://open.weibo.com/wiki/Oauth2/get_token_info);

(2)load_tokens和dump_tokens两个函数分别用于从文件token-record.log读取授权的access_token和将access_token写入文件;

(3)get_client是获取授权的myAPIClient对象的接口,也是该模块最关键的函数,也很简单,就是读取文件token-record.log,如果读到access_token就调用myAPIClient类的函数request_access_token_info获取该access_token的详细信息(主要是expires_in),如果文件中没有读到则需要重新授权(跟上一节中的内容一样),最后返回授权的client对象。图2中显示了该过程。

图2

下面看一下send_weibo.py的内容:

#! /usr/bin/pythonfrom initclient import initclientAPP_KEY = '2024******'
APP_SECRET = '91a57******'
CALL_BACK = 'http://bingbingrobot.sinaapp.com/'def run():#调用initclietn模块创建授权的client对象client = initclient.get_client(APP_KEY, APP_SECRET, CALL_BACK)if not client:return#根据用户输入内容发微博while True:print "Ready! Do you want to send a new weibo?(y/n)"choice = raw_input()if choice == 'y' or choice == 'Y':content = raw_input('input the your new weibo content : ')if content:client.statuses.update.post(status=content)print "Send succesfully!"break;else:print "Error! Empty content!"if choice == 'n' or choice == 'N':breakif __name__ == "__main__":run()

【说明】:

(1)注意第3行的import语句,表示从包(目录)initclient中引入initclient模块,要求initclient目录中必须含有__init__.py文件(不了解的朋友请查看相关文档);

(2)有了initclient包后,主程序send_weibo.py变得非常简单,获取授权client只需要一行代码即可,而且程序功能也变得非常合理了,只要上一次授权的access_token没有过期,这一次就不需要重复授权了。而且该initclient包是可以重复利用的,后面需要开发其他功能直接使用该包即可;

(3)运行结果如图3所示。

图3

【补充】:

大家有没有注意到load_tokens函数中读取access_token是用的一个list存储的,而且dump_tokens中写入access_token是用的追加模式,这样写实为了程序的扩展,将来如果想把自己的应用发布,有很多用户使用时,每个授权用户都会有一个access_token,这样就可以把所有用户的access_token存在文件中,根据登陆用户的access_token去文件中查找是否已经授权。本程序中都是用我自己的账户登陆的,所以是有一个access_token,所以initclient.py的第63行读取的是at_list[-1],即读取文件中的最后一个access_token。

代码打包下载:http://download.csdn.net/detail/lewsn2008/5583803

By:

新浪微博Python SDK笔记——发微博(二)相关推荐

  1. 新浪微博Python SDK笔记——发微博(一)

    上一节中已经安装了Python SDK,可以在程序中引入weibo模块编写微博程序了.下面的程序的功能就是利用该模块发一条新微博,先开具体的代码: #! /usr/bin/python"&q ...

  2. python sdk 就业_新浪微博Python SDK笔记——准备工作

    新浪微博开放平台提供了丰富的微博操作API,开发者可以利用API开发出自己想要的功能,也可以将自己的网站.应用与微博开放平台连接,甚至可以开发出一个具有完全功能的新浪微博客户端(weico)或者网页( ...

  3. python分析微博粉丝_新浪微博Python SDK笔记——获取粉丝列表或关注列表 | 学步园...

    上一节中创建了一个initclient包,封装了授权的过程,通过获取的myAPIClient对象可以直接调用API接口进行微博操作,上一节中就调用了发微博的接口发了一条新微博.这一节还是直接使用ini ...

  4. java 微博sdk_Java基于新浪微博SDK实现发微博的功能

    背景 最近用实现了一个简单的发微博的功能. 新浪微博的SDK已经经历了多次更新,而网上的资料.教程大多还是基于旧版本的,很多细节上有了一些变化.本文将基于最新的新浪微博SDK介绍发微博的过程. 简介 ...

  5. python 自动发微博_用 Python 自动定时发微博

    原标题:用 Python 自动定时发微博 其实小帅b已经挺久没有玩微博了,记得上次玩微博还是为了给周杰伦打榜,不过最近心血来潮,觉得俺的微博账号躺着也是躺着,要不就用 Python 做一个自动定时发微 ...

  6. 用python定时自动发微博_用python自动发微博

    --刚刚全部写完了点发布--结果什么都没保存--内心好忧伤. 终极目标是用raspberry pi + camera 捕捉画面,处理图像识别图中有我家主子(猫), 然后自动capture图像,发微博. ...

  7. 用python定时自动发微博_Python脚本实现自动发带图的微博

    要自动发微博最简单的办法无非是调用新浪微博的API(因为只是简单的发微博,就没必要用它的SDK了).参考开发文档http://open.weibo.com/wiki/API 进行代码编写 创建应用 要 ...

  8. python 微博自动点赞_用 Python 自动定时发微博

    ​其实小帅b已经挺久没有玩微博了,记得上次玩微博还是为了给周杰伦打榜,不过最近心血来潮,觉得俺的微博账号躺着也是躺着,要不就用 Python 做一个自动定时发微博的机器人,让它在上面飘一会. 怎么个飘 ...

  9. 用python定时自动发微博_用 Python 自动定时发微博

    其实小帅b已经挺久没有玩微博了,记得上次玩微博还是为了给周杰伦打榜,不过最近心血来潮,觉得俺的微博账号躺着也是躺着,要不就用 Python 做一个自动定时发微博的机器人,让它在上面飘一会. 怎么个飘法 ...

最新文章

  1. 2022-2028年中国TPE弹性体行业市场研究及前瞻分析报告
  2. vue 组件id重复问题
  3. 数据结构源码笔记(C语言):分块法查找
  4. Zookeeper-Zookeeper leader选举
  5. Flask第一篇——URL详解
  6. 18.mysql优化(三)–explain分析sql语句执行效率
  7. 编写Java程序,在屏幕上显示带标题的窗口,并添加一个按钮。当用户单击按钮时,结束程序。
  8. ccf小明放学20分_关于完全平方数的好题(20年3月1日)
  9. C++ Primer Plus学习(一)—— 基础知识
  10. viper4android 6.0脉冲,【详解】v4a音效脉冲样本
  11. C++实现多级时间轮定时器
  12. 计算机软件卡死,电脑运行慢,卡或软件卡死无响应的解决方法
  13. python数据可视化毕业设计题目_python:数据可视化
  14. 同一无线络下电脑会打不开个别的网站网页,而手机却可以打开。
  15. Linux 系统调用
  16. 【AAE】【Keras】实现merge出错:TypeError: ‘module‘ object is not callable
  17. Win10下运行红色警戒2
  18. 大学学计算机需不需要提前预习,大学怎么预习啊?
  19. Chapter 14
  20. 【智能车竞赛】第18届比赛规则整理以及往届对比

热门文章

  1. Mac版微信取消在锁定屏幕上显示通知的操作方法?
  2. Android歌词秀设计思路(7)水到渠成
  3. emacs .emacs_使用Emacs修改您的Git存储库,并获得Griffon 0.9发行说明的先睹为快
  4. 开关电源测试软件有哪些,请问开关电源的测试仪器都有哪些
  5. 计算机三级网络技术2014,2014年计算机三级网络技术真题及答案
  6. 使用vertx构建响应式微服务-第三章 创建响应式微服务(Building Reactive Microservices)
  7. 【挖坑待填】今天的劣势 + 明天的解决方式 = 后天的优势
  8. 量化宽松(QE-Quantitative Easing)
  9. 离子交换法处理含铬废水
  10. IEC60870-5-102电力系统电能累计量传输通信协议测试方法