Autolink文档
白夜功能列表
获取评论
友链去重
友链黑名单
友链访问速度测试
自定义修改以添加友链的具体内容
自定义添加友链
为友链朋友圈提供json适配
添加了通过api修改自定义友链(无页面)
可以通过前端界面修改配置,黑名单,缓慢友链
配置项说明
config.yml
/config/config.yml
basic_settings:
db:
# 选择你的twikoo数据库类型,目前只支持loacl
- local: enable
url: ./data/db.json.0
- mongodb: disable
url: mongodb://localhost:27017
port: 3000 #项目运行端口
debug: true #是否开启flask debug模式
cors: true #是否开启跨域
password: #api管理密码
JWT_SECRET_KEY: hkxual.14na01hdw.2 #jwt密钥
fentch_time:
fentch_interval: 30 #获取评论的间隔单位是分钟
dangerous_interval: 24 #发送Get请求验证友链状态,间隔是小时,暂时不支持
failed_interval: 6 #发送HEAD请求验证友链是否存活,间隔是小时,暂时不支持
接口说明
/autolink
ip/autolink
此处返还你的友链json,你可以根据这个json去适配你的主题,第一个api不返回详细信息,第二个api当存在正确的Authorization时,会返回详细的友链内容
示例:
fetch("ip/autolink")
.then(response => response.json())
.then(json => {
console.log(json)
}).catch(err => console.log('Request Failed', err));
let token = localStorage.getItem('token')
fetch('ip/autolink',{
method: 'POST',
headers: {'Authorization': token},
})
.then(response => response.json())
.then(json => {
console.log(json)
}).catch(err => console.log('Request Failed', err));
返回示例如下:
{
"partners": [
{
"avatar": "https://bu.dusays.com/2023/10/01/6519291503349.jpg",
"descr": "我自是年少,韶华倾负",
"link": "https:https://byer.top/",
"mail": "1842105028@qq.com",
"name": "星の野",
"siteshot": null,
"state": 2
},
{
"avatar": "https://cdn.jsdelivr.net/gh/taosu0216/picgo/20230821231539.png",
"descr": "Daily Growing",
"link": "https:https://blog.yblue.top",
"mail": "2412211487@qq.com",
"name": "Taosu`Home",
"siteshot": null,
"state": 2
},
{
"avatar": "https://ll.sc.cn/img/avatar.png",
"descr": "爱生活,爱工作,爱折腾。",
"link": "https:https://ll.sc.cn/",
"mail": "i@ll.sc.cn",
"name": "雷雷屋头",
"siteshot": null,
"state": 2
},
{
"avatar": "https://s2.loli.net/2023/10/17/4GK2m3UkXztog9D.jpg",
"descr": "知识匮乏,生活处处是魔法",
"link": "https:https://blog.yesord.top",
"mail": "2691004662@qq.com",
"name": "PIKO",
"siteshot": null,
"state": 2
}
]
}
state = 2 是正常访问的友链(1暂定为优先级最高,默认添加到2)
state = 0 是黑名单的友链
state = -1 是黑名单的友链
/hexo_circle_of_friends
ip/hexo_circle_of_friends
此api是为友链朋友圈做的适配,可以使其正常抓取友链
示例:
fetch("ip/hexo_circle_of_friends")
.then(response => response.json())
.then(json => {
console.log(json)
}).catch(err => console.log('Request Failed', err));
返回示例如下:
{
"friends": [
[
"星の野",
"https://byer.top/",
"https://bu.dusays.com/2023/10/01/6519291503349.jpg"
],
[
"Taosu`Home",
"https://blog.yblue.top",
"https://cdn.jsdelivr.net/gh/taosu0216/picgo/20230821231539.png"
],
[
"雷雷屋头",
"https://ll.sc.cn/",
"https://ll.sc.cn/img/avatar.png"
],
[
"Redish101 Blog",
"https://blog.redish101.top",
"https://blog.redish101.top/favicon.ico"
],
[
"PIKO",
"https://blog.yesord.top",
"https://s2.loli.net/2023/10/17/4GK2m3UkXztog9D.jpg"
],
[
"以太工坊",
"https://www.zair.top/",
"https://www.zair.top/img/logo.png"
]
]
}
友链朋友圈配置看下方链接
/login
ip/login
此api用于登录,如果没有设置密码,则第一次登录密码将设为密码,返回token,自行储存到本地使用,有效期12h或后端重启
示例:
fetch('ip/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({"password":"password"})
})
.then(response => response.json())
.then(json => {
if(json['code']==200){
localStorage.setItem('token', json['access_token']);
}
}).catch(err => console.log('Request Failed', err));
返回示例:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTcwMjMxMzYwMiwianRpIjoiMTA0OTg0ZmEtMDBlZS00ODk4LTg0NDMtNDk0Yzc2MjdlMGM4IiwidHlwZSI6ImFjY2VzcyIsInN1YiI6InRodW5kZXJfbHVvbGluZyIsIm5iZiI6MTcwMjMxMzYwMiwiZXhwIjoxNzAyMzE0NTAyfQ.idyM7o91oLtEylSALNLxvxSSi6mZC0T7WCbEuSvDIPI",
"code": 200
}
/insert_links
ip/insert_links
此api用于修改和提交友链,以及提交黑名单,处于黑名单时,以存在的友链的state为0
示例:
let token = localStorage.getItem('token')
data =
{
"partners":
[{
"avatar": "",
"descr": "",
"link": "",
"mail": "",
"name": "",
"siteshot": "",
"state": 2
}],
"ban": ["github.io"]
// partners和ban一次只能提交一种,返回的是各自对应的值
}
fetch('ip/insert_links', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
'Authorization': token
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(json => {
console.log(json)
}).catch(err => console.log('Request Failed', err));
返回示例:
//partners:
{
"partners": [
{
"avatar": "https://bu.dusays.com/2023/10/01/6519291503349.jpg",
"descr": "\u6211\u81ea\u662f\u5e74\u5c11\uff0c\u97f6\u534e\u503e\u8d1f",
"id": 1,
"link": "https:https://byer.top/",
"mail": "1842105028@qq.com",
"name": "\u661f\u306e\u91ce",
"siteshot": null,
"state": 2
},
{
"avatar": "https://cdn.jsdelivr.net/gh/taosu0216/picgo/20230821231539.png",
"descr": "Daily Growing",
"id": 8,
"link": "https:https://blog.yblue.top",
"mail": "2412211487@qq.com",
"name": "Taosu`Home",
"siteshot": null,
"state": 2
}
]
}
//ban:
{
"ban": [
"github.io"
]
}
/upload
ip/upload
此api用于在博客中给用户自己添加友链的权限,提交的友链的权限为-1,示例代码如下
let obj = {
"partners": [
{
"avatar": "",
"descr": "",
"link": "",
"mail": "",
"name": "",
"siteshot": ""
}
]
};
fetch('ip/upload', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: obj
})
.then(response => response.json())
.then(data => {
console.log(json)
}).catch(err => console.log('Request Failed', err));
返回示例:
{"code": "err", "message": "There is no modified data"}
{"code": "ok", "message": "Data has been modified successfully"}
/update_links
ip/update_links
此api用于修改友链的内容,提交需带上token和mail,其余内容随便
let token = localStorage.getItem('token')
data =
[{
"link": "",
"mail": ""
}]
fetch('ip/update_links', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
'Authorization': token
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(json => {
console.log(json)
}).catch(err => console.log('Request Failed', err));
输出如下:
{"code": "200", "message": "Data has been modified successfully"}
{"code": "error", "message": "Missing 'mail' in data"}
/config
ip/config
此api用于修改本地的配置文件
示例:
let token = localStorage.getItem('token')
data =
{
"fentch_time.fentch_interval":30,
"basic_settings.debug":"false"
}
fetch('ip/config', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
'Authorization': token
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(json => {
console.log(json)
}).catch(err => console.log('Request Failed', err));
返回示例:
{
"basic_settings": {
"JWT_SECRET_KEY": "hkxual.14na01hdw.2",
"cors": true,
"db": [
{
"local": "enable",
"url": "./data/db.json.0"
},
{
"mongodb": "disable",
"url": "mongodb://localhost:27017"
}
],
"debug": "false",
"password": "***************",
"port": 3000
},
"fentch_time": {
"dangerous_interval": 24,
"failed_interval": 6,
"fentch_interval": 30
}
}
ip/config
此api用于修改本地的配置文件
示例:
let token = localStorage.getItem('token')
data =
{
"fentch_time.fentch_interval":30,
"basic_settings.debug":"false"
}
fetch('ip/config', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
'Authorization': token
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(json => {
console.log(json)
}).catch(err => console.log('Request Failed', err));
返回示例:
{
"basic_settings": {
"JWT_SECRET_KEY": "hkxual.14na01hdw.2",
"cors": true,
"db": [
{
"local": "enable",
"url": "./data/db.json.0"
},
{
"mongodb": "disable",
"url": "mongodb://localhost:27017"
}
],
"debug": "false",
"password": "***************",
"port": 3000
},
"fentch_time": {
"dangerous_interval": 24,
"failed_interval": 6,
"fentch_interval": 30
}
}
前端适配
目前以适配anzhiyu-butterfly
可以查看我这篇文章部署前端(此前端只支持老版本,自行去release下载)
可以尝试自己手动适配
项目部署
安装Python
我使用的Python版本是3.8.8
,run.py
中使用的python语法是python3
,如果你不想重新安装一个python版本你可以自己调整一下代码
安装依赖
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel yum vim gcc
安装python
wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tgz
tar -zxf Python-3.8.8.tgz && cd Python-3.8.8
./configure --prefix=/usr/local/python3
make && make install
建立软连接
ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip3
验证自己的python是否安装成功
python3 --version
安装git
yum install -y git
获取评论
获取评论有两种方式,一种适合twikoo和本项目不在一台服务器上,另一种适合部署在一起的情况twikoo
的部署可以看我的这篇文章:
本地获取评论
确保你可以在你的服务器上访问到你的评论,假如你是跟着我部署twikoo
的,那你可以直接跳到下一步了
这个就是你的评论数据
通过远程链接获取评论
选择db.json.0
,在更多里选择外链共享
,选择永久
,点击生成外链,复制这个链接
打开twikoo
网站设置,选择重定向
,重定向类型选择路径
,路径里输入/autolink
,目标url就是你刚刚复制的链接
点击提交
部署AutoLink
clone项目
clone
项目仓库,地址:https://github.com/Karunari-luoling/autolink
git clone https://github.com/Karunari-luoling/autolink
修改配置
编辑/autolink/config.json
{
"url": "/root/twikoo/data/db.json.0",
"port": 3000,
"fentch_interval": 30,
"dangerous_interval": 24,
"failed_interval":6
}
在url中输入你的twikoo
评论获取方式,如:https://twikoo.byer.top/autolink
或者 /root/twikoo/data/db.json.0
port 是你本地的端口
fentch_interval的值是指多少分钟重新获取一次评论,单位是分钟,建议这个时间不要太短,30分钟以上一次最好
dangerous_interval是发送get请求判断友链访问速度,单位是小时,不建议太短时间,容易给别的网站封禁
failed_interval是发送HEAD请求判断友链存活,单位是小时,资源占用率小,不会给别人造成困扰
安装依赖
pip3 install -r requirements.txt
运行AutoLink
python3 run.py
输入完这个之后我们可以查看进程,一个是处理评论的程序,一个是用来提供访问的api
尝试访问API:
curl 127.0.0.1:3000/autolink
出现数据即为部署成功。
添加站点
选择网站,添加站点,然后输入我们要设置的域名,选择纯静态,点击提交。
设置反代
点击我们刚才创建的网站,点击反向代理,添加反向代理,添加代理名称,在目标url中输入http://127.0.0.1:3080
,点击提交。
申请SSL证书
我们可以在腾讯云的SSL证书控制台申请免费的SSL证书。
登录完成后,点击我的证书,申请免费证书
申请完毕之后,按照提示给你的域名添加相应的解析,以便完成验证。
证书签发完成后,选择下载,选择Nginx,解压后打开.pem
文件和.key
文件。
部署你的SSL证书
选择网站,点击你的站点,在SSL中将你的密钥和证书输入到里面,选择保存,强制HTTPS即可
懒得截图了,整个以前的图片
访问https地址来查看是否运行正常。