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请求验证友链是否存活,间隔是小时,暂时不支持

接口说明

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
}

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"}

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的,那你可以直接跳到下一步了
1.png
这个就是你的评论数据

通过远程链接获取评论

这简直就是脱裤子放屁,不写了

2.png
选择db.json.0,在更多里选择外链共享,选择永久,点击生成外链,复制这个链接
打开twikoo网站设置,选择重定向,重定向类型选择路径,路径里输入/autolink,目标url就是你刚刚复制的链接
3.png
点击提交

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
python3 run.py

输入完这个之后我们可以查看进程,一个是处理评论的程序,一个是用来提供访问的api
4.png
尝试访问API:

curl 127.0.0.1:3000/autolink

出现数据即为部署成功。

添加站点

选择网站添加站点,然后输入我们要设置的域名,选择纯静态,点击提交。
5.png

设置反代

点击我们刚才创建的网站,点击反向代理添加反向代理,添加代理名称,在目标url中输入http://127.0.0.1:3080,点击提交。
6.png

申请SSL证书

我们可以在腾讯云的SSL证书控制台申请免费的SSL证书。
登录完成后,点击我的证书申请免费证书
申请完毕之后,按照提示给你的域名添加相应的解析,以便完成验证。
证书签发完成后,选择下载,选择Nginx,解压后打开.pem文件和.key文件。

部署你的SSL证书

选择网站,点击你的站点,在SSL中将你的密钥和证书输入到里面,选择保存,强制HTTPS即可
懒得截图了,整个以前的图片
部署ssl证书
访问https地址来查看是否运行正常。