HJZ的博客
PAL 插件使用文档
2026-08-04

PAL Auto Links

Typecho 自动友链管理插件,基于原 Links 插件的数据表,提供 API 接口实现友链的远程增删改查。
博客的这篇文章其实就是README.md

  • 作者: hjz713,DeepSeek
  • 网站: https://blog.hjz0713.cn
  • 版本: 1.0.0
  • 兼容: Typecho 1.2.1
  • 依赖: 需先安装并启用 Links 插件(或已存在 typecho_links 数据表)
重要: 插件目录名必须为 PALAutoLinks(不含连字符),否则 Typecho 1.2.1 无法加载。

安装

  1. 将本插件目录重命名为 PALAutoLinks(必须!Typecho 1.2.1 的 namespace 机制不支持目录名含连字符)
  2. PALAutoLinks 文件夹上传至 Typecho 的 /usr/plugins/ 目录
  3. 进入 Typecho 后台 → 控制台 → 插件,找到「PAL Auto Links」并点击 启用
  4. 启用后点击 设置,配置 API 访问令牌
本插件不创建额外数据表,直接使用原 Links 插件的 typecho_links 表。请确保 Links 插件已启用或该表已存在。

配置

在插件设置页面中设置 API 访问令牌,这是调用 API 的唯一凭证。

配置项说明
API Token调用 API 时必须在请求参数中携带,建议使用 16 位以上随机字符串

API 接口地址为:https://你的域名/action/pal-api


API 接口

通用说明

  • 请求方式: GET 或 POST
  • 接口地址: https://你的域名/action/pal-api
  • 认证参数: token(必填,值为你在后台设置的访问令牌)
  • 操作参数: do(指定操作类型)
  • 编码: UTF-8
  • 返回格式: JSON

响应码说明

code含义
0操作成功
1Token 验证失败
2参数错误(缺少必填参数等)
3资源不存在(如链接 ID 找不到)
4数据库错误

1. 查询友链列表 (list)

获取全部友链,可按分类筛选。

请求参数:

参数类型必填说明
dostring固定值 list
tokenstringAPI 访问令牌
sortstring按分类筛选,不传则返回全部

成功响应示例:

{
    "code": 0,
    "msg": "success",
    "data": [
        {
            "lid": "1",
            "name": "示例博客",
            "url": "https://example.com",
            "sort": "friend",
            "image": "",
            "description": "一个示例博客",
            "user": "",
            "order": "1"
        }
    ]
}

2. 添加友链 (add)

请求参数:

参数类型必填说明
dostring固定值 add
tokenstringAPI 访问令牌
namestring链接名称
urlstring链接地址(需含 http(s)://)
sortstring链接分类
imagestring链接图片 URL
descriptionstring链接描述
userstring自定义数据
lidorder 由系统自动生成,无需传入。

成功响应示例:

{
    "code": 0,
    "msg": "success",
    "data": {
        "lid": 1,
        "name": "新博客",
        "url": "https://newblog.com",
        "sort": "friend",
        "image": "",
        "description": "",
        "user": "",
        "order": 1
    }
}

3. 更新友链 (update)

请求参数:

参数类型必填说明
dostring固定值 update
tokenstringAPI 访问令牌
lidint链接 ID
namestring链接名称
urlstring链接地址
sortstring链接分类
imagestring链接图片 URL
descriptionstring链接描述
userstring自定义数据
orderint排序值
只传需要更新的字段即可,未传的字段保持原值不变。

成功响应示例:

{
    "code": 0,
    "msg": "updated",
    "data": {
        "lid": "1",
        "name": "已更新名称",
        "url": "https://updated.com",
        "sort": "friend",
        "image": "",
        "description": "",
        "user": "",
        "order": "1"
    }
}

4. 删除友链 (delete)

请求参数:

参数类型必填说明
dostring固定值 delete
tokenstringAPI 访问令牌
lidint要删除的链接 ID

成功响应示例:

{
    "code": 0,
    "msg": "deleted",
    "data": null
}

调用示例

cURL

# 查询全部友链
curl "https://你的域名/action/pal-api?do=list&token=你的令牌"

# 按分类筛选
curl "https://你的域名/action/pal-api?do=list&token=你的令牌&sort=friend"

# 添加友链
curl -X POST "https://你的域名/action/pal-api" \
  -d "do=add&token=你的令牌&name=我的博客&url=https://myblog.com&sort=friend&description=欢迎来访"

# 更新友链
curl -X POST "https://你的域名/action/pal-api" \
  -d "do=update&token=你的令牌&lid=1&name=新名称"

# 删除友链
curl -X POST "https://你的域名/action/pal-api" \
  -d "do=delete&token=你的令牌&lid=1"

PHP

$apiUrl = 'https://你的域名/action/pal-api';
$token = '你的令牌';

// 查询
$response = file_get_contents("$apiUrl?do=list&token=$token");
$result = json_decode($response, true);

// 添加
$data = http_build_query([
    'do'     => 'add',
    'token'  => $token,
    'name'   => '新博客',
    'url'    => 'https://newblog.com',
    'sort'   => 'friend',
]);
$context = stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => $data,
    ]
]);
$response = file_get_contents($apiUrl, false, $context);
$result = json_decode($response, true);

Python

import requests

api_url = 'https://你的域名/action/pal-api'
token = '你的令牌'

# 查询
resp = requests.get(api_url, params={'do': 'list', 'token': token})
print(resp.json())

# 添加
resp = requests.post(api_url, data={
    'do': 'add', 'token': token,
    'name': '新博客', 'url': 'https://newblog.com', 'sort': 'friend',
})
print(resp.json())

# 更新
resp = requests.post(api_url, data={
    'do': 'update', 'token': token, 'lid': 1, 'name': '新名称',
})
print(resp.json())

# 删除
resp = requests.post(api_url, data={
    'do': 'delete', 'token': token, 'lid': 1,
})
print(resp.json())

数据表结构

本插件使用原 Links 插件的 typecho_links 表(前缀 typecho_ 为默认值,实际以站点配置为准):

字段类型说明
lidINT / INTEGER主键,自增
nameVARCHAR(200)链接名称
urlVARCHAR(200)链接地址
sortVARCHAR(200)链接分类
imageVARCHAR(200)链接图片 URL
descriptionVARCHAR(200)链接描述
userVARCHAR(200)自定义数据
orderINT排序值,数值越小越靠前

常见问题

Q: 调用 API 返回 {"code":1,"msg":"Token verification failed"} 怎么办?

A: 请检查后台插件设置中是否正确配置了访问令牌,以及请求参数中的 token 是否与设置值完全一致。

Q: 提示「Link not found」?

A: 请检查传入的 lid 是否正确。可以使用 list 操作查看所有链接及其 ID。

Q: 是否需要先安装原 Links 插件?

A: 需要有 typecho_links 数据表。可以先安装原 Links 插件让其自动建表,或者手动创建该表。

Q: 为什么插件目录名必须是 PALAutoLinks

A: Typecho 1.2.1 的 Plugin::portal() 方法直接将目录名用于 PHP namespace(如 \Plugin\PALAutoLinks\Plugin),而 PHP namespace 不能包含连字符 -。原始目录名 PAL-PAL-Auto-Links 含连字符会导致类加载失败。

Q: 支持同时操作多条记录吗?

A: 目前每个请求只能操作一条记录。如需批量操作,请多次调用 API。

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 CN协议 许可协议。转载请注明出处!