LilyBBS API是由LilyStudio(小百合工作室)发布的非官方的南京大学小百合BBS的部分功能的API。
LilyBBS API目前版本为0.10α,开发语言为php。不出意外的话会不定期更新。
关于其它语言的版本,可能要在php版本基本没有bug后再进行开发,以免重复劳动。
C# : 不出意外的话会有C#版本的。
JS : 原订的js版本,由于js跨域必须依赖后台,所以js版本没有实际的意义,固放弃开发。
Java : 由于java和C#的相似性,不准备开发java版的。
C++ : 仍在考虑中。。
参见: 第一个版本选择php的理由, 下一个版本选择C#的理由LilyBBS API的开发代号为“Fat+”。
其官方解释如下:
“Fat+”即“More Fatter”。而“增肥”和“开发LilyBBS API”一直是我的梦想,固将二者等同。而且,Fat本身有“丰富”的含义,也是希望开发出的API功能更加丰富。
真实含义如下:
“Fat”实际是“Fish & Tony”。在静茹大婚的这段时间里,自然要祝福二位一下咯~
后面的“+”吧。。其实是“Loveplus”的“Plus”,最近等LP的汉化等的粉痛苦。。
该版本包含以下功能的接口:
百合的用户。所有的百合id均是User
账号,是User的子集。是User中,属于你的,由你掌握id和password的用户。
好友。扩展于User / Lily_User(因为好友本来也是用户)。是Account / Lily_Account的属性之一(因为账户具有好友)
帖子。由一个用户在某一时间所发表的信息。即在一般模式下所看到的内容。相当于某些论坛的“楼”的概念。(不区分首贴和回贴)
主题。多个帖子的集合。即在主题模式下所看到的内容。
板块。如:“图版”、“G版”、“Homosky” ...(嘿嘿。。)
版块中的主题的集合,由于主题数量十分庞大,不可能全部本地存储,ThemeSet便用来获取特定序号的主题。
一个数据从被取回到被认定无效(过期)所经历的时间。不同数据有不同的生存周期(参见:更新:Lily_UpdateConfig)。小于0表示生存周期无限大。
需要通过向“百合BBS”发送请求来获取的数据。如:用户的登陆次数、帖子的标题等等。
而用于标识一个对象的惟一性的数据通常不是“可更新数据”。如用户的Id不是“可更新数据”,而是获取用户“可更新数据”的条件,因为没有id就不知道要获取的是哪个用户的数据了。再如:贴子的Url也不是“可更新数据”。
(参见:数据类型)所有的可设参数均列在了*Config类中,下面是具体的说明:
FILE_ENCODING : string
指该LilybbsApi.php文件的编码方式。用于代码中一些中文常量比较前的译码。除非手动更改了文件的编码(如将文件另存为其它编码),否则请不要更改此项。
OUTPUT_ENCODING : string
默认为'UTF-8'。指输出网页的编码方式,请根据你的实际情况更改。
LILYBBS_ENCODING : string
默认为'GBK'。指“小百合BBS”的编码,请不要更改该选项。
对于更新参数的设置将直接影响系统的性能。生存周期过短,会导致请求较多,消耗系统资源。生存周期过长,会导致数据失效(过期)。所以请根据不同的数据,设定合理的生存周期。注意:并不是说生存周期到了便会立刻更新。具体请参见:数据更新策略
AUTO_UPDATE : bool
默认为true。是否自动更新。仅当为true时,下面的参数才会有效。
DEFAULT_UPDATE_LIFETIME : int
默认为60(单位:秒)。在未设置的请况下,Updater的生存周期。
DEFAULT_USERINFO_LIFETIME : int
默认为-1(单位:秒)。用户信息的生存周期。小于0表示不自动更新。因为user信息较为固定,固默认情况下不进行更新。
DEFAULT_POST_LIFETIME : int
默认为1200(单位:秒)。贴子的生存周期。由于单个帖子被修改的概率较低。固默认情况下生存周期较长。
DEFAULT_THEME_LIFETIME : int
默认为20(单位:秒)。主题的生存周期。主题变动比较频繁。所以生存周期较短。
DEFAULT_BOARD_LIFETIME : int
默认为-1(单位:秒)。版块本身(不包含板块内的主题)的生存周期。默认不自动更新。
DEFAULT_THEME_SET_LIFETIME : int
默认为20(单位:秒)。版块内的主题集合。由于更新频繁,默认生存周期很短。
DEFALUT_ACCOUNT_LIFETIME : int
默认为-1(单位:秒)。账户信息基本不变,固默认不更新。
有关url的设置,需要更改的可能性较小,可以忽略这部分。Url中的大括号中的部分在程序运行时会被替换成相应的属性。
LILYBBS_URL : string
默认为'http://bbs.nju.edu.cn/'。百合BBS的地址。
LILYBBS_IP : string
默认为'219.219.114.4'。百合BBS的IP。
USERINFO_QUERY : string
默认为'bbsqry?userid={id}'。用于查寻User信息的Url。
POST_QUERY : string
默认为'bbscon?board={board}&file={file}&num={num}'。用于查寻Post信息的Url。
POST_REGULAR : string
默认为'[^?]*\?board=([^&]*)&file=([^&]*)&num=([^&]*)'。用于将一个绐定的Post Url解析成board, file, name 属性的正则表达式。
POST_REGULAR_BOARD_INDEX : int
默认为1。board属性在POST_REGULAR的Match结果中所在的位置。
POST_REGULAR_FILE_INDEX : int
默认为2。file属性在POST_REGULAR的Match结果中所在的位置。
POST_REGULAR_NAME_INDEX : int
默认为3。name属性在POST_REGULAR的Match结果中所在的位置。
THEME_QUERY : string
默认为'bbsfind0?board={board}&gid={gid}'。用于查寻Theme信息的Url。
THEME_REGULAR : string
默认为'[^?]*\?board=([^&]*)&gid=([^&]*)'。用于将一个绐定的Theme Url解析成board, gid属性和正则表达式。
THEME_REGULAR_BOARD_INDEX : int
默认为1。board属性在THEME_REGUALR的Match结果中所在的位置。
THEME_REGULAR_GID_INDEX : int
默认为2。gid属性在THEME_REGUALR的Match结果中所在的位置。
BOARD_THEME_MODE_QUERY : string
默认为'bbstdoc?board={id}'。版块主题模式的Url。用于获取版块的主题列表。
BOARD_POST_MODE_QUERY : string
默认为'bbsdoc?board={id}'。版块一般模式的Url。用于获取版块的其它信息。
THEME_COUNT_PRE_PAGE : int
默认为19。主题模式下,一页所显示主题的数量。不包含置顶贴和下一页的第一贴(也就除去最后一页外,每一页最下面的那个贴。)
THEME_SET_QUERY : string
默认为'bbstdoc?board={id}&start={num}'。用于获取特定的序号的主题的Url。
ALL_BOARD_LIST_URL : string
默认为'bbsall'。所有版块的列表,原用于获得版块名称,但由于效率的问题(该页面不是一般的大),最后没有被采用。
ALL_BOARD_ID_LIST_URL : string
默认为'bbsall?js=1'。所有版块的id列表。此版本中并无用途。
TOP_10_URL : string
默认为'bbstop10'。十大的地址。
LOGIN_QUERY : string
默认为'bbslogin?type=2&id={id}&pw={password}'。于用登陆的url。
FRIEND_LIST_URL : string
默认为'bbsfall'。用于查寻所有好友的url。
'bbsfdel?userid={id}' : string
默认为'bbsfdel?userid={id}'。用于删除好友的url。
ADD_FRIEND_QUERY : string
默认为'bbsfadd?userid={id}&exp={introduce}'。用于增加好友的url。
有关百合Cookie的设置,变动性较小,可以忽略。
NAME_NUM : string
默认为'_U_NUM'。百合BBS的Cookie中num项的名称。
NAME_UID : string
默认为'_U_UID'。百合BBS的Cookie中uid项的名称。
NAME_KEY : string
默认为'_U_KEY'。百合BBS的Cookie中的key项的名称。
USE_LOCAL_BOARD_NAME : bool
默认为ture。是否采用本地存储的版块名称,因为版块名称很少会发生变化,利用本地存储的名称可以有效的提高效率。
(参见:本地存储的版块名称)
当且仅当访问(访问:通常含义的对属性的get,不包含set)可更新数据时,才会触发以下更新检测流程。不访问数据的情况下,无论数据是否过期,都不会主动更新。
更新检测的流程如下:
更新的流程如下:
用户可以通过自行调用对象的update() : void方法进行强制更新。(调用该方法时会跳过更新检测,直接更新)
举例说明1:
举例说明2:
举例说明3:
带下滑线的数据不是可更新数据,其余为可更新数据。
| 属性 | 类型 | 说明 |
|---|---|---|
| id | string | 用户名 |
| exist | bool | 用户是否存在 |
| nickname | string | 昵称 |
| onSiteCount | int | 上站次数 |
| postCount | int | 发贴次数 |
| constellation | string | 星座 |
| lastLoginTime | string | 上次上站时间 |
| lastLoginIp | string | 上次登陆ip |
| string | 邮箱 | |
| experience | int | 经验值 |
| experienceLevel | string | 等级 |
| performance | int | 表现值 |
| performanceLevel | string | 表现值等级 |
| health | int | 生命值 |
| online | bool | 是否在线 |
| lastExitTime | string | 上次离线时间 |
| 属性 | 类型 | 说明 |
|---|---|---|
| url | string | 地址(*) |
| board | Board | 版面(*) |
| file | string | 文件名(*) |
| num | string | (*) |
| gid | string | 组id |
| author | User | 作者 |
| visited | int | 人气 |
| tilte | string | 标题 |
| postTime | string | 发布时间 |
| postIp | string | 发布的IP |
| content | string | 内容 |
| 属性 | 类型 | 说明 |
|---|---|---|
| url | string | 主题的地址 |
| board | Board | 版面(*) |
| gid | string | 组id(*) |
| posts | post[] | 帖子列表(数组) |
| 属性 | 类型 | 说明 |
|---|---|---|
| id | string | 版面id |
| name | string | 名称 |
| masters | User[] | 版主 |
| themeCount | int | 主题总数 |
| themes | ThemeNum | 主题的集合 |
| 属性 | 类型 | 说明 |
|---|---|---|
| id | string | 账户id |
| friend | [ string => Lily_Friend ] | 好友 |
| 属性 | 类型 | 说明 |
|---|---|---|
| * 继承自User的所有属性 * | ||
| id | string | 好友的id |
| owner | Account | 拥有该好友的那个账号 |
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||
|
||||||||||
|
||||||||||
(类名中省略了Lily_前缀)
上面的类图乃我用html一字一字敲出来的。。。话说忽然有种写一个生成html类图的工具的想法。
接口。是对所有进行更新操作的类的抽象。是系统更新框架的一部分。
update() : void [Public]
更新与该Updater对应的IUpdate对象(即包含该IUpdater的IUpdate)。
接口。用于检测所对应的IUpdate是否需要更新。
updated() : void [Public]
通知该对象:与该对象对应的IUpdate的更新过程已经完成。以便于下次检测时进行参考。
needUpdate() : bool [Public]
检测与该对象对应的IUpdate是否需要更新。具体的检测策略由该类的子类实现。
RETURN : true : 需要更新; false : 不需要更新;
接口。对所有包含可更新数据的类的抽象。
getUpdater() : IUpdater [Public]
RETURN : 与该对象对应的Updater
getUpdateCheck() : IUpdateCheck [Public]
RETURN : 与该对象对应的UpdateCheck
继承自Lily_IUpdateCheck。对Lily_IUpdateCheck的实现,依据时间判断数据是否过期。
$lastUpdateTime : int [Public ReadOnly]
上次更新的时间,由time()获得的格式。
$lifeTime : int [Public]
所对应的IUpdate的生存周期。
everUpdated : bool [Public ReadOnly]
是否曾进行过更新。
继承自Lily_TimeUpdateCheck。 在Lily_TimeUpdateCheck的时间判定的基础上加上了对 Lily_UpdateConfig :: AUTO_UPDATE 的判定。最终实现了完整的更新检测过程。
(参见:数据更新策略)静态类。与编码相关的实用方法。
Encode ( $text : string ) : string [Public Static]
将由百合BBS得到的字符串的编码由 Lily_EncodingConfig::LILYBBS_ENCODING 转化到 Lily_EncodingConfig::OUTPUT_ENCODING 。以便于输出。
Return : 转换后的字符串。
(参见:Lily_EncodingConfig)
ConstStr ( $text : string ) : string [Public Static]
将代码中出现的中文字符常量的编码由 Lily_EncodingConfig::FILE_ENCODING 转化到 Lily_EncodingConfig::OUTPUT_ENCODING 。以便于比较。
Return : 转换后的字符串。
静态类。更新检测或更新过程中要用到的实用方法。
update ( $updateItem : IUpdate ) : bool [Public Static]
首先检查所传入的IUpdate是否需要更新(通过 $updateItem->getUpdateCheck() 来获取IUpdateCheck进行检查)。若需要,则进行更新(通过 $updateItem->getUpdater() 来获取IUpdater进行更新),并返回true。 若不需要,返回false。
Return : true : 进行了更新; false : 没有进行更新
forceUpdate ( $updateItem : IUpdate ) : void [Public Static]
不进行更新检测,强制博时价值进行更新。
updateBegin ( $dataitem : DataItem ) : void [Public Static]
将一个对象标记为“正在进行更新”。
updateEnd ( $dataitem : DataItem ) : void [Public Static]
取消一个对象的“正在进行更新”标记。
isUpdating ( $dataitem : DataItem ) : bool [Public Static]
检测一个对象是否被标记了“正在进行更新”。
Return : true: 有“正在进行更新”的标记; false没有。
静态类。与Url相关的实用方法。
isUserInfoUrl( $url : string ) : bool [Public Static]
判断所传入的url是否是用户信息的Url。
Return : true : 是; false : 否
isPostUrl( $url : string ) : bool [Public Static]
判断所传入的url是否是帖子的Url。
Return : true : 是; false : 否
isThemeUrl( $url : string ) : bool [Public Static]
判断所传入的url是否是主题的Url。
Return : true : 是; false : 否
isBoardThemeModeUrl( $url : string ) : bool [Public Static]
判断所传入的url是否是主题模式的版块的Url。
Return : true : 是; false : 否
isBoardPostModeUrl( $url : string ) : bool [Public Static]
判断所传入的url是否是一般模式的版块的Url。
Return : true : 是; false : 否
getUserInfoUrl( $id : string ) : string [Public Static]
Return : 用于查询id为$id的用户信息的Url
resolvePostUrl( $post : Post ) : void [Public Static]
将传入的Post的$post->url解析成$board、$file、$num,并分别设置到$post->board、$post->file、$post->num上。
generatePostUrl( $post : Post ) : void [Public Static]
resolvePostUrl的逆过程。依照传入的Post的$post->board、$post->file、$post->num来生成$url,并设置到$post->url上。
resolveThemeUrl( $theme : Theme ) : void [Public Static]
将传入的Theme的$theme->url解析成$board、$gid,并分别设置到$theme->board、$theme->gid上。
generateThemeUrl( $theme : Theme ) : void [Public Static]
resolveThemeUrl的逆过程。依照传入的Theme的$theme->board、$theme->gid来生成$url,并设置到$theme->url上。
getBoardThemeModeUrl( $id : string ) : string [Public Static]
Return : id为$id的版块的主题模式的Url。
getBoardPostModeUrl( $id : string ) : string [Public Static]
Return : id为$id的版块的一般模式的Url。
getThemeSetUrl( $id : string $num : int ) : string [Public Static]
Param :
Return : 用于查询板块中特定序号的贴子的url。
getLoginUrl( $id : string, $password : string ) : string
Param :
Return : 用于登陆的Url。
getFriendListUrl() : string
Return : 好友列表的Url。
getAddFriendUrl( $id : string, $password : string ) : string
Params :
Return : 添加好友的Url。
getDelFriendUrl( $id : string ) : string
Params :
Return : 删除好友的Url。
静态类。用于解析html的实用方法集。
fetchProp( $ipnut : string, $begin='' : string, $end='' : string ) : string
获取输入字符串($ipnut )中夹在$begin和$end的部分。若$end为'',则为$begin到字符串结尾。若$begin为'',则为字符串开始到$end。多用于解析html时,获取特定的属性。
静态类。和Cookie相关的实用方法集。
generateCookie( $cookieStr : string ) : Lily_Cookie [Public Static]
将登陆后百合服务器返回的Cookie由解析成字符串解析成Lily_Cookie用来维持Session。
setCookie( $httpMessage : Lily_HttpMessage, $cookie : Lily_Cookie ) : void [Public Static]
将$cookie转换成Http消息头中的Cookie项,并添加到$httpMessage的Header中。
静态类。与登陆验证有关的实用方法集。
login( $id : string, $password : string ) : Lily_Cookie / bool [Public Static]
登陆,成功返回Cookie,否则返回false。
Param :
事实上在php_http.dll中已经包含了HttpMessage、HttpRequest、HttpResponse三个类。但考虑很多php环境并没有php_http扩展,而且功能太过于完整,用在这里反到有种牛刀杀鸡的感觉。毕竟,只是为了维持一下Session,所以就自己写了几个简单的类。仅能实现程序中必要的功能。并不适应其他的程序环境。
抽象的Http消息。
getHeaders() : [ string=>string] [Public]
Return : 存储Http头信息的数组。
getHeader( $name : string ) : string [Public]
Return : Http头中名称为$name(如'Content-Type')的项的值。
addHeader( $name : string, $value : string ) : void [Public]
添加Http头项。
Param :
getContent() : string [Public]
Return : Http消息的Content。
setContent( $content : string ) : void [Public]
设置Http消息的Content。
继承自Lily_HttpMessage。Http请求。
__construct( $url='' : string, $method='GET' : string ) [Public]
构造函数。
Param :
resolveUrl( $url : string ) : string [Public]
就是nslookup啦~~不过偷了个懒哈~看看方法体就知道了~
generateHeader( $output='' : string ) : string
生成最终的文本形式的Http请求的头。生成的字符串会附加在$output上,并返回。
generateContent( $output : string ) : string
生成最终的文本形式的Http请求的内容。生成的字符串会附加在$output上,并返回。
generateMessage() : string
Return : 最终的文本形式的Http请求。
clearHeader() : void
清空Http请求的头数据。
getResponse() : Lily_HttpResponse
发送该http请求,并将Response返回。
实现Lily_IUpdate,抽象类。是对所有可更新的类的抽象。实现了对数据存储时的更新检测。
__construct( $dataLifeTime : int ) [Public]
构造函数。
Param :
updatePropCheck( $name : string ) : bool [Protected Abstract]
判断名为$name的属性是否是可更新数据。由子类实现。
createUpdater() : Lily_IUpdater [Protected Abstract]
创建一个对应该对象的IUpdater。由子类实现。
暂无已知Bug。
现有的获取版块各称的方法要求额外请求一次。而版块各称变化的可能性很小。所以,利用本地存储的名称可以有效的减少请求次数。可以通过USE_LOCAL_BOARD_NAME来设置是否使用本地数据。
因为命名空间的概念是在php 5.3以后才开始出现的,而php 5.2x仍占着很大比例,所以为了通用性,没有使用命名空间,而是用在类名前加'Lily_'的前缀来实现的。当然了,这也降低了代码的美观,如果想去前缀,全局替换掉'Lily_'即可。
MIT License。代码中用了Simple Html Dom项目。所以就沿用了License。