python编程之API入门: (二)python3中使用新浪微博API
回顾API使用的流程
通过百度地图API的使用,我理解API调用的一般流程为:生成API规定格式的url->通过urllib读取url中数据->对json格式的数据进行解析。下一步,开始研究新浪微博API的使用。
准备
新浪微博开放平台是新浪微博API的使用平台。用微博账号登录该平台后,申请成为开发者,创建一个新应用后会得到唯一的App Key和App Secret。(注:应用不需要提交审核,只要创建新应用系统就会分配Key和Secret)在"我的应用/应用信息/基本信息"中也可以查到这两个信息。在这一页面中还有”我的应用/应用信息/高级信息“一项,点击进入并设置OAuth2.0授权回调页相关信息,如果不知道填什么好,可以设置为默认回调页:https://api.weibo.com/oauth2/default.html。这三项信息都是后面需要用到的,请复制保存到文档。
微博API新特点
与百度地图API相比,新浪微博API增加了OAuth2.0协议用于用户身份验证和授权。这里仅作简要说明(感兴趣的同学请查看网上文档示意图):通过该协议,第三方应用可以获得用户授权,然后用该许可从授权服务器获得令牌(Token),用于后续从API服务器查询数据时验证身份。
这一验证环节增加了url生成的复杂度,好在网站上已经有廖雪峰老师提供的SDK工具包:sinaweibopy(廖老师的github地址好像改过名字,因此网上很多旧链接无效,这个是新的有效链接),但是这一程序是基于python2环境编写的,python3有些系统库有更改,程序调用时经常报错。而作为python入门者,改写程序以适应python3环境无疑是一件困难的事。幸好有大神做了这一工作,感谢owolf针对python3改写的SDK:sinaweibopy3,我使用过,正常运行,大家可以下载。在这里同时推荐owolf的文章全网最详:python3调用新浪微博API接口获取数据。
简单示例
下面介绍一下我使用新浪微博API的过程,为新入门的同学提供参考。
1.参数设置
import sinaweibopy3
import webbrowser
import json
APP_KEY =' 填入你的App Key'
APP_SECRET=' 填入你的App Secret'
REDIRECT_URL =' 填入你的授权回调页'
注:
- 该文件需要和sinaweibopy3.py放在同一个文件夹里。
- 填写的三项信息都是在准备中提到的信息。
这里谈谈我粗心大意造成的一个bug,也给大家提个醒。一开始我运行程序时,每次都出现“重定向地址不匹配”的错误信息:
用微博帐号登录出错了!对第三方应用进行授权时出现错误,请您联系第三方应用的开发者:XXX 或者稍后再试。
错误码:21322 重定向地址不匹配
查找网上的解决方法,要设置回调页,但是在前面的步骤里我已经设置了,怎么还会有这个问题?后来看到一篇文章中提到回调页地址和程序中的REDIRECT_URL要一致,我想到了程序示例是http://api.weibo.com/oauth2/default.html,用的是http:
开头,我在填写时看到地址一样,就没有改动,而网站上是https:
开头,一个's'
之差,当时觉得是一个地址,没想到相差大矣!
2.OAuth2.0验证生成url
client = sinaweibopy3.APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=REDIRECT_URL)
url = client.get_authorize_url()
webbrowser.open_new(url)
result = client.request_access_token(input("please input code : "))
client.set_access_token(result.access_token, result.expires_in)
注意:这就是调用sinaweibopy3,实现OAuth2.0中用户授权->获取Token这一过程。当程序运行到client.request_access_token
时,会弹出输入提示"please input code : ",要求输入code?这是什么意思呢?打开浏览器就会看到出现了OAuth2.0验证回调页,地址栏一项'code='
后面有一串字符,这就是我们要的Token信息,把它复制后粘贴输入,程序继续运行。
3.从API读取数据
运行下列代码,可以读取公共微博的数据并显示结果。
result=client.public_timeline()
print(json.dumps(result,indent=2,ensure_ascii=False))
而通过查看数据结构,可以提取特定信息。例如用以下代码输出用户微博昵称、地点和最新微博正文。
number=result["total_number"]
print(number,"users:")
for u in result["statuses"]:
print(u["user"]["screen_name"])
print(u["user"]["location"])
print(u["text"])
进阶
如果要查询其他信息,比如获取用户的关注列表,怎么办呢?让我们来试着编写出相应的函数。
1.查看新浪微博API定义的url: https://api.weibo.com/2/friendships/friends.json 以及定义的请求参数:access_token, uid, screen_name, count, cursor, time_status。其中access_token需要填写,uid和screen_name分别是用户id和昵称,二者必填且只填一项。(注:接口升级后,只能为当前授权用户) count, cursor可使用默认参数。count是单页返回记录条数,默认为5,最大不超过5,cursor返回结果的游标。trim_status是显示status字段的开关,0:返回完整status字段,1:仅返回status_id,默认为1。
2.在sinaweibopy3.py中是如何实现public_timeline()
呢:
def public_timeline(self):
result = _http_get('%s'% (self.api_url) + 'statuses/public_timeline.json',
access_token=self.access_token,
count=50,
page=1,
base_app=0,
)
return result
对照代码发现%s'% (self.api_url)
就是https://api.weibo.com/2
,我们只需要把 'statuses/public_timeline.json'
改成'friendships/friends.json'
,并添加必填的请求参数,可以写出一个类似的函数:
def fs_friends(self):
result=_http_get('%s'% (self.api_url) + 'friendships/friends.json',
access_token=self.access_token,
screen_name='填入你自己的微博昵称' ,
trim_status=0,
)
return result
注:trim_status默认为1,设置为0才会得到完整status字段(其中包括最新微博正文)。
3.在自己的主程序中调用fs_friends()
函数
参考原有的client.public_timeline()
,得到以下代码:
result = client.fs_friends()
print(json.dumps(result,indent=2,ensure_ascii=False))
这样就可以看到关注的人的列表,包括基本信息及最新微博。编写以下代码,提取用户昵称、地点及最新微博内容:
for u in result['users']:
print("\n",u['screen_name'])
print(u['location'])
if('status' not in u):
print('not found\n')
continue
print(u['status']['text'])
以下是我还在思考的问题,欢迎交流指教,谢谢!
1.请求参数设置里count不大于5,我在实际运行程序时只看到4个关注用户及微博正文,能否读取更多用户,如何读取?
2.我还尝试了编写statuses/home_timeline(获取当前登录用户及其所关注(授权)用户的最新微博)的查询函数,但是因为参数设置问题,显示结果为Null(空)。我认为问题出在max_id参数上,说明中指出:若指定此参数,则返回ID小于或等于max_id的微博,默认为0,但是设多大合理?我有些困惑。
python编程之API入门: (二)python3中使用新浪微博API的更多相关文章
- python并发编程之multiprocessing进程(二)
python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...
- Python编程之美:最佳实践指南PDF高清完整版免费下载|百度云盘|Python新手到进阶
百度云盘:Python编程之美:最佳实践指南PDF高清完整版免费下载 提取码:1py6 内容简介 <Python编程之美:最佳实践指南>是Python用户的一本百科式学习指南,由Pytho ...
- Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载|百度云盘
百度云盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载 提取码:8nki 目录 · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 1 ...
- Web API 入门 二 媒体类型
还是拿上面 那篇 Web API 入门 一 的那个来讲 在product类中加一个时间属性
- python之模块配置文件ConfigParser(在python3中变化较大)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ConfigParser(在python3中为configparser) #特别注意:py ...
- Python学习笔记(十二)—Python3中pip包管理工具的安装【转】
本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- python学习笔记--Django入门二 Django 的模板系统
为了使网站更干净简洁更容易维护,页面的设计和Python的代码必须分离开.我们可以使用Django的 模板系统 (Template System)来实现这种模式. 几个简单的模板标签(tag): ...
- python编程之禅
在python界面输入 import this >>> import this The Zen of Python, by Tim Peters Beautiful is bette ...
- python 教程之Django(二)
官网: https://www.djangoproject.com/download/ 1.简单方法: A.pip 命令安装方法 pip install Django 打开dos命令窗口 输入命令回车 ...
随机推荐
- 网站如何从http升级成https
基本概念: HTTP: 是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准,用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. HT ...
- PT2264解码心得
PT2264解码心得 最近闲暇时间在琢磨无线RF解码程序,正好在数码之家论坛中翻出大佬的解码程序(http://bbs.mydigit.cn/read.php?tid=245739),于是乎,慢慢学习 ...
- C#中的委托(转)
C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...
- 从零开始docker部署flask
1.下载一个Ubuntu镜像 2.启动镜像,使用apt-get安装python.安装pip,建议也装个vim吧 3.通过以上的容器生成一个新的镜像,命令如下docker commit afcaf46e ...
- Docker容器相关技术
docker需要依赖的Linux内核特性:(1)Namespaces 命名空间PID(Process ID) 用来隔离进程NET(Network) 管理网络接口IPC(InterProcess com ...
- Handler引起的内存泄露
一般我都写handler的时候是这样的: public class MyActivity extends Activity{ private final Handler myHandler = n ...
- 解决Ueditor在bootstarp 模态框中全屏问题
基本的一些配置就不说了.先说一下要注意的问题:首先是zIndex的设置.记住最好都显示设置模态框和ueditor的zIndex.理清他们的层叠关系. 特别是用到ueditor里面的图片上传功能的更要设 ...
- function calling convention
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=31 February 19, 2013 function calling c ...
- System类与两种输入流
1.System类对I/O的支持系统输出System.out.println 是利用了I/O流的模式完成的.实际是打印流PrintStream对象 System类中定义了三个操作的常量 1.标准/系统 ...
- Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...