python编程之API入门: (二)python3中使用新浪微博API

题记:我的API入门学习笔记,欢迎交流指正。本文在博客园也有发布:https://www.cnblogs.com/codestack123/p/10816013.html,简书里增加了一些配图。

回顾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服务器查询数据时验证身份。


OAuth2—图片来源:新浪微博开放平台

这一验证环节增加了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

url

以及定义的请求参数: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,但是设多大合理?我有些困惑。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容