Zhihu-OAuth

知乎 OAuth2 接口解析
授权协议 MIT
开发语言 Python
所属分类 程序开发、 其他开发相关
软件类型 开源软件
地区 国产
投 递 者 戚衡
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

简介

最近在尝试解析出知乎官方未开放的 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 的兼容性

  • points: 带or赋值 可以设定默认值 装饰器判断是否完成某状态@need_login(functools.wraps) 装饰器@property @property装饰器就是负责把一个方法变成属性调用 s = Student() s.score = 60 #s.set_score() s.score #s.get_score() class Student(object): @p

  • 关于招聘 程序员简历应该怎么写? 关于Java 关于java Web 关于Spring 关于Linux 关于Python 转载于:https://www.cnblogs.com/saber-himesama/p/7428424.html

  • 基础概念 用户身份认证 用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问。常见的用户身份认证表现形式有:用户名密码登录,指纹打卡等方式 用户授权 用户认证通过后去访问系统的资源,系统会判断用户是否拥有访问资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问 五种认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提

  • oauth2.0: 阮一峰理解OAuth 2.0:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html https://www.kancloud.cn/kancloud/oauth_2_0/63340 认证 (authentication) 和授权 (authorization) :先认证和授权 理解OAuth 2.0:http://www.

 相关资料
  • VSCode-Zhihu 是基于 VSCode 的知乎客户端,提供包括阅读,搜索,创作,发布等一站式服务,内容加载速度比 Web 端更快,创新的 Markdown-Latex 混合语法让内容创作者更方便地插入代码块和数学公式,并一键发布至知乎平台。

  • zhihu-py3 本质上是个爬虫,但是为了表现的像个API,所以没有加上多线程等特性,不太适合大量数据抓取,勉强可用于客户端开发。运行在python3.x环境下,不支持py2。 功能: 登录知乎 获取问题相关数据 获取答案相关数据 获取用户相关数据 获取话题相关数据 获取收藏夹相关数据 获取专栏相关数据 获取专栏文章相关数据 执行用户动作(点赞,关注,感谢等) 安装: 已将项目发布到pypi,请

  • 知乎专栏APP是一款基于Android平台的知乎专栏APP,项目中已经包含了知乎专栏API分析和实例项目,希望能对大家有所帮助。

  • 项目背景 从一开始是想编写一个单纯的知乎爬虫,并实现其持久化,并由此展开周期性爬取知乎问题及答案以及其用户资料信息,完善前后端分离归档分类,信息检索等项目模块。但是在实现过程中,我逐渐发现自己对信息爬取的技能知识掌握严重不足,萌发了搭建知乎信息中转持久化的数据流平台,并提供HTML+JSON和RabbitMQ等消息接口,从而使有兴趣的伙伴开发并使用其熟悉的语言环境,实现信息爬取,从而持久化到此项目

  • 基于Node.js的知乎API。提供简单干净的数据接口,从而方便构建数据爬虫做进一步的数据分析。

  • 1. 接口和抽象类的区别 2. final关键字 3. flink checkpoint 4. checkpoint 中barrier的两种对齐 5. inteval join 6. 窗口函数 Sliding Time Window 为什么不设置很长的窗口时间 7. checkpoint 和 kafka offset的关联 8. offset的提交是自己写还是用flink框架 9. 非Barrie