Explanation

总体设计

van 的所有功能分布在四个类中, FanUserStatusTimeline.

User - 猜猜我是谁?

User 是对 API 接口返回的 user 对象的封装,可以通过它访问用户的属性,比如 User.id, User.name, User.location 等。 它还有一些所有用户共有的操作,比如获取用户的消息列表 User.statuses 、关注者列表 User.followers 、好友列表 User.friends 等。

timeline 返回此用户看到的时间线
statues 返回此用户已发送的消息
photos 浏览此用户发送的图片
followers 返回此用户的关注者
friends 返回此用户的关注对象
favorites 浏览此用户收藏的消息
relationship() 返回此用户与 other 的关系

Fan - 我才是老大!

Fan 是整个程序的开始点和其他API访问的入口点。程序需要先实例化一个 Fan 对象,然后通过 Fan 对象访问其他 API。

me 获取授权用户的信息
draft_box 显示发送失败的消息列表
mentions 返回提到当前用户的20条消息
replies 返回当前用户收到的回复
blocked_users 返回黑名单上用户列表
public_timeline 返回公共时间线
follow_requests 返回请求关注当前用户的列表
update_status() 更新状态
follow() 关注用户
unfollow() 取消关注用户
accept_follower() 接受关注请求
deny_follower() 拒绝关注请求
block() 屏蔽用户
unblock() 解除屏蔽
is_blocked() 检查是否屏蔽用户

Status - 我的实例最多~

没错,Status 是程序运行时创建最多的对象。 它与 User 一样,是对 API 数据的封装,但是它上面也部署了一些符合语义的方法,比如 回复消息 Status.reply()、转发消息 Status.repost()、 收藏消息 Status.favorite() (是不是挺像在御饭中左滑消息时的操作?)

photo Photo 对象,拥有 url, largeurl, imageurl, thumburl, originurl, type 属性
user User 对象,此消息的作者
context 按照时间先后顺序显示消息上下文
send() 发送此消息
delete() 删除此消息
reply() 回复这条消息
repost() 转发这条消息
favorite() 收藏此消息
unfavorite() 取消收藏此消息

Timeline - 天生优雅

Timeline 即时间线,或者说一组按时间排序的 Status 的列表: [ 最新的消息, ..., 稍旧的消息 ]

在原始 API 中,我们为了获取一段时间内的时间线,需要提供 since_idmax_id 两个参数来控制时间线的区间,我们需要经常记录并更新这两个值,比较麻烦。

在 Timeline 的实现中,van 将时间线模拟成一个文件对象,内部维护一个可用的消息数组,一个游标表示当前消息在数组中的位置。 调用 read() 方法,向后移动游标,返回一个消息数组,表示读取了一部分消息。

最神奇的地方在于,如果内部数组被消耗完了, Timeline 会自动获取消息填充。所以,完全可以将 Timeline 看作是一个无穷的数组,不用去关心 since_idmax_id 等问题,也不用手动获取新的状态, 只要像数组一样随意读取、遍历即可。

UserFan 中符合 Timeline 特征的都是 Timeline 对象。

__call__()

调用内部 _fetch 方法获取数据。

可以自己提供 since_id, max_idcount 参数,获取的结果不加入内部数组。

__iter__() 可以在 for 循环中使用此对象
tell() 返回当前游标的位置
rewind() 获取最新的状态插入到时间线的头部,并将指针置为0(指向最新的状态)
seek() 移动游标的位置
read() 从当前游标位置处往后读取消息