2026-08-12 21:22:33 +08:00
2026-07-29 19:47:34 +08:00
2026-08-12 21:22:33 +08:00
2026-07-29 19:47:34 +08:00
2026-07-29 19:47:34 +08:00
2026-07-29 19:47:34 +08:00
2026-07-29 19:47:34 +08:00
2026-08-12 21:22:33 +08:00
2026-07-29 19:47:34 +08:00

halo-plugin-publication

用于统计月度发布详情

v1.4.1补丁

  1. 链接拼接字段可在控制台配置
  2. 修改奇遇默认路由为/stories

v1.4.1

  1. 修正朋友圈媒体信息异常
  2. 移除冗余字段
  3. 补充瞬间返回类型

v1.4.0

  1. 新增标签、类别等更多数据返回

v1.3.0

  1. 增加豆瓣、奇遇、类型筛选和缓存

发布日历 API

Halo 2.21 插件,按月聚合以下公开发布记录:

  • 图库:Photo.metadata.creationTimestamp
  • 朋友圈:FriendPost.spec.pubDate
  • 瞬间:Moment.spec.releaseTime,仅返回已审核的公开瞬间
  • 文章:Post.spec.publishTime,仅返回已发布且公开的文章
  • 豆瓣:DoubanMovie.faves.createTime,包含所有类别和状态的豆瓣记录
  • 奇遇:Equipment.metadata.creationTimestamp

图库和奇遇模型没有单独的发布时间,因此使用资源创建时间作为发布日期。图库、 朋友圈、瞬间、豆瓣和装备插件均为可选依赖;未安装或未启用时,API 仍可正常返回 其他数据,并通过 sources 标记可用状态。

API

GET /apis/api.publication-calendar.anian.dev/v1alpha1/publications

查询参数:

  • month:可选,格式 yyyy-MM;默认当前月
  • timezone:可选,IANA 时区;默认 Halo 服务端时区
  • types:可选,按逗号分隔的顶层类别,例如 photos,friends,douban;默认返回全部类别

示例:

curl 'https://example.com/apis/api.publication-calendar.anian.dev/v1alpha1/publications?month=2026-07&timezone=Asia%2FShanghai'

只查询图库和朋友圈:

curl 'https://example.com/apis/api.publication-calendar.anian.dev/v1alpha1/publications?month=2026-07&types=photos,friends'

响应结构示意:

{
  "month": "2026-07",
  "timezone": "Asia/Shanghai",
  "start": "2026-07-01T00:00:00",
  "endExclusive": "2026-08-01T00:00:00",
  "total": 2,
  "counts": {
    "photos": 1,
    "friends": 1,
    "moments": 0,
    "posts": 1,
    "douban": 1,
    "equipments": 1
  },
  "dailyCounts": {
    "photos":  [0, 1, 0],
    "friends": [1, 0, 0],
    "moments": [0, 0, 0],
    "posts":   [0, 0, 1],
    "douban":  [0, 1, 0],
    "equipments": [0, 0, 1]
  },
  "sources": {
    "photos": true,
    "friends": true,
    "moments": true,
    "posts": true,
    "douban": true,
    "equipments": true
  },
  "items": [
    {
      "day": 1,
      "date": "2026-07-01",
      "photos": [],
      "friends": [
        {
          "type": "FRIEND",
          "name": "friend-post-name",
          "date": "2026-07-01T13:20:00",
          "link": "/friends/friend-post-name",
          "author": "作者名称",
          "title": "动态标题",
          "media": [
            {
              "type": "PHOTO",
              "url": "/upload/image-hots/image-1.jpg"
            },
            {
              "type": "PHOTO",
              "url": "/upload/image-hots/image-2.jpg"
            }
          ],
          "categories": [],
          "tags": []
        }
      ],
      "moments": [],
      "posts": [],
      "douban": [],
      "equipments": []
    }
  ]
}

实际的 dailyCounts 和 items 数组长度等于当月天数。items[0] 表示 1 日, 每一天内部按 photos、friends、moments、posts、douban、equipments 分类,分类中的内容按 date 倒序排列,date 为请求 timezone 下的本地日期时间。 课外书链接为 /books/{name}, 奇遇链接为 /stories/{name}。所有 link 和媒体 URL 均返回相对地址。API 已聚合 至 Halo 匿名角色,无需登录即可访问,因此只会输出公开内容。

链接前缀

在 Halo 控制台的插件设置中,可分别配置图库、朋友圈、课外书和奇遇的链接前缀。 填写的前缀优先级最高,接口会在其后拼接资源的 {name};留空则沿用原有路径规则。前缀可 以或不以 / 开头,尾部 / 会自动忽略,返回值始终为相对地址。日记仍优先使用资源自身 的 status.permalink,仅在该字段缺失时使用 /moments/{name}。

每个条目的 categories 和 tags 都是数组:图库和奇遇来自对应分组的中文显示名称, 文章根据 Post.spec.categories 和 Post.spec.tags 中的英文名称,分别查询 Category 和 Tag 资源并返回对应的 spec.displayName 中文名称;豆瓣类别直接取 spec.type, 日记标签使用日记自身的标签文本。奇遇、豆瓣和文章不返回媒体;朋友圈媒体由 imageFiles 按英文逗号拆分生成,图片 URL 为 /upload/image-hots/{图片名称};日记媒体根据 URL 后缀 识别为 PHOTO 或 VIDEO,媒体数量可直接由前端统计。

缓存

在插件设置中配置缓存时间,单位为分钟,默认值为 10。缓存按月份、时区、内容类型和链接 前缀分别保存;设置为 0 时关闭缓存,每次请求都会重新查询数据。修改链接前缀后会自动 使用独立的缓存结果,无需等待旧缓存过期。

构建

./gradlew clean build

构建产物位于 build/libs/plugin-publication-calendar-1.4.0.jar。

S
Description
halo-插件-发布日历
Readme
157 KiB
Languages
Java 100%