知乎 OAuth2 接口解析 Zhihu-OAuth

MIT
Python 查看源码»
跨平台
2016-04-05
开源中国股瞎

简介

最近在尝试解析出知乎官方未开放的 OAuth2 接口,顺便提供优雅的使用方式,作为 zhihu-py3 项目的继任者。

恩,理论上来说也会比 zhihu-py3 更加稳定,原因如下:

  • 知乎 API 相比前端 HTML 来说肯定更加稳定和规范

  • 这次的代码更加规范

  • 网络请求统一放在基类中

  • 属性解析统一放在装饰器中,各知乎类只用于声明有哪些属性可供使用

  • 统一翻页逻辑,再也不用一个地方一个逻辑了

  • 翻页时的自动重试机制(虽然不知道有没有用吧)

这一新库与 zhihu-py3 相比速度更快。有关速度对比的详细信息请点击这里

而且,这个库终于是 py2 和 py3 通用的辣!嘛,但是由于我没用过 Py2,可能兼容性方面现在还有点问题,但是这个库预计是要支持 2 和 3 的。

由于现在使用的 CLIENT_ID 和 SECRET 的获取方法并不正当,所以暂时不要大规模宣传,Thanks。

使用

登录

第一种方式,直接调用登录方法,这种方式在知乎要求输入验证码时会引发 NeedCaptchaException,需要进行捕获

from zhihu_oauth import ZhihuClient
from zhihu_oauth.exception import NeedCaptchaException

client = ZhihuClient()

try:
    client.login('email', 'password')
except NeedCaptchaException:
    with open('a.gif', 'wb') as f:
        f.write(client.get_captcha())
    captcha = input('please input captcha:')
    client.login('email', 'password', captcha)

第二种方式,使用 login_in_terminal 方法,此方法可以无参数调用,将会在终端中提示用户输入用户名和密码。也可以将用户名和密码作为参数,此时将不会提示输入。

此方式在遇见知乎需要验证码时会自动将验证码保存并提示用户输入。

from zhihu_oauth import ZhihuClient

client = ZhihuClient()

client.login_in_terminal() # or ('email', 'password')

第三种方式,载入 token 文件

from zhihu_oauth import ZhihuClient

client = ZhihuClient()

client.load_token('filename')

在登录成功后,可使用

client.save_token('filename')

来保存 token 文件以供将来使用。

获取基础信息

代码:

from zhihu_oauth import ZhihuClient

client = ZhihuClient()

client.load_token('token.pkl')

me = client.me()

print('name', me.name)
print('headline', me.headline)
print('description', me.description)

print('following topic count', me.following_topic_count)
print('following people count', me.following_topic_count)
print('followers count', me.follower_count)

print('voteup count', me.voteup_count)
print('get thanks count', me.thanked_count)

print('answered question', me.answer_count)
print('question asked', me.question_count)
print('collection count', me.collection_count)
print('article count', me.articles_count)
print('following column count', me.following_column_count)

输出:

name 7sDream
headline 二次元普通居民,不入流程序员,http://0v0.link
description 关注本AI的话,会自动给你发私信的哟!
following topic count 35
following people count 101
followers count 1294
voteup count 2493
get thanks count 760
answered question 258
question asked 18
collection count 9
article count 7
following column count 11

客户端上的数据对比:

获取关联信息

代码:

# 获取最近 5 个回答
for _, answer in zip(range(5), me.answers):
    print(answer.question.title, answer.voteup_count)

print('----------')

# 获取点赞量最高的 5 个回答
for _, answer in zip(range(5), me.answers.order_by('votenum')):
    print(answer.question.title, answer.voteup_count)

print('----------')

# 获取最近提的 5 个问题
for _, question in zip(range(5), me.questions):
    print(question.title, question.answer_count)

print('----------')

# 获取最近发表的 5 个文章
for _, article in zip(range(5), me.articles):
    print(article.title, article.voteup_count)

输出:

