OneNav
OneNav是一款开源免费的书签(导航)管理程序,由xiaoz使用使用PHP + SQLite 3开发,界面简洁,安装简单,使用方便。OneNav可帮助你你将浏览器书签集中式管理,解决跨设备、跨平台、跨浏览器之间同步和访问困难问题,做到一处部署,随处访问。
- 介绍
- 安装
- 使用说明
- 升级 && 更新
- 变更说明
- API
- Token生成
- 创建分类目录
- 修改分类目录
- 删除分类目录
- 查询分类目录列表
- 查询单个链接信息
- 添加链接
- 修改链接
- 删除链接
- 查询链接列表
- 错误码对照表
- 获取单个分类目录信息
- 获取当前主题自定义参数
- 查询用户是否登录
- 查询指定分类下的链接列表
- 获取站点信息
- 创建目录分享
- 获取目录分享下的链接
- 删除单个目录分享
- 主题开发
- 交流群
介绍
功能特点
- 支持后台管理
- 支持私有链接
- 支持Chrome/Firefox/Edge书签批量导入
- 支持多种主题风格
- 支持链接信息自动识别
- 支持API
- 支持Docker部署
- 支持uTools插件
- 支持二级分类
- 支持Chromium内核的浏览器扩展(插件)
项目地址
技术支持
-
QQ:337003006
-
QQ群:932795364
打赏支持
安装
注意:以下安装方式根据自己的情况任选其一即可。
环境要求
- 5.6 <= PHP <= 7.4
- 需支持SQLite
- PHP需支持pdo_sqlite组件
常规安装
- 访问项目地址:https://github.com/helloxz/onenav/releases 下载最新版本并解压到站点根目录
- 访问您的站点首页设置初始用户名、密码
- 进行安全设置
注意:新手请注意权限问题,否则可能提示权限原因安装失败,宝塔、Oneinstack、lnmp.org的站点用户均为www,可通过ls -l 站点路径
查看文件是否是www用户。
宝塔面板安装(版本可能滞后)
输入域名,并选择支持的PHP版本进行提交。
正常情况会看到如下界面,数据库、用户名、密码创建失败不需要理会,OneNav没有使用MySQL数据。
将您的域名解析到服务器IP,解析生效后访问测试,会看到如下界面,根据提示完成初始化设置即可。
注意:通过宝塔面板安装的可能版本比较滞后
Docker安装
docker run -itd --name="onenav" -p 80:80 \
-v /data/onenav:/data/wwwroot/default/data \
helloz/onenav
-
80
:第1个80端口为访问端口,可自行修改,第2个80为容器内部端口,请不要修改 -
/data/onenav
:本机挂载目录,用于持久存储Onenav数据
docker-compose安装
您也可以选择docker-compose进行安装,将下面的文件保存为docker-compose.yaml
version: '3'
services:
onenav:
container_name: onenav
ports:
- "3080:80"
volumes:
- './data:/data/wwwroot/default/data'
image: 'helloz/onenav'
restart:
always
然后运行命令docker-compose up -d
进行启动。
群晖使用Docker安装
在 docker 文件夹中,创建一个新文件夹,并将其命名为 onenav(注意:装载路径保持下方不变,不要擅自修改)
文件夹 | 装载路径(固定,不要修改) | 说明 |
---|---|---|
docker/onenav | /data/wwwroot/default/data | 存放onenav数据 |
端口不冲突就行,这里用了 9680
本地端口 | 容器端口 |
---|---|
9680 | 80 |
保存并运行,在浏览器中输入 http://群晖IP:9680,就可以看到主界面了
详细说明可参考这篇文章:简单好用的书签管理器OneNav
配置文件说明
配置文件位于站点根目录下的data/config.php
,用户名、密码保存在这个配置文件中,如果忘记了用户名、密码可以查看这个文件,如果需要重新设置用户名、密码,可以将data/config.php
删除,然后重新初始化。
安全设置
如果您使用的Nginx,请务必将以下规则添加到站点配置中,否则数据库可能被下载(非常危险):
#安全设置
location ~* ^/(class|controller|db|data|functions|templates)/.*.(db3|php|php5|sql)$ {
return 403;
}
location ~* ^/(data)/.*.(html)$ {
deny all;
}
location /db {
deny all;
}
#伪静态
rewrite ^/click/(.*) /index.php?c=click&id=$1 break;
rewrite ^/api/(.*)?(.*) /index.php?c=api&method=$1&$2 break;
rewrite /login /index.php?c=login break;
- 如果使用得Apache则无需设置,已内置
.htaccess
进行屏蔽。 - 如果您使用的Docker安装也无需此配置,默认已内置规则
- 如果使宝塔一键安装用户,不需要此设置
Nginx反向代理
如果您使用的Docker部署,需要通过域名进行访问,您可以通过下面2个方法完成:
- 直接将域名解析到您服务器IP,然后访问
http://域名:端口
进行访问 - 如果您不希望带上容器端口,也可以通过Nginx反向代理绑定域名进行访问
Nginx反向代理配置参考:
server {
listen 80;
#改成你自己的域名
server_name demo.onenav.top;
#指定网站日志路径
#access_log /data/logs/demo.onenav.top_nginx.log xlog;
charset utf-8,gbk;
location / {
proxy_connect_timeout 10;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
#chunked_transfer_encoding off;
proxy_set_header Host $host;
#将3080改成你容器的端口
proxy_pass http://127.0.0.1:3080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
使用说明
OneNav使用说明
入门
后台使用
后台登录地址为:http://domain.com/index.php?c=login
或者点击首页顶部按钮。
添加分类
点击导航菜单 - 添加分类进行操作,下方演示添加一个“测试分类”如下截图。
- 权重:权重越高,分类显示越靠前。
- 是否私有:如果选择是,则此分类及其下面的链接对游客隐藏无法查看。
- 描述:分类描述
分类名称图标设置
0.9.22及之后的版本
直接选择图标或者搜索图标添加并保存即可。
0.9.21及之前的版本
分类名称支持Font Awesome 4图标,可前往:https://fontawesome.dashgame.com/ 选择喜欢的图标(V4版本)。然后尝试将字体图标设置为:fa fa-book
,并访问前台查看效果。
添加链接
点击导航菜单 - 添加链接进行操作,如下图。
- 权重:权重越高,当前分类下链接显示越靠前。
- 是否私有:如果选择是,则游客无法查看此链接。
- 描述:这个链接具体是干嘛的。
- 识别按钮:输入URL后自动识别链接名称和描述(不一定所有链接都能自动识别)
前台说明
私有分类后面会显示一把小绿锁,并且该分类及下面的链接对访客不可见。
如果是私有链接,底部会有一条橙色线条,且该链接对访客不可见。
快速添加链接
如果您使用的默认主题,并以管理员身份登录后,右下角会出现“+”按钮,点击可快速添加链接。
右键菜单(快速编辑)
鼠标移动到某个链接上面,并单击鼠标右键,即可弹出右键菜单,可快速编辑、删除、显示二维码,复制原始链接等操作。(仅默认主题支持)
购买订阅
购买订阅
可前往https://shop.xiaoz.top/productinfo-101.html 购买订阅,购买时请填写正确的邮箱和子域名。OneNav是单域名授权模式,因此一定要具体到子域名,比如nav.rss.ink
,不需要加http://
购买完成后会将订单号发送到您的邮箱。
保存完毕后即可享受订阅服务带来的各种高级功能。
没有域名购买订阅
部分同学使用的NAS部署,通过IP方式访问,并没有域名。我们可以通过以下2种方式来解决:
- 购买时随便填写一个域名,然后通过hosts访问
- 购买时随便填写一个域名,然后联系管理员手动修改为IP授权
比如您访问IP是:http://192.168.20.8
,您购买时可以填写一个自定义域名nav.docmain.com
(这个域名可以不是自己的,只要合法即可)
接下来我们修改系统的hosts文件,以Windows操作系统为例,用文本工具打开C:\Windows\System32\drivers\etc
这个文件(推荐第三方编辑器),里面添加一行内容并保存:
192.168.20.8 nav.docmain.com
-
192.168.20.8
填写您的访问IP -
nav.docmain.com
填写您购买订阅时的域名
注意:后续在使用订阅功能,也需要通过此域名访问。
查询与更改订阅
如果您购买时域名不小心填错了或者后期更换了域名,可以通过:https://www.onenav.top/msub.html 查询和修改订阅,但是注意每6个月内才能更换一次。
订阅服务对比
目前订阅分为标准版、高级版、商业版、永久版,对比和区别如下。
版本/功能 | 标准版 | 商业版 | 永久版 |
---|---|---|---|
功能 | 所有 | 所有 | 所有 |
有效期 | 1年 | 永久 | 永久 |
技术支持 | 社区支持 | 社区支持 + 人工服务 | 社区支持 + 人工服务 |
可商用 | 否 | 是 | 否 |
价格 | 29.9元/年 | 189.9元/年 | 109.9元/永久 |
其它说明
如有任何疑问,请联系客服协助处理。
- QQ:446199062
- 微信:xiaozme
更换主题
注意:如果使用的Docker部署,主题位于挂载文件夹的templates
目录下
声明:OneNav所有主题均不收取任何费用,后台下载主题需要订阅是因为平衡服务器存储和带宽成本,未订阅用户可手动下载主题安装。
更换主题方法
适用于常规方式安装
- 下载第三方主题,并解压至
templates
目录下 - 打开OneNav后台 - 系统设置 - 主题设置 - 选择要使用的主题
适用于Docker方式安装
- 在您的挂载目录下创建一个
templates
目录,然后将主题解压至此目录 - 打开OneNav后台 - 系统设置 - 主题设置 - 选择要使用的主题
第三方主题
- 所有第三方主题均可在:https://soft.xiaoz.org/#/public/onenav/themes 进行下载
- 所有主题均通过OneNav作者xiaoz进行了适配,建议OneNav也升级到最新版本
书签导入
自0.9.11
版本开始,支持将Chrome/FireFox/Edge等浏览器书签导入到OneNav,导入前建议先将数据库(data/onenav.db3
)进行备份。
从Google Chrome导入
按快捷键Ctrl + Shift + O
打开Chrome书签管理器(或者地址栏输入chrome://bookmarks/
),点击右上方三个点的按钮。
将书签导出为.html
并记住导出位置,稍后导入需要使用。
导入成功后看到如下提示。
从Firefox导入
输入快捷键Ctrl + Shift + B
打开我的足迹,选择所有书签 - 导出书签到HTML进行保存。
从Edge导入(chromium)
在浏览器标签页输入edge://favorites/
- 打开收藏夹 - 导出收藏夹。
补充说明
目前仅支持.html
格式导入,Chrome/Firefox/Edge测试通过,理论上支持所有chromium内核浏览器,具体请自行测试,不保障所有浏览器书签均能导入成功,导入前请将数据库进行备份。
为什么会导入失败?
- 书签已经存在与数据库中
- 书签标题为空字符
- 书签链接为空字符
过渡页设置
自0.9.18
版本开始新增过渡页设置,开启过渡页面后点击链接会跳转到过渡页面,并根据您的设置会等待数秒再跳转到目标地址。
好处于弊端
好处:
- 过渡页可方便搜索引擎抓取,利于SEO优化
- 可以在过渡页自定义一些内容,比如投放广告
弊端:
- 用户使用体验不友好
过渡页设置
各参数含义如下:
- 如果关闭过页,则用户点击链接后直接跳转到目标地址,不会出现过渡页面,则访客停留时间和管理员停留时间无效
- 如果开启过渡页面,则访客停留时间和管理员停留时间生效
- 访客停留时间:指的是未登录用户点击链接后过渡页停留时长,停留完毕后才跳转到目标地址
- 管理员停留时间:指的是管理员点击链接后过渡页停留时长,停留完毕后才跳转到目标地址
高级功能
过渡页高级功能包括过渡页菜单/自定义footer/广告设置
,支持HTML代码,需要订阅用户才能使用(非订阅用户请留空),设置参数如下。
过渡页菜单参考代码:
<li class="nav-item">
<a class="nav-link" href="https://www.xiaoz.me/">小z博客</a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://www.imgurl.org/">ImgURL免费图床</a>
</li>
©2022 Powered by <a href="https://www.xiaoz.me/" title = "小z博客" rel = "nofollow" target = "_blank">xiaoz</a>
自定义广告参考代码:
<a href = "https://www.xiaoz.me" target = "_blank"><img src = "https://img.rss.ink/imgs/2022/06/01/d90d1feb9391fc06.png" /></a>
注意:广告图片宽度需要只要大于730px,效果如下图。
站点设置
自0.9.18
版本开始,站点信息可通过OneNav后台进行设置,不用再修改config.php
配置文件来完成。
使用说明
参数说明
- 网站Logo:可以填写文字,或者图片相对路径、绝对路径、URL地址都是允许的,具体取决于您使用的主题,另外部分主题可能不支持网站logo
- 网站关键词:多个关键词使用英文状态下的
,
号分隔 - 自定义header,这里可以填写CSS或者JS内容,如果您不清楚,请不要填写
自定义header详细说明
自定义header仅对用户首页和过渡页生效,部分主题可能未适配这个功能,默认主题是支持的。
比如您可以添加百度统计代码,比如:
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?xxx";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
也或者自定义网站CSS:
<style type="text/css">
/*链接描述是否显示*/
.site-main .site-list .list .desc {
/*none:不显示,block:显示*/
display: none;
}
</style>
主题设置说明
default(默认主题)
0.9.20
可以在“系统设置 - 主题设置 - 找到默认主题 - 参数设置”进行参数设置。
默认主题会看到如下参数:
参数含义如下:
- full_width_mode:宽屏模式
on
为开启,off
为关闭 - link_description:是否隐藏链接描述
hide
为隐藏,show
为显示 - favicon:链接字体图标
online
为在线获取(需要联网),offline
为离线获取,离线获取使用链接第一个字符作为图标
0.9.19
如果需要隐藏默认主题的描述,请在“系统设置 - 站点设置 - 自定义header”添加如下CSS内容进行隐藏:
<style type="text/css">
/*隐藏默认主题描述*/
.link-content{
display:none;
}
.link-line{
height:56px;
}
</style>
baisuTwo
0.9.20
及之后的版本如果需要显示baisuTwo主题的描述,可以将link_description
修改为show
0.9.19
如果需要隐藏baisuTwo主题的描述,可以在“系统设置 - 站点设置 - 自定义header”添加如下CSS内容进行隐藏:
<style type="text/css">
/*链接描述是否显示*/
.site-main .site-list .list .desc {
/*none:不显示,block:显示*/
display: none;
}
</style>
- favicon:
offline
使用文字图标(默认),online
使用在线自动图标
5iux
- shortcut_icon:网站的ico图标(浏览器图标),如果为空,则保持默认,比如填写
https://nav.rss.ink/favicon.ico
- link_icon:链接图标展示方式,可选值有
- text:文字图标(默认)
- custom:自定义链接图标
sou
- bing_wallpaper:是否启用Bing壁纸作为背景图,默认为
off
,如果为on
则启用 - favicon:链接前面的字体图标,默认
online
使用在线图标(需要联网),如果是内网使用可设置为off
则使用文字图标 - shortcut_icon:网站的ico图标(浏览器图标),如果为空,则保持默认,比如填写
https://nav.rss.ink/favicon.ico
webstack
- column:显示链接的列数,默认为
4
可选为6
- link_icon:链接图标展示方式,可选值有
- text:文字图标(默认)
- custom:自定义链接图标
heimdall
此主题来源于独立导航程序Heimdall,由xiaoz适配到OneNav,该主题非常适合少量书签的NAS用户。主题参数如下:
-
default_category_id
:要展示哪个分类ID下的链接,默认为0,则展示权重最高的分类。(在分类管理 - 分类列表,可以查看每个分类的ID) -
link_icon
:图标显示方式,可选值有:- custom:自定义图标(默认)
- text:文字图标
-
default_search
:默认搜索引擎,可选值有:- baidu:百度搜索(默认)
- google:Google搜索
- bing:必应搜索
- sogou:搜狗搜索
- 360:360搜索(这个参数存在一点BUG,暂时不要设置)
- zhihu:知乎搜索
- weibo:微博搜索
使用浏览器扩展(插件)
安装浏览器扩展
- Chrome/Edge用户:https://chromewebstore.google.com/detail/onenav/omlkjgkogkfpjbdigianpdbjncdchdco
- Firefox用户:https://addons.mozilla.org/zh-CN/firefox/addon/onenav/
- 离线安装(仅适用于Chrome/Edge用户):https://soft.xiaoz.org/onenav/extension/onenav_browser_extension_1.0.0.zip
如果无法打开Chrome Web Store的用户,也可以按照下面的方法手动下载扩展并安装。以Chrome浏览器为例:
设置API
- 复制并记录“API域名”(稍后使用)
- 如果“SecretKey”为空,先点击“生成SecretKey”,然后再点击“计算Token”,并复制计算后得到的“Token”(稍后使用)
打开Chrome浏览器右上角的“扩展程序”图标,将OneNav扩展进行固定。
填写您的API域名和刚刚得到的Token,并点保存按钮。(注意:OneNav域名前面需要带上http://或https://末尾不需要/)
添加书签
您可以打开任意网址,然后鼠标右键 - 选择添加到OneNav书签,并保存即可。
或者进入某个网页后,点击右上角OneNav(书签)图标,然后选择添加链接按钮。
常见问题
设置API后书签不显示?
添加链接后没有显示书签? 为了减少网络请求,提高加载速度,数据会缓存到浏览器本地存储,如果添加后书签未能显示,可尝试点击“刷新数据按钮”
添加链接的时候所属分类是空的?
- 请检查API设置是否正确
- 尝试点击“刷新数据”试试
uTools插件
安装uTools for OneNav插件
使用
再次呼出uTools,输入其中任意关键词打开OneNav插件。关键词为:"onenav", "one","nav","bookmarks","book"
首次打开看到的书签是官方默认的(https://nav.rss.ink),您可以点击右下方设置按钮,设置你自己的OneNav地址:
设置如下截图:
进阶
您可以在uTools偏好设置中,设置onenav快捷键,比如我这里设置的Shift + B
,下次只需要直接输入Shift + B
即可打开onenav插件。
注意
- 如果书签显示为空,可能是您API设置有误
- 如有疑问或BUG请联系QQ:337003006进行反馈
重置密码
查看当前用户名、密码
找到站点目录下的data/config.php
,找到如下字段就是用户名、密码。
//用户名
define('USER','xiaoz');
//密码
define('PASSWORD','xiaoz.me');
- 上面的
xiaoz
为用户名,请改成自己的 - 上面的
xiaoz.me
为密码,请改成自己的
修改密码
此方法全版本通用,找到站点目录下的data/config.php
,修改如下字段即可:
//用户名
define('USER','xiaoz');
//密码
define('PASSWORD','xiaoz.me');
升级 && 更新
查看版本号
打开站点根目录下的version.txt
可查看当前版本号,或者登录后台可以看到。
一键更新(推荐)
备注:此方法适用所有安装方式,包括Docker安装的也可以使用此方法更新。
还未订阅的用户可前往:https://shop.xiaoz.top/productinfo-101.html 购买订阅服务。
注意:Docker用户不要混用更新方式,比如:
- 不要部分版本一键更新,部分版本修改tag更新,这样会造成版本混乱和冲突
- 要么后续版本全部一键更新,要么后续版本全部修改tag标签更新
常规安装方式更新(手动)
v0.9.19-0.9.29升级到v0.9.32
备份整个站点,下载最新版源码覆盖升级。
v0.9.18升级到v0.9.19
备份整个站点,下载最新版源码覆盖升级。然后访问一次后台升级数据库即可。
v0.9.9-v0.9.17升级到v0.9.18
备份整个站点,下载最新版源码覆盖升级。
- 升级完毕后访问下后台:https://你的域名/index.php?c=admin等待数据库自动升级完毕
- 打开OneNav后台 - 站点设置 - 填写您的站点信息。参考站点设置
- 打开OneNav后台 - 主题设置 - 选择你要使用的主题
v0.9.8及以下版本升级为v0.9.9
自v0.9.9版本开始,为了适配Docker,目录结构有所变更,请按照如下方法升级:
-
升级前请务必备份数据(直接打包整个站点即可)
-
前往Github:https://github.com/helloxz/onenav/releases 下载对应版本解压覆盖
-
将站点根目录下已经存在的
config.php
移动到data
目录下 -
将
db/onenav.db3
移动到data
目录下 -
将
config.php
里面的'database_file' => 'db/onenav.db3'
修改为'database_file' => 'data/onenav.db3'
(简而言之就是db目录修改为data目录) -
对照安全设置中伪静态规则是否一致
Docker安装方式
v0.9.11 -> v0.9.12
#停止运行中的容器
docker stop onenav
#更新镜像
docker pull helloz/onenav
#删除原来的容器
docker rm onenav
#重新启动一个容器
docker run -itd --name="onenav" -p 80:80 \
-v /data/onenav:/data/wwwroot/default/data \
helloz/onenav
-
80
:第一个80端口为访问端口(填写你之前设置的端口) -
/data/onenav
:本机挂载目录,用于持久存储Onenav数据,请填写您之前挂载的目录
其它说明
- 若无其它特别说明,默认只需要备份数据后覆盖升级即可。
在线更新失败?
如果提示权限问题写入失败,请检查目录权限,通常不建议直接通过命令行的root
直接操作,否则很容易出现权限问题,如果出现权限问题,您可以通过以下方式解决。
Oneinstack用户/LNMP用户:
如果您使用的Oneinstack集成环境或lnmp.org集成环境,请在命令行执行:
chown -R www:www /您的站点路径
宝塔用户:
通过文件管理,进入您的站点 - 勾选全部文件 - 点右上角权限 - 然后点下确定即可,如下图。
如果提示超时,通常是网络原因,可以刷新页面再次点更新按钮进行尝试。
如果是其它报错,请联系QQ:446199062进行反馈,并提供页面上的更新日志。
变更说明
此页面针对新版本发布时一些特殊变更说明,请务必仔细阅读。
0.9.20
0.9.19
0.9.18
0.9.16
更新内容
- 新增HttpOnly支持
- API新增查询单个链接信息get_a_link:https://doc.xiaoz.org/books/onenav/page/c0e19
- API支持查询指定分类下的链接link_list,传递参数category_id:https://doc.xiaoz.org/books/onenav/page/92c8c
- 新增数据库更新功能
- 初始数据库更新
- 分离分类图标字体设置
变更说明
数据库更新功能: 用户登录后台首页时会检测数据库是否存在更新,其它后台页面不做检测,通常用户无需关注,除非提示有更新失败的情况。
用户更新到0.9.16
时,请务必多刷新几次后台首页,确保所有SQL完全更新,直到日志提示无可用更新。
添加分类图标时,0.9.16
字体图标已经分离,对原有字体图标做了兼容性显示处理。
但是针对新增或修改,请务必使用新的方式添加。比如原来的分类名称为<i class="fa fa-html5"></i> 站长工具
,现在应该修改为:
- 分类名称:填写
站长工具
- 字体图标:填写
fa fa-html5
注意:新增或更新分类请务必按照新方法填写,否则会导致添加链接的时候分类名称显示异常。
API
OneNav API使用说明。
Token生成
通过API创建、修改、删除分类/链接时必须传递token参数,下面介绍如何拼接计算token
0.9.19及之后的版本
然后点击页面上的“计算Token”,并将计算后的Token结果复制使用。
0.9.18及之前的版本
首先找到config.php
中,USER
和TOKEN
两个参数,比如:
//用户名
define('USER','xiaoz');
//token参数,API需要使用
define('TOKEN','xiaoz.me');
计算方法为:USER
+ TOKEN
,再进行md5加密,上面的示例PHP代码为:
md5('xiaozxiaoz.me');
创建分类目录
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=add_category
- 请求方法:POST
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 是 | 请参考token生成 |
name | 测试分类 | string | 是 | 分类名称 |
fid | 0 | int | 是 | 父级分类ID,如果为0则代表是顶级分类 |
font_icon | fa fa-bookmark-o | string | 否 | CSS字体图标 |
weight | 0 | int(1) | 否 | 分类权重,取值0-99 |
property | 0 | int(1) | 否 | 是否私有,0:公开(默认),1:私有 |
description | string | 否 | 分类描述 |
请求成功响应
{
"code": 0,
"id": 21
}
- code:响应状态码,0代表成功
- id:返回分类ID
请求失败响应
{
"code": -1000,
"err_msg": "Categorie already exist!"
}
- code:错误码
- err_msg:错误描述
修改分类目录
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=edit_category
- 请求方法:POST
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 是 | 请参考token生成 |
id | 21 | int | 是 | 分类ID |
name | 测试分类 | string | 是 | 分类名称 |
fid | 0 | int | 是 | 父级分类ID,如果为0则代表是顶级分类 |
font_icon | fa fa-bookmark-o | string | 否 | CSS字体图标 |
weight | 0 | int(1) | 否 | 分类权重,取值0-99 |
property | 0 | int(1) | 否 | 是否私有,0:公开(默认),1:私有 |
description | string | 否 | 分类描述 |
请求成功响应
{
"code": 0,
"msg": "successful"
}
- code:响应状态码,0代表成功
- msg:消息描述
请求失败响应
{
"code": -1000,
"err_msg": "Categorie already exist!"
}
- code:错误码
- err_msg:错误描述
删除分类目录
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=del_category
- 请求方法:POST
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 是 | 请参考token生成 |
id | 21 | int | 是 | 分类ID |
请求成功响应
{
"code": 0,
"msg": "successful"
}
- code:响应状态码,0代表成功
- msg:消息描述
请求失败响应
{
"code": -1007,
"err_msg": "The category delete failed!"
}
- code:错误码
- err_msg:错误描述
查询分类目录列表
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=category_list&page=1&limit=10
- 请求方法:POST
- page:当前分页
- limit:限制查询的条数
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 否 | 请参考token生成 |
请求成功响应
{
"code": 0,
"msg": "",
"count": 6,
"data": [
{
"0": "8",
"1": "<i class=\"fa fa-external-link\"></i> 常用链接",
"2": "1607747674",
"3": "1607865180",
"4": "99",
"5": "0",
"6": "",
"id": "8",
"name": "<i class=\"fa fa-external-link\"></i> 常用链接",
"add_time": "1607747674",
"up_time": "1607865180",
"weight": "99",
"property": "0",
"description": ""
},
{
"0": "19",
"1": "<i class=\"fa fa-html5\"></i> 站长工具",
"2": "1607866471",
"3": "",
"4": "80",
"5": "0",
"6": "",
"id": "19",
"name": "<i class=\"fa fa-html5\"></i> 站长工具",
"add_time": "1607866471",
"up_time": "",
"weight": "80",
"property": "0",
"description": ""
},
{
"0": "3",
"1": "<i class=\"fa fa-linux\"></i> 运维工具",
"2": "1607699882",
"3": "1607865657",
"4": "80",
"5": "0",
"6": "",
"id": "3",
"name": "<i class=\"fa fa-linux\"></i> 运维工具",
"add_time": "1607699882",
"up_time": "1607865657",
"weight": "80",
"property": "0",
"description": ""
},
{
"0": "18",
"1": "<i class=\"fa fa-video-camera\"></i> 视频影音",
"2": "1607865982",
"3": "1607866160",
"4": "10",
"5": "0",
"6": "",
"id": "18",
"name": "<i class=\"fa fa-video-camera\"></i> 视频影音",
"add_time": "1607865982",
"up_time": "1607866160",
"weight": "10",
"property": "0",
"description": ""
},
{
"0": "4",
"1": "<i class=\"fa fa-female\"></i> 18+",
"2": "1607699983",
"3": "1608046903",
"4": "0",
"5": "0",
"6": "",
"id": "4",
"name": "<i class=\"fa fa-female\"></i> 18+",
"add_time": "1607699983",
"up_time": "1608046903",
"weight": "0",
"property": "0",
"description": ""
}
]
}
- code:响应状态码,0代表成功
- data.id:分类ID
- data.name:分类名称
- data.add_time:分类添加时间
- data.up_time:分类修改时间
- data.weight:分类权重,权重越高,排名越靠前
- data.property:分类熟悉,0:公开,1:私有
- data.description:分类描述
请求失败响应
{
"code": -1000,
"err_msg": "Categorie already exist!"
}
- code:错误码
- err_msg:错误描述
查询单个链接信息
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=get_a_link&id={id}
- 请求方法:GET
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
id | 1 | int | 是 | 链接ID |
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 否 | 请参考token生成 |
请求成功响应
{
"code": 0,
"data": {
"id": "2",
"fid": "19",
"title": "安装文档",
"url": "https://www.yuque.com/helloz/onenav/install",
"description": "OneNav安装文档。",
"add_time": "1608042226",
"up_time": "1608042440",
"weight": "0",
"property": "0",
"click": "1"
}
}
请求失败响应
{
"code": -1002,
"err_msg": "Authorization failure!"
}
- code:错误码
- err_msg:错误描述
添加链接
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=add_link
- 请求方法:POST
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 是 | 请参考token生成 |
url | https://www.xiaoz.me | string(256) | 是 | 链接地址,需以http://或https://开头 |
title | 小z博客 | string | 是 | 链接标题 |
fid | 1 | int | 是 | 分类ID |
weight | 0 | int(1) | 否 | 分类权重,取值0-99 |
property | 0 | int(1) | 否 | 是否私有,0:公开(默认),1:私有 |
description | string | 否 | 分类描述 |
请求成功响应
{
"code": 0,
"id": "35"
}
- code:响应状态码,0代表成功
- id:返回链接ID
请求失败响应
{
"code": -1011,
"err_msg": "The URL already exists!"
}
- code:错误码
- err_msg:错误描述
修改链接
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=edit_link
- 请求方法:POST
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 是 | 请参考token生成 |
id | 35 | int | 是 | 链接ID |
url | https://www.xiaoz.me | string(256) | 是 | 链接地址,需以http://或https://开头 |
title | 小z博客 | string | 是 | 链接标题 |
fid | 1 | int | 是 | 分类ID |
weight | 0 | int(1) | 否 | 分类权重,取值0-99 |
property | 0 | int(1) | 否 | 是否私有,0:公开(默认),1:私有 |
description | string | 否 | 分类描述 |
请求成功响应
{
"code": 0,
"msg": "successful"
}
- code:响应状态码,0代表成功
- msg:消息描述
请求失败响应
{
"code": -1008,
"err_msg": "The title cannot be empty!"
}
- code:错误码
- err_msg:错误描述
删除链接
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=del_link
- 请求方法:POST
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 是 | 请参考token生成 |
id | 21 | int | 是 | 链接ID |
请求成功响应
{
"code": 0,
"msg": "successful"
}
- code:响应状态码,0代表成功
- msg:消息描述
请求失败响应
{
"code": -1010,
"err_msg": "link id not exists!"
}
- code:错误码
- err_msg:错误描述
查询链接列表
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=link_list&page=[page]&limit=[limit]
- 请求方法:GET + POST
请求参数
参数名称 | 请求方法 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|---|
token | POST | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 否 | 请参考token生成 |
page | GET | 1 | int | 否 | 当前页码 |
limit | GET | 10 | int | 否 | 每页显示条数 |
请求成功响应
{
"code": 0,
"msg": "",
"count": 30,
"data": [
{
"0": "34",
"1": "20",
"2": "transmission",
"3": "http://192.168.50.6:32769/transmission/web/",
"4": "transmission",
"5": "1608299921",
"6": null,
"7": "0",
"8": "0",
"9": "0",
"10": "<i class=\"fa fa-wifi\"></i> LAN",
"id": "34",
"fid": "20",
"title": "transmission",
"url": "http://192.168.50.6:32769/transmission/web/",
"description": "transmission",
"add_time": "1608299921",
"up_time": null,
"weight": "0",
"property": "0",
"click": "0",
"category_name": "<i class=\"fa fa-wifi\"></i> LAN"
},
{
"0": "32",
"1": "19",
"2": "顶级域名注册商",
"3": "https://www.icann.org/registrar-reports/accreditation-qualified-list.html",
"4": "icann认证顶级域名注册商列表。",
"5": "1608126988",
"6": null,
"7": "0",
"8": "0",
"9": "1",
"10": "<i class=\"fa fa-html5\"></i> 站长工具",
"id": "32",
"fid": "19",
"title": "顶级域名注册商",
"url": "https://www.icann.org/registrar-reports/accreditation-qualified-list.html",
"description": "icann认证顶级域名注册商列表。",
"add_time": "1608126988",
"up_time": null,
"weight": "0",
"property": "0",
"click": "1",
"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
},
{
"0": "31",
"1": "3",
"2": "CSR文件生成工具",
"3": "https://www.chinassl.net/ssltools/generator-csr.html",
"4": "免费CSR生成工具,生成CSR工具,在线CSR生产工具,生成ECC CSR工具,ECC证书CSR生成工具,ECC CSR文件生成,Certificate Signing Request Generator tools",
"5": "1608105958",
"6": null,
"7": "0",
"8": "0",
"9": "0",
"10": "<i class=\"fa fa-linux\"></i> 运维工具",
"id": "31",
"fid": "3",
"title": "CSR文件生成工具",
"url": "https://www.chinassl.net/ssltools/generator-csr.html",
"description": "免费CSR生成工具,生成CSR工具,在线CSR生产工具,生成ECC CSR工具,ECC证书CSR生成工具,ECC CSR文件生成,Certificate Signing Request Generator tools",
"add_time": "1608105958",
"up_time": null,
"weight": "0",
"property": "0",
"click": "0",
"category_name": "<i class=\"fa fa-linux\"></i> 运维工具"
},
{
"0": "30",
"1": "4",
"2": "嘿嘿,不给你看。",
"3": "https://www.yuque.com/helloz/onenav",
"4": "此分类是私有链接,你看不到哦。",
"5": "1608046983",
"6": null,
"7": "0",
"8": "0",
"9": "20",
"10": "<i class=\"fa fa-female\"></i> 18+",
"id": "30",
"fid": "4",
"title": "嘿嘿,不给你看。",
"url": "https://www.yuque.com/helloz/onenav",
"description": "此分类是私有链接,你看不到哦。",
"add_time": "1608046983",
"up_time": null,
"weight": "0",
"property": "0",
"click": "20",
"category_name": "<i class=\"fa fa-female\"></i> 18+"
},
{
"0": "29",
"1": "19",
"2": "在线图片转icon格式",
"3": "https://app.xunjiepdf.com/img2icon",
"4": "迅捷在线图片格式转换软件免费版为您免费提供在线图片格式转换,图片转icon,图片转换成icon等免费图片格式转换服务!",
"5": "1607869485",
"6": null,
"7": "0",
"8": "0",
"9": "1",
"10": "<i class=\"fa fa-html5\"></i> 站长工具",
"id": "29",
"fid": "19",
"title": "在线图片转icon格式",
"url": "https://app.xunjiepdf.com/img2icon",
"description": "迅捷在线图片格式转换软件免费版为您免费提供在线图片格式转换,图片转icon,图片转换成icon等免费图片格式转换服务!",
"add_time": "1607869485",
"up_time": null,
"weight": "0",
"property": "0",
"click": "1",
"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
},
{
"0": "28",
"1": "19",
"2": "在线扒站高级版",
"3": "https://ishow.fun/",
"4": "动态网页扒站,免费仿站,扒站工具高级版,在线扒站高级版,手机扒站,在线扒站工具,扒站软件,扒网站工具高级版,仿站工具,网站下载器,单页扒站小工具",
"5": "1607869040",
"6": null,
"7": "0",
"8": "0",
"9": "6",
"10": "<i class=\"fa fa-html5\"></i> 站长工具",
"id": "28",
"fid": "19",
"title": "在线扒站高级版",
"url": "https://ishow.fun/",
"description": "动态网页扒站,免费仿站,扒站工具高级版,在线扒站高级版,手机扒站,在线扒站工具,扒站软件,扒网站工具高级版,仿站工具,网站下载器,单页扒站小工具",
"add_time": "1607869040",
"up_time": null,
"weight": "0",
"property": "0",
"click": "6",
"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
},
{
"0": "27",
"1": "19",
"2": "NameBeta",
"3": "https://namebeta.com/",
"4": "域名比价工具。",
"5": "1607868954",
"6": null,
"7": "0",
"8": "0",
"9": "5",
"10": "<i class=\"fa fa-html5\"></i> 站长工具",
"id": "27",
"fid": "19",
"title": "NameBeta",
"url": "https://namebeta.com/",
"description": "域名比价工具。",
"add_time": "1607868954",
"up_time": null,
"weight": "0",
"property": "0",
"click": "5",
"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
},
{
"0": "26",
"1": "19",
"2": "哪煮米",
"3": "https://www.nazhumi.com/",
"4": "哪煮米是一家专业的域名比价平台,提供超过1500种域名后缀,超过50家全球域名注册商的在线比价,一键选到你满意的注册商",
"5": "1607868904",
"6": null,
"7": "0",
"8": "0",
"9": "6",
"10": "<i class=\"fa fa-html5\"></i> 站长工具",
"id": "26",
"fid": "19",
"title": "哪煮米",
"url": "https://www.nazhumi.com/",
"description": "哪煮米是一家专业的域名比价平台,提供超过1500种域名后缀,超过50家全球域名注册商的在线比价,一键选到你满意的注册商",
"add_time": "1607868904",
"up_time": null,
"weight": "0",
"property": "0",
"click": "6",
"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
},
{
"0": "25",
"1": "19",
"2": "Domain Availability and Price",
"3": "https://www.domcomp.com/",
"4": "Considering to register, renew or transfer a domain? Check domain name availability and compare domain prices for 714 extensions across 38 providers with Domcomp. You can find cheap domains to buy or get the cheapest price for your desired URL name with up-to-date coupon. Lookup and compare now!",
"5": "1607868880",
"6": null,
"7": "0",
"8": "0",
"9": "3",
"10": "<i class=\"fa fa-html5\"></i> 站长工具",
"id": "25",
"fid": "19",
"title": "Domain Availability and Price",
"url": "https://www.domcomp.com/",
"description": "Considering to register, renew or transfer a domain? Check domain name availability and compare domain prices for 714 extensions across 38 providers with Domcomp. You can find cheap domains to buy or get the cheapest price for your desired URL name with up-to-date coupon. Lookup and compare now!",
"add_time": "1607868880",
"up_time": null,
"weight": "0",
"property": "0",
"click": "3",
"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
},
{
"0": "24",
"1": "19",
"2": "钻磊二级域名分发",
"3": "https://dns.txizd.cn/",
"4": "钻磊二级域名分发(dns.txizd.cn)成立于2019-3-2,是一家专门提供二级域名解析分发的平台,域名均免费提供使用,不收取任何费用,提供的域名当中有已备案域名和未备案域名,域名后缀多可自主选择解析,欢迎大家来钻磊域名解析网使用。",
"5": "1607868853",
"6": null,
"7": "0",
"8": "0",
"9": "8",
"10": "<i class=\"fa fa-html5\"></i> 站长工具",
"id": "24",
"fid": "19",
"title": "钻磊二级域名分发",
"url": "https://dns.txizd.cn/",
"description": "钻磊二级域名分发(dns.txizd.cn)成立于2019-3-2,是一家专门提供二级域名解析分发的平台,域名均免费提供使用,不收取任何费用,提供的域名当中有已备案域名和未备案域名,域名后缀多可自主选择解析,欢迎大家来钻磊域名解析网使用。",
"add_time": "1607868853",
"up_time": null,
"weight": "0",
"property": "0",
"click": "8",
"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
}
]
}
- code:响应状态码,0代表成功
- data.id:链接ID
- data.fid:父及分类ID
- data.title:链接标题
- data.url:链接URL
- data.add_time:分类添加时间
- data.up_time:分类修改时间
- data.weight:分类权重,权重越高,排名越靠前
- data.property:分类熟悉,0:公开,1:私有
- data.description:分类描述
- data.click:链接点击数
请求失败响应
{
"code": -1000,
"err_msg": "Authorization failure!"
}
- code:错误码
- err_msg:错误描述
错误码对照表
所有API请求错误码可参考如下表格进行对照,如有疑问,请反馈。此对照表已经废弃,默认情况下0
和200
代表成功,其余状态码一律为失败。
code | err_msg | 描述 |
---|---|---|
-1000 | Categorie already exist! | 分类目录已存在 |
-1002 | Authorization failure! | token认证失败 |
-1003 | The category ID cannot be empty! | 分类目录ID不能为空 |
-1004 | The category name cannot be empty! | 分类目录名不能为空 |
-1005 | The category name already exists! | 分类目录名已存在 |
-1006 | The category is not empty and cannot be deleted! | 分类目录不为空,无法删除 |
-1007 | The category delete failed! | 分类目录删除失败 |
-1008 | The title cannot be empty! | 链接标题不能为空 |
-1009 | URL cannot be empty! | URL不能为空 |
-1010 | URL is not valid! | URL链接不合法 |
-1011 | The URL already exists! | URL链接已经存在 |
-1012 | link id not exists! | 链接ID不存在 |
获取单个分类目录信息
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=get_a_category
- 请求方法:POST
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
id | 1 | int | 是 | 分类ID |
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 否 | 请参考token生成 |
请求成功响应
{
"code": 0,
"data": {
"id": "22",
"name": "你好啊",
"add_time": "1646715733",
"up_time": "",
"weight": "0",
"property": "1",
"description": "第三代",
"font_icon": "fa fa-linux"
}
}
请求失败响应
{
"code": -1002,
"err_msg": "Authorization failure!"
}
- code:错误码
- err_msg:错误描述
获取当前主题自定义参数
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=get_theme_config
- 请求方法:GET
返回参数说明
{
"code": 200,
"data": {
"full_width_mode": "on",
"link_description": "hide",
"favicon": "online"
},
"msg": ""
}
-
code
:状态码,0
或者200
代表成功,其余为失败 -
data
:返回的参数数据 -
msg
:成功时为空,失败时为具体错误原因
查询用户是否登录
- 请求地址:http://domain.com/index.php?c=api&method=check_login
- 请求方法:GET
返回值
{
"code": 200,
"data": "true",
"msg": ""
}
-
code
:状态码,200代表请求成功 -
data
:true
代表已经登录,false
则未登录
如果失败,返回:
{
"code": -1002,
"err_msg": "Authorization failure!"
}
查询指定分类下的链接列表
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=q_category_link&page=[page]&limit=[limit]
- 请求方法:GET + POST
请求参数
参数名称 | 请求方法 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|---|
token | POST | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 否 | 请参考token生成 |
category_id | POST | 1 | int | 是 | 分类ID |
page | GET | 1 | int | 否 | 当前页码 |
limit | GET | 10 | int | 否 | 每页显示条数 |
请求成功响应
{
"code": 0,
"msg": "",
"count": 2,
"data": [
{
"id": "20",
"0": "20",
"fid": "19",
"1": "19",
"title": "百度一下,你就知道",
"2": "百度一下,你就知道",
"url": "https:\/\/www.baidu.com\/index.php?tn=22073068_2_dg",
"3": "https:\/\/www.baidu.com\/index.php?tn=22073068_2_dg",
"description": "",
"4": "",
"add_time": "1650551209",
"5": "1650551209",
"up_time": null,
"6": null,
"weight": "0",
"7": "0",
"property": "0",
"8": "0",
"click": "2",
"9": "2",
"topping": "0",
"10": "0",
"url_standby": null,
"11": null,
"category_name": "默认分类",
"12": "默认分类"
},
{
"id": "19",
"0": "19",
"fid": "19",
"1": "19",
"title": "你好",
"2": "你好",
"url": "magnet:?xt=urn:btih:d212b7968eacb056301410bb6473436e51f2e395",
"3": "magnet:?xt=urn:btih:d212b7968eacb056301410bb6473436e51f2e395",
"description": "",
"4": "",
"add_time": "1650275033",
"5": "1650275033",
"up_time": null,
"6": null,
"weight": "0",
"7": "0",
"property": "0",
"8": "0",
"click": "0",
"9": "0",
"topping": "0",
"10": "0",
"url_standby": "",
"11": "",
"category_name": "默认分类",
"12": "默认分类"
}
]
}
- code:响应状态码,0代表成功
- data.id:链接ID
- data.fid:父及分类ID
- data.title:链接标题
- data.url:链接URL
- data.add_time:分类添加时间
- data.up_time:分类修改时间
- data.weight:分类权重,权重越高,排名越靠前
- data.property:分类熟悉,0:公开,1:私有
- data.description:分类描述
- data.click:链接点击数
请求失败响应
{
"code": -1000,
"err_msg": "Authorization failure!"
}
- code:错误码
- err_msg:错误描述
获取站点信息
接口说明
改接口可以获取站点信息,比如站点标题、描述等信息。
- 请求地址:http://domain.com/index.php?c=api&method=site_info
- 请求方法:GET
- 该接口无需认证,也不需要额外参数
请求成功相应
{
"code": 200,
"data": {
"title": "OneNav",
"logo": "http:\/\/onenav.com\/templates\/baisuTwo\/images\/logo.png",
"subtitle": "开源书签管理程序",
"keywords": "OneNav,OneNav导航,OneNav书签,开源导航,开源书签,简洁导航,云链接,个人导航,个人书签",
"description": "OneNav是一款开源免费的书签(导航)管理程序,由xiaoz使用使用PHP + SQLite 3开发,界面简洁,安装简单,使用方便。OneNav可帮助你将浏览器书签集中式管理,解决跨设备、跨平台、跨浏览器之间同步和访问困难问题,做到一处部署,随处访问。",
"custom_header": "<script>\nWIDGET = {\n \"CONFIG\": {\n \"modules\": \"01234\",\n \"background\": \"1\",\n \"tmpColor\": \"FFFFFF\",\n \"tmpSize\": \"16\",\n \"cityColor\": \"FFFFFF\",\n \"citySize\": \"16\",\n \"aqiColor\": \"FFFFFF\",\n \"aqiSize\": \"16\",\n \"weatherIconSize\": \"24\",\n \"alertIconSize\": \"18\",\n \"padding\": \"10px 10px 10px 10px\",\n \"shadow\": \"0\",\n \"language\": \"auto\",\n \"fixed\": \"false\",\n \"vertical\": \"top\",\n \"horizontal\": \"left\",\n \"key\": \"1dabf01cec5c4342b1b1fa9e8b9a05f8\"\n }\n}\n<\/script>\n<script src=\"https:\/\/widget.qweather.net\/simple\/static\/js\/he-simple-common.js?v=2.0\"><\/script>\n\n<script>\nvar _hmt = _hmt || [];\n(function() {\n var hm = document.createElement(\"script\");\n hm.src = \"https:\/\/hm.baidu.com\/hm.js?xxx\";\n var s = document.getElementsByTagName(\"script\")[0]; \n s.parentNode.insertBefore(hm, s);\n})();\n<\/script>",
"custom_footer": "© 2022 Powered by <a target = \"_blank\" href=\"https:\/\/github.com\/helloxz\/onenav\" title = \"简约导航\/书签管理器\" rel = \"nofollow\">OneNav<\/a>.The author is <a href=\"https:\/\/www.xiaoz.me\/\" target=\"_blank\" title = \"小z博客\">xiaoz.mesdsd<\/a>",
"link_model": "jump"
},
"msg": "success"
}
创建目录分享
接口说明
该接口可以创建制定分类下的链接分享,对应OneNav后台的“书签分享功能”
- 请求地址:http://domain.com/index.php?c=api&method=create_share
- 请求方法:POST
请求参数
参数名称 | 请求方法 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|---|
token | POST | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 否 | 请参考token生成 |
expire_time | POST | 2022-12-12 12:00:00 | string | 是 | 过期时间 |
cid | POST | 20 | int | 是 | 分类ID |
note | POST | 备注内容 | string | 否 | 备注内容 |
password | POST | ABCD | string | 否 | 密码 |
获取目录分享下的链接
接口说明
改接口可以获取某个分享目录下的所有链接:
- 请求地址:http://domain.com/index.php?c=api&method=get_sid_links
- 请求方法:GET
请求参数
参数名称 | 请求方法 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|---|
sid | POST | ADv7jhkI | string(8) | 是 | 请参考token生成 |
password | POST | xxxx | string | 否 | 密码 |
请求成功响应
{
"code": 200,
"data": {
"category_name": "站长工具2",
"expire_time": "2022-11-24 00:00:00",
"results": [
{
"id": "29",
"fid": "26",
"title": "你好",
"url": "ftp:\/\/dsdfdf.com",
"description": "",
"add_time": "1650615872",
"up_time": null,
"weight": "0",
"property": "0",
"click": "1",
"topping": "0",
"url_standby": ""
},
{
"id": "28",
"fid": "26",
"title": "你好",
"url": "https:\/\/dsdfdf.com",
"description": "",
"add_time": "1650615867",
"up_time": null,
"weight": "0",
"property": "0",
"click": "0",
"topping": "0",
"url_standby": ""
},
{
"id": "27",
"fid": "26",
"title": "你好",
"url": "http:\/\/dsdfdf.com",
"description": "",
"add_time": "1650615862",
"up_time": null,
"weight": "0",
"property": "0",
"click": "0",
"topping": "0",
"url_standby": ""
},
{
"id": "26",
"fid": "26",
"title": "Epic 限时免费游戏《Amnesia: Rebirth》和 Riverbond(原价 159 元) - 下问",
"url": "https:\/\/xiawen.cc\/d\/69-epic-amnesia-rebirth-riverbond-159-cny",
"description": "",
"add_time": "1650614453",
"up_time": null,
"weight": "0",
"property": "0",
"click": "5",
"topping": "0",
"url_standby": null
},
{
"id": "25",
"fid": "26",
"title": "onenav 增加阿里图标方法 - 下问",
"url": "https:\/\/xiawen.cc\/d\/67-onenav",
"description": "",
"add_time": "1650614424",
"up_time": null,
"weight": "0",
"property": "1",
"click": "0",
"topping": "0",
"url_standby": null
},
{
"id": "24",
"fid": "26",
"title": "变量命名神器",
"url": "https:\/\/unbug.github.io\/codelf\/#%E9%A1%B6%E7%BA%A7",
"description": "",
"add_time": "1650606791",
"up_time": null,
"weight": "0",
"property": "0",
"click": "0",
"topping": "0",
"url_standby": ""
},
{
"id": "23",
"fid": "26",
"title": "普京取消强攻亚速钢铁厂命令_百度搜索",
"url": "https:\/\/www.baidu.com\/s?wd=%E6%99%AE%E4%BA%AC%E5%8F%96%E6%B6%88%E5%BC%BA%E6%94%BB%E4%BA%9A%E9%80%9F%E9%92%A2%E9%93%81%E5%8E%82%E5%91%BD%E4%BB%A4&sa=fyb_n_homepage&rsv_dl=fyb_n_homepage&from=super&cl=3&tn=baidutop10&fr=top1000&rsv_idx=2&hisfilter=1",
"description": "",
"add_time": "1650551553",
"up_time": null,
"weight": "0",
"property": "0",
"click": "0",
"topping": "0",
"url_standby": null
},
{
"id": "13",
"fid": "26",
"title": "测试备用",
"url": "https:\/\/www.xiaoz.ttt",
"description": "",
"add_time": "1646991031",
"up_time": null,
"weight": "0",
"property": "1",
"click": "4",
"topping": "0",
"url_standby": "https:\/\/www.xiaoz.ttt"
},
{
"id": "12",
"fid": "26",
"title": "测试备用链接",
"url": "https:\/\/www.baidu.com\/",
"description": "你好啊",
"add_time": "1646990879",
"up_time": null,
"weight": "0",
"property": "1",
"click": "22",
"topping": "0",
"url_standby": "https:\/\/www.baidu.com\/"
},
{
"id": "10",
"fid": "26",
"title": "查询链接列表 | 藏经阁",
"url": "https:\/\/doc.xiaoz.org\/books\/onenav\/page\/92c8c",
"description": "Js操作Cookie总结(设置,读取,删除),工作中经常会用到的哦!下面是详细代码,如有错误,请留言指正!",
"add_time": "1646388213",
"up_time": null,
"weight": "0",
"property": "1",
"click": "4",
"topping": "0",
"url_standby": null
},
{
"id": "9",
"fid": "26",
"title": "JS设置cookie、读取cookie、删除cookie_javascript技巧_脚本之家",
"url": "https:\/\/www.jb51.net\/article\/64330.htm",
"description": "Js操作Cookie总结(设置,读取,删除),工作中经常会用到的哦!下面是详细代码,如有错误,请留言指正!",
"add_time": "1646388182",
"up_time": null,
"weight": "0",
"property": "0",
"click": "2",
"topping": "0",
"url_standby": null
}
]
},
"msg": "success"
}
删除单个目录分享
接口说明
- 请求地址:http://domain.com/index.php?c=api&method=del_share
- 请求方法:GET
请求参数
参数名称 | 示例值 | 类型 | 是否必须 | 说明 |
---|---|---|---|---|
token | 5c7d0c90cf9e0ce560956179e8e82e7d | string(32) | 是 | 请参考token生成 |
id | 21 | int | 是 | 分享ID |
主题开发
您可以根据此文档开发自己喜欢的OneNav主题。
目录结构
- 优先读取
/templates
目录下的主题 - 如果未读取到
/templates
目录下的主题,则尝试从/data/templates
读取
主题目录命名规范
- 主题目录不能包含特殊字符,比如
-/.*!@#$%^&
等 - 目录名称不能包含空格
创建一个主题
在/templates
下创建一个目录,比如HelloWorld
,里面至少需要存在2个文件,分别是:
-
index.php
- 主题首页文件 -
info.json
- 主题描述等信息
info.json配置信息
info.jsonn内容包含:
{
"name":"Hello World",
"description":"Hello World",
"homepage":"https://www.xiaoz.me",
"version":"1.0.0",
"update":"2022/04/13",
"author":"xiaoz",
"screenshot":"https://img.rss.ink/imgs/2022/03/42ed3ef2c4a50f6d.png"
}
字段含义如下:
- name:主题名称
- description:主题描述
- homepage:作者主页
- version:主题版本
- update:主题更新时间
- author:主题作者
- screenshot:主题截图
内置变量
您在index.php
中可以使用以下变量,注意需要通过PHP开始符和结束符包裹,比如<?php echo $name; ?>
-
$site['title']
:站点标题 -
$site['logo']
:站点logo -
$site['subtitle']
:站点副标题 -
$site['keywords']
:站点关键词 -
$site['description']
:站点描述 -
$site['custom_header']
:自定义header -
$template
:主题文件夹名称,比如HelloWorld
index.php
接下来我们试着在index.php
添加内容,这个文件可以直接使用上面提到的内置变量。试着将上面的变量添加到index.php
,内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title><?php echo $site['title']; ?> - <?php echo $site['subtitle']; ?></title>
<meta name="keywords" content="<?php echo $site['keywords']; ?>" />
<meta name="description" content="<?php echo $site['description']; ?>" />
<style>
header{
width:100%;
}
aside{
width:20%;
float:left;
}
article{
float:80%;
}
footer{
width:100%;
}
</style>
</head>
<body>
<!-- 顶部 -->
<header>
<!-- 网站标题 -->
<h1><?php echo $site['title']; ?></h1>
</header>
<!-- 顶部 -->
<!-- 左侧 -->
<aside>
左侧
</aside>
<!-- 左侧 -->
<!-- 内容 -->
<article>
内容
</article>
<!-- 内容END -->
<!-- 底部 -->
<footer>
这是底部内容
</footer>
<!-- 底部END -->
</body>
</html>
不过当前非常简陋,内容都还没有。我们试着在aside
元素添加遍历输出分类目录的代码,如下:
<?php
//遍历分类目录并显示
foreach ($categorys as $category) {
//var_dump($category);
$font_icon = empty($category['font_icon']) ? '' : "<i class='{$category['font_icon']}'></i> ";
?>
<a href="#category-<?php echo $category['id']; ?>">
<li>
<div><?php echo $font_icon; ?><?php echo htmlspecialchars_decode($category['name']); ?></div>
</li>
</a>
<?php } ?>
-
$category['name']
指的是分类目录名称
这时分类目录已经遍历并显示,内容如下截图:
趁热打铁,我们继续将书签内容也遍历输出,将下面的代码添加到article
元素节点:
<!-- 遍历分类目录 -->
<?php foreach ( $categorys as $category ) {
$fid = $category['id'];
$links = get_links($fid);
$font_icon = empty($category['font_icon']) ? '' : "<i class='{$category['font_icon']}'></i> ";
//如果分类是私有的
if( $category['property'] == 1 ) {
$property = '<i class="fa fa-expeditedssl" style = "color:#5FB878"></i>';
}
else {
$property = '';
}
?>
<div id = "category-<?php echo $category['id']; ?>" class = "mdui-col-xs-12 mdui-typo-title cat-title">
<?php echo $font_icon; ?>
<?php echo htmlspecialchars_decode($category['name']); ?> <?php echo $property; ?>
<span class = "mdui-typo-caption"><?php echo $category['description']; ?></span>
</div>
<!-- 遍历链接 -->
<?php
foreach ($links as $link) {
//默认描述
$link['description'] = empty($link['description']) ? '作者很懒,没有填写描述。' : $link['description'];
//var_dump($link);
?>
<div class="mdui-col-lg-3 mdui-col-md-4 mdui-col-xs-12 link-space" id = "id_<?php echo $link['id']; ?>" link-title = "<?php echo $link['title']; ?>" link-url = "<?php echo $link['url']; ?>">
<!--定义一个卡片-->
<div class="mdui-card link-line mdui-hoverable">
<!-- 如果是私有链接,则显示角标 -->
<?php if($link['property'] == 1 ) { ?>
<div class="angle">
<span> </span>
</div>
<?php } ?>
<!-- 角标END -->
<a href="/index.php?c=click&id=<?php echo $link['id']; ?>" target="_blank" title = "<?php echo $link['description']; ?>">
<div class="mdui-card-primary" style = "padding-top:16px;">
<div class="mdui-card-primary-title link-title">
<img src="https://favicon.rss.ink/v1/<?php echo base64($link['url']); ?>" alt="HUAN" width="16" height="16">
<span class="link_title"><?php echo $link['title']; ?></span>
</div>
</div>
</a>
<!-- 卡片的内容end -->
<div class="mdui-card-content mdui-text-color-black-disabled" style="padding-top:0px;"><span class="link-content"><?php echo $link['description']; ?></span></div>
</div>
<!--卡片END-->
</div>
<?php } ?>
<!-- 遍历链接END -->
<?php } ?>
这时候刷新首页,可以看到书签内容也输出了。不过没有CSS,样式完全是乱的,CSS样式就需要主题开发者根据自己的喜好来写了。
至此一个简单的HelloWorld
主题已经完成,完整代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title><?php echo $site['title']; ?> - <?php echo $site['subtitle']; ?></title>
<meta name="keywords" content="<?php echo $site['keywords']; ?>" />
<meta name="description" content="<?php echo $site['description']; ?>" />
<style>
header{
width:100%;
}
aside{
width:20%;
float:left;
}
article{
float:80%;
}
footer{
width:100%;
}
</style>
</head>
<body>
<!-- 顶部 -->
<header>
<!-- 网站标题 -->
<h1><?php echo $site['title']; ?></h1>
</header>
<!-- 顶部 -->
<!-- 左侧 -->
<aside>
<?php
//遍历分类目录并显示
foreach ($categorys as $category) {
//var_dump($category);
$font_icon = empty($category['font_icon']) ? '' : "<i class='{$category['font_icon']}'></i> ";
?>
<a href="#category-<?php echo $category['id']; ?>">
<li>
<div><?php echo $font_icon; ?><?php echo htmlspecialchars_decode($category['name']); ?></div>
</li>
</a>
<?php } ?>
</aside>
<!-- 左侧 -->
<!-- 内容 -->
<article>
<!-- 遍历分类目录 -->
<?php foreach ( $categorys as $category ) {
$fid = $category['id'];
$links = get_links($fid);
$font_icon = empty($category['font_icon']) ? '' : "<i class='{$category['font_icon']}'></i> ";
//如果分类是私有的
if( $category['property'] == 1 ) {
$property = '<i class="fa fa-expeditedssl" style = "color:#5FB878"></i>';
}
else {
$property = '';
}
?>
<div id = "category-<?php echo $category['id']; ?>" class = "mdui-col-xs-12 mdui-typo-title cat-title">
<?php echo $font_icon; ?>
<?php echo htmlspecialchars_decode($category['name']); ?> <?php echo $property; ?>
<span class = "mdui-typo-caption"><?php echo $category['description']; ?></span>
</div>
<!-- 遍历链接 -->
<?php
foreach ($links as $link) {
//默认描述
$link['description'] = empty($link['description']) ? '作者很懒,没有填写描述。' : $link['description'];
//var_dump($link);
?>
<div class="mdui-col-lg-3 mdui-col-md-4 mdui-col-xs-12 link-space" id = "id_<?php echo $link['id']; ?>" link-title = "<?php echo $link['title']; ?>" link-url = "<?php echo $link['url']; ?>">
<!--定义一个卡片-->
<div class="mdui-card link-line mdui-hoverable">
<!-- 如果是私有链接,则显示角标 -->
<?php if($link['property'] == 1 ) { ?>
<div class="angle">
<span> </span>
</div>
<?php } ?>
<!-- 角标END -->
<a href="/index.php?c=click&id=<?php echo $link['id']; ?>" target="_blank" title = "<?php echo $link['description']; ?>">
<div class="mdui-card-primary" style = "padding-top:16px;">
<div class="mdui-card-primary-title link-title">
<img src="https://favicon.rss.ink/v1/<?php echo base64($link['url']); ?>" alt="HUAN" width="16" height="16">
<span class="link_title"><?php echo $link['title']; ?></span>
</div>
</div>
</a>
<!-- 卡片的内容end -->
<div class="mdui-card-content mdui-text-color-black-disabled" style="padding-top:0px;"><span class="link-content"><?php echo $link['description']; ?></span></div>
</div>
<!--卡片END-->
</div>
<?php } ?>
<!-- 遍历链接END -->
<?php } ?>
</article>
<!-- 内容END -->
<!-- 底部 -->
<footer>
这是底部内容
</footer>
<!-- 底部END -->
</body>
</html>
交流群
QQ群
您可以通过下方任意一种方式加入QQ群:
微信群
社区支持
联系作者
- 作者QQ:446199062(请备注OneNav)
- 作者微信:xiaozme(请备注OneNav)