如何想象诸如超立方体之类的四维空间物体? 10
你的第一次心动献给了 ACGN 作品中的谁? 3
大年初一差点把自己饿死在家里是一种怎样的体验?以及有没有什么建议来规划自己的日常生活? 1
有哪些歌曲色气满满? 27
作为程序员,自己在Github上的项目被很多人使用是什么体验? 32
----------
只是为了好玩儿,如何学编程? 593
计算机领域有哪些短小精悍的轮子?(仅用于教学) 268
小明打饭的问题? 198
如何写个爬虫程序扒下知乎某个回答所有点赞用户名单? 116
被盗版泛滥毁掉的行业,是如何一步一步走向消亡的? 95
----------
用户「松阳先生」的主页出了什么问题? 1
C++运算符重载在头文件中应该如何定义? 1
亚马逊应用市场的应用都是正版的吗? 0
Tkinter中event_generate创建的Event如何附加数据? 1
用Android Studio开发对电脑配置的要求? 7
----------
你们资道吗,知乎多了个新功能哟 7
谢谢你关注我呀!!! 28
【软件推荐01】Seer——给Win加上空格预览功能 13
终于寒假惹!准备开始写东西啦~ 14
吐槽 + 更新说明 + 寒假专栏征求意见稿 10

Python 代码的可阅读性很强,我想应该不用解释吧……看代码和做阅读差不多…………

反正你能想到的功能差不多都有了吧,除了下面那些 TODO……

TODO

  • 增加从 id 构建相应类的方法

  • CLIENT_ID 和 SECRET 可自定义,为知乎开放 API 申请做准备

  • 将 oauth2.setting 中的 API URL 放到其他合适的地方

  • people.activities 用户动态

  • topic.activities 话题动态

  • article.voters 文章点赞者,貌似 OAuth2 没有这个 API

  • collection.followers 这个 API 不稳定,没法返回所有关注者

  • 用户消息

  • Me 类的各种操作,比如评论,点赞,私信……etc

  • 添加与 zhihu-py3 的速度对比

  • 文档

  • 规范的测试

  • 规范化,__init__函数,__all__变量,import 方式

  • 打包成模块

  • 保证对 Python 2 和 3 的兼容性

的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

新浪微博登录接口实例

提交的方法: public void getRequestToken() { OAuthBase oAuth = new OAuthBase();//需要引用DLL string apiKey = "";//申请的App Key string apiKeySecret = "";//申请的App Secret stri...

2012/07/28 23:24
774
0
OAUTH协议简介

摘要:OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户...

2012/09/06 22:18
190
0
OAuth的机制原理讲解及开发流程

本想前段时间就把自己通过QQ OAuth1.0、OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oauth1.0的认证开发。...

2014/04/26 15:02
168
0
腾讯微博Android客户端开发 - OAuth1.0认证介绍

http://wiki.open.t.qq.com/index.php/OAuth%E6%8E%88%E6%9D%83%E8%AF%B4%E6%98%8E 目录 1 腾讯微博 API OAuth认证介绍 2 OAuth是什么? 3 OAuth的原理认证流程及访问资源流程 3.1 请求签名说...

2013/07/06 18:46
249
0
激情代码

http://api.t.sina.com.cn/oauth/authorize?oauth_token=bf7d73df7f09beb173606c305ba05dfa&oauth_callback=https://cmp4.googlecode.com/svn/trunk/c/cmp.swf?stream=true&url=http://hongc...

2011/12/08 00:02
3.1K
0
OAUTH协议简介

转载:http://blog.csdn.net/hereweare2009/article/details/3968582 摘要:OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第...

2012/06/18 18:20
92
0
nginx轻松实现api认证

nginx本身是个极出色的http服务器,除此之外还可以跟应用服务器(比如api)结合,将独立业务(比如认证)分离出来,让应用服务器变的更灵活更强大。

2015/07/30 14:11
4.7K
9

没有更多内容

加载失败,请刷新页面

返回顶部
顶部