LHL's Blog - 文档
type: channel
link: https://blog.lhl.one/category/docs/
items: 使用脚本一键修复图片EXIF日期信息
items: 基于 PHP 的 Github 镜像加速项目（包含后台管理）
items: AB Store Web API
items: Paid - Typecho 文章付费与订阅插件
items: V2Board API 完整API文档 （包括管理端）
items: Typecho Meta - SEO 优化插件
items: Typecho 个人主页插件 - TypechoBio
items: Typecho 最好用的编辑器 - AB Vditor
items: Typecho 头像源与自定义管理插件 - AB Avatar
items: Typecho OAuth 第三方登录插件 - AB OAuth

使用脚本一键修复图片EXIF日期信息
type: item
date: 2026-08-24T12:23:00+08:00
description: 在整理旧照片的时候，从一刻相册下载下来的照片时间信息不对，发现原照片没有EXIF日期信息，导致即便下载原始文件，也不会保留文件原始创建日期问题分析一刻相册中的图片，右侧显示时间为 2020年05月25日，实际下载时间却丢失而变为 当前下载时间网盘图片实际下载图片可以发现这类文件的文件名 IMG20200525123827.jpg是明显包含时间戳的：2020-05-25 12:38，那就可以用脚本解决。问题是微信导出的 mmexport 开头的图片并没有肉眼可见的日期而是 13 位 Unix 毫秒时间戳脚本说明逻辑说明优先级：文件名中明确的日期/时间格式>文件名中 13 位 Unix 毫秒时间戳>文件名末尾的导出时间戳情况处理逻辑exif有时间,文件名无时间移入保留 文件夹，不做修改文件名有时间修改EXIF 信息后移入 修改 文件夹都无时间直接移入无时间 文件夹文件名支持类型首先明确目前已经支持的一些文件名格式示例解析结果Screenshot_YYYY-MM-DD-HH-MM-SSScreenshot_2019-04-04-16-07-36-53.jpg2019-04-04 16:07:36IMG_YYYYMMDD_HHMMSSIMG_20180526_115312_1579248363749_80.jpg2018-05-26 11:53:12任意位置连续 14 位YYYYMMDDHHMMSSIMG20180807145631.jpg、faceu_0_20190218141843.jpg2019-02-18 14:18:43mmexport<13位>mmexport1533697685086.jpg2018-08-08 11:08:05wx_camera_<13位>wx_camera_1532072568536.jpg2018-07-20 15:42:48microMsg.<13位>microMsg.1530196473712.jpg2018-06-28 22:34:33hdImg_...<13位>hdImg_...1552658489533.jpg2019-03-15 22:01:29qq_pic_merged_<13位>qq_pic_merged_1556725293245.jpg2019-05-01 23:41:33scan_filter_<13位>scan_filter_1552792846706.jpg2019-03-17 11:20:46mmqrcode<13位>mmqrcode1553238340684.png2019-03-22 15:05:40注意：文件名末尾的 _<13位>_<索引>（如 _1579248363749_80）是图片从 App 导出/备份的时间（约 2020-01-17），不是真实拍摄时间。只有当文件名中没有其它可识别时间时，才会用它兜底。支持的扩展名jpg、jpeg、png、heic、webp、gif注意：.gif 按会直接删除，大部分为表情包，不需要可以修改源码。使用说明环境安装确保Python版本>3.10安装依赖python -m pip install pillow piexif脚本使用新建文件夹，所有图片至于文件夹内的顶层目录。2.复制python脚本文件进入后，使用python *.py运行。先跑 --dry-run 预览，确认分类符合预期后再正式执行。执行会把图片移动（shutil.move）到 保留/修改/无时间 文件夹，原文件夹将不再保留这些图片。process_images.py 保留在目录中，可随时重新运行以处理新放入的图片。脚本下载此处内容需要评论回复后方可阅读

基于 PHP 的 Github 镜像加速项目（包含后台管理）
type: item
date: 2026-08-19T20:48:28+08:00
description: Ghproxy PHPPHP GitHub 镜像代理 · 单文件部署 · 自带 MySQL 统计后台在 GitHub 文件链接前添加镜像地址即可加速下载，302 由服务端自动跟随，流式转发大文件。前台界面后台管理界面包含请求统计、仓库封禁（按仓库封禁）、短链接管理、站点信息自定义。示例站： https://gh1.lhl.one示例站网络环境： Cloudflare + 美国Cogent ( 到 Github 10ms )

AB Store Web API
type: item
date: 2026-08-16T23:33:00+08:00
description: 关于 AB Store Web原本 AB Store 是通过同步 Github Repo 中的 Plugin.php 来实现获取最新的插件。但是作为维护总是修改json文件有点麻烦，于是搭建了一个专门用于管理插件仓库的网站： AB Store Web，AB Store Web 开放 API，方便开发者集成。AB Store Web API> Base URL：`https://ab-store.lhl.one` > 所有接口返回 JSON：`{ ok: boolean, ... }`。鉴权方式：HttpOnly Cookie 会话（`abs_session`）或分享口令（`?token=`）。 > 人机验证：部分接口需在请求体携带 `turnstile`（前端 widget token，字段名对应 `cf-turnstile-response`）。状态码约定HTTP含义200成功400参数错误401未登录403无权访问 / 人机验证失败404资源不存在409冲突（如同目录重复提交）429频率超限插件状态枚举status含义pending审核中（新提交 / 更新审核）approved已通过（上架）rejected已拒绝archived已下架私密插件（isPrivate: true）不进入公共列表，详情页仅上传者/持完整链接访问 (插件ID+Token)。获取插件列表GET /api/plugins无需鉴权。返回所有已通过且非私密的插件。响应{ "ok": true, "plugins": [ { "id": "a1b2c3d4", "name": "AdminBeautify", "dir": "AdminBeautifyStore", "author": "LHL", "version": "1.0.21", "github": "https://github.com/...", "homepage": "https://...", "tags": ["editor", "md3"], "desc": "简介", "minVer": "1.2.0", "maxVer": "1.2.1", "uploader": "lhl", "downloads": 128, "createdAt": 1755300000000 } ] }获取单个插件详情GET /api/plugin/<id> GET /api/plugin/<id>?token=<shareToken> # 待审核 / 私密插件approved 且非私密：公开访问pending / 私密 / 其他状态：需正确 token 或登录（上传者/管理员）下载插件GET /api/download/<id> GET /api/download/<id>?token=<shareToken>302 重定向到最终下载地址，下载计数 +1。鉴权同详情接口。注意限流登录：30 次/IP/小时分享 / 注册 / 重置：20 次/IP/小时验证码：同邮箱 1 分钟 1 次

Paid - Typecho 文章付费与订阅插件
type: item
date: 2026-07-21T17:33:00+08:00
description: 插件信息 AB Store Web 插件主页：Paid for Typecho Paid for Typecho什么是Paid?一个文章付费与订阅插件，支持单篇付费和订阅计划，内置多种支付通道和可定制主题，通过自定义字段灵活控制付费属性。文章/页面自定义字段字段说明示例paid_enable是否启用付费阅读，1 开启，0 关闭1paid_price文章价格9.90paid_methods可用支付驱动，英文逗号分隔；留空使用全部已配置渠道alipay_face,wechat,epaypaid_theme主题 ID（对应themes 下文件夹名）；留空使用插件默认主题defaultpaid_desc购买提示文案；留空使用插件默认提示文案购买后可永久查看全文。paid_plan订阅计划标识（plan_key），留空则为单篇付费monthlypaid_theme_options主题高级设置，格式字段:值，一行一个accent:#00d1ff亦可直接在“文章定价与计划”面板中设置支付通道在插件设置的“支付通道定义”中，每行一个通道，格式固定为：支付通道名称|支付驱动:配置1:配置2:配置3...支付通道名称：前台展示名，例如“支付宝扫码”。支付驱动：如 alipay_face、wechat、epay。配置项用英文冒号分隔；值里有冒号时写成 \:，例如 https\://pay.example.com。同一个驱动只保留一条配置。内置驱动配置支付宝当面付|alipay_face:https\://gateway.example.com/pay:你的AppId:通知验签Key 微信支付|wechat:https\://gateway.example.com/pay:你的商户号:通知验签Key # 易支付最后一个为支付通道，支持alipay, wxpay, qqpay等 易支付|epay:https\://pay.example.com:商户PID:商户Key:alipay支持的驱动会实时更新短代码支持（文章部分付费）本功能仅在文章已经开启付费的情况下生效，即 paid_enable为 1可用 [Paid]与 [Paid /]将需要付费的片段进行部分付费，如下图所示：这里的示例使用配置为：前面的内容 [Paid] 11111 [Paid /] [Paid] 22222 [Paid /] 后面的内容主题与设置所有主题均支持通过 主题高级设置（全局） 或文章自定义字段 paid_theme_options 自定义 CSS 变量，格式为一行一个 字段:值。通用规则字段名以 -- 开头时直接作为 CSS 变量名使用。字段名不以 -- 开头时，自动加前缀 --tp-。例如 primary:#000 → --tp-primary:#000。全局设置与文章级 paid_theme_options 冲突时，文章级优先。值中的 ; { } 会被自动过滤。1. default9 个变量，支持亮色 / 暗色双模式。字段名（简写）CSS 变量亮色默认值说明primary--tp-primary#2376e5主色（按钮、链接、选中态）bg--tp-bg#ffffff卡片背景色fg--tp-fg#152238正文文字色muted--tp-muted#6b7890次要/描述文字色border--tp-border#dbe4f1边框色input-bg--tp-input-bg#fbfcff输入框背景色chip-bg--tp-chip-bg#f4f7fc支付方式选项卡背景shadow--tp-shadowrgba(30, 55, 95, 0.12)卡片阴影颜色（透明度由插件控制）radius--tp-radius18px卡片/按钮/输入框圆角2. default213 个变量，支持亮色 / 暗色双模式。字段名（简写）CSS 变量亮色默认值说明primary--tp-primary#1abc9c主色bg--tp-bg#fff卡片背景色fg--tp-fg#333正文文字色muted--tp-muted#777次要/描述文字色border--tp-border#ececec边框色input-bg--tp-input-bg#fff输入框背景色chip-bg--tp-chip-bg#fafafa支付方式选项卡背景shadow--tp-shadowrgba(0,0,0,.06)卡片阴影颜色radius--tp-radius0.3125rem通用圆角chip-hover--tp-chip-hover#f0f0f0选项卡悬停背景radius-btn--tp-radius-btn100rem按钮圆角（胶囊形）font--tp-font'Open Sans', Helvetica, 'Micros…

V2Board API 完整API文档 （包括管理端）
type: item
date: 2026-07-09T19:05:00+08:00
description: 本文章仅针对开源项目的分析。由于网上V2board的API文档实在是太少了，而且基本上没有提到有管理端的，所以我特地整理了这个文档。1. 文档说明提取范围：v2board-master 源码中的路由、控制器、请求校验（FormRequest）路由前缀：/api/v1后台前缀：/api/v1/{secure_path}{secure_path} 来自 config('v2board.secure_path', config('v2board.frontend_admin_path', hash('crc32b', config('app.key'))))统一 API 中间件：ForceJson（强制 JSON）+ Language（可用 content-language 请求头切换语言）2. 鉴权与返回约定2.1 鉴权方式用户端鉴权（middleware: user）读取 auth_data（body/query）或 Authorization 请求头通过 AuthService::decryptAuthData() 解 JWT管理端鉴权（middleware: admin）同用户端，但要求 is_admin = 1客户端订阅鉴权（middleware: client）必须传 token（query/body），并在 v2_user.token 命中员工端鉴权（middleware: staff）同用户端，但要求 is_staff = 12.2 通用成功返回大多数接口：{ "data": "..." }部分接口会额外返回：分页：{ data: [...], total: 123 }支付下单：{ type: number, data: any }2.3 通用失败返回源码大量使用 abort(status, message)。常见：认证失败：403参数/业务失败：500不存在或关闭功能：404生产环境常见响应体示例：{ "message": "未登录或登陆已过期" }或{ "message": "Order does not exist" }3. 用户端 API下述“用户端”包含：访客/登录注册（guest + passport）登录后用户能力（user）订阅客户端输出（client）3.1 访客与登录注册（Guest/Passport）3.1.1 GET /api/v1/guest/comm/config鉴权：无控制器：App\Http\Controllers\Guest\CommController@config请求参数：无返回字段（data）：tos_urlis_email_verifyis_invite_forceemail_whitelist_suffixis_recaptcharecaptcha_site_keyapp_descriptionapp_urllogo成功示例：{ "data": { "tos_url": "https://example.com/tos", "is_email_verify": 1, "is_invite_force": 0, "email_whitelist_suffix": ["gmail.com", "qq.com"], "is_recaptcha": 0, "recaptcha_site_key": null, "app_description": "V2Board is best", "app_url": "https://panel.example.com", "logo": "https://panel.example.com/logo.png" } }失败示例：通常无业务失败，配置异常时返回 500 + message3.1.2 GET /api/v1/guest/plan/fetch鉴权：无控制器：Guest\PlanController@fetch请求参数：无返回字段：data 为可展示套餐数组成功示例：{ "data": [ { "id": 1, "name": "Pro", "group_id": 1, "month_price": 1999, "show": 1 } ] }失败示例：500 + message3.1.3 POST /api/v1/passport/auth/register鉴权：无控制器：Passport\AuthController@register请求参数（body）：email required|email:strictpassword required|min:8invite_code nullable（开启强制邀请时必填）email_code nullable（开启邮箱验证码时必填）recaptcha_data nullable（开启 re…

Typecho Meta - SEO 优化插件
type: item
date: 2026-07-09T17:37:00+08:00
description: 插件信息 Typecho 文章 SEO 元信息增强插件 · 支持 AI 自动生成 Description / KeywordsAB Store Web 插件主页: TypechoMeta 支持一键生成 Desc 和 关键词支持自定义AI提示词与AI配置支持博客根目录

Typecho 个人主页插件 - TypechoBio
type: item
date: 2026-05-26T17:00:00+08:00
description: TypechoBio 个人主页插件 插件信息 支持指定域名，复用Typecho的评论系统，并指定评论文章ID。AB Store Web 插件主页: TypechoBio 安装方式方式一：AB-Store 一键安装（推荐）安装 AdminBeautify 插件后，进入后台 AB-Store 应用商店，搜索 TypechoBio 即可一键安装并获取后续更新。您也可到 TypechoBio - AB Store Web 上获取口令安装。方式二：手动安装下载最新 Release 压缩包 / 从 AB Store Web 上下载解压为 TypechoBio 文件夹上传至 Typecho 的 usr/plugins/ 目录登录后台 → 控制台 → 插件管理 → 启用 TypechoBio方式三：Git 克隆cd /path/to/typecho/usr/plugins/ git clone https://github.com/lhl77/TypechoBio.git TypechoBio可安装主题ImsyyDuckfolioZyyoDmegoWexuoIAMITypechoBio 主题适配文档本文面向 TypechoBio 主题开发者，目标是把“一个现成前端页面或主题源码”稳定适配到 TypechoBio。文档内容基于当前插件实现整理，和实际代码行为对齐，适用于以下场景：新增一个本地主题到 usr/plugins/TypechoBio/templates/<theme>/将外部 HTML、静态站点、Vite 构建产物、主题源码迁移到 TypechoBio为主题接入插件统一的配置系统、评论区、独立域名运行时上下文为主题打包成远程主题市场可安装的 zip 包1. 运行模型TypechoBio 不是 Typecho 前台主题，而是“独立域名命中后接管输出”的插件入口。当前请求命中插件后，执行链路大致如下：插件根据 bio_hosts 判断当前 Host 是否需要被 TypechoBio 接管。若命中，则先处理主题专属 API，再处理主题静态资源请求。非资源请求会进入 usr/plugins/TypechoBio/templates/index.php。templates/index.php 读取当前启用主题、主题配置、用户状态、评论数据等上下文。最终 require usr/plugins/TypechoBio/templates/<theme>/home.php 输出完整页面。这意味着：home.php 需要自己输出完整 HTML 页面，不要假设 Typecho 默认前台模板会包裹你。主题运行时可直接访问数据库、登录态、插件配置，但应优先使用插件已整理好的 $typechoBioContext。资源、评论、配置都应按 TypechoBio 的约定来接，而不是直接照搬原主题的 CMS 假设。2. 主题最小目录结构一个主题至少要满足下面的目录结构，才能被 TypechoBio 识别：usr/plugins/TypechoBio/ └── templates/ └── my-theme/ ├── home.php ├── theme.json ├── assets/ │ ├── app.css │ └── app.js ├── images/ └── ...识别规则很严格：templates/ /home.php 必须存在templates/ /theme.json 必须存在两者缺一不可，否则 discoverThemes() 不会把这个目录识别为可用主题建议：主题目录名只使用字母、数字、下划线、连字符目录名与 theme.json 中的主题标识保持一致把当前主题的静态资源全部放在本主题目录下，不要散落到插件根目录3. home.php 的职责home.php 是主题真正的入口文件，建议把它当成“页面壳层模板”。它至少应负责：输出完整 HTML 文档结构读取 $typechoBioContext根据 themeConfig 渲染页面内容正确引用当前主题静态资源按需接入评论区、代理接口、额外共享片段一个最小可运行的例子如下：<?php if (!defined('__TYPECHO_ROOT_DIR__')) { exit; } $ctx = isset($typechoBioContext) && is_array($typechoBioContext) ? $typechoBioContext : array(); $themeConfig = isset($ctx['themeConfig']) && is_array($ctx['themeConfig']) ? $ctx['themeConfig'] : array(); $siteTit…

Typecho 最好用的编辑器 - AB Vditor
type: item
date: 2026-05-16T00:30:00+08:00
description: 本编辑器 AB Vditor 基于插件AdminBeautify，Vditor基于原版3.11.2版本支持 所见即所得、实时预览、分屏编辑 这三个Vditor的模式，并可快速切换支持 短代码 显示，如图为 Mirages 主题自带的一些工具照顾到兼容性，故使用 单独的复制界面，从而避免某些情况下兼容性的问题支持 全屏编辑，让您更加专注于创作～Github 地址: AB Admin您也可以访问 AB-Admin - AB Store Web 以获取和下载插件。如何使用？先安装 AB Admin: https://blog.lhl.one/artical/977.html#%E5%AE%89%E8%A3%85%E6%96%B9%E6%B3%95在控制台-插件-AB-Admin中的编辑器设置启用AB Vditor即可。如图。

Typecho 头像源与自定义管理插件 - AB Avatar
type: item
date: 2026-05-08T18:16:00+08:00
description: AB Avatar 插件信息 Admin Beautify 专用头像管理插件，支持更换Gravatar源(本地代理)，支持自定义头像您也可以访问 AB Avatar - AB Store Web 以获取和下载插件。 功能特色功能说明Gravatar 多源切换支持官方 / loli / Cravatar / 自定义域名 / 本地代理代理地址编码本地代理使用 token 编码参数，避免暴露明文 Gravatar 格式本地头像专属路由本地存储头像通过签名 token 路由访问，不直接暴露文件路径自定义头像上传个人设置页与用户编辑页支持上传、裁剪、压缩、恢复PicUp 集成可选 PicUp 存储后端，支持上传策略（Profile）选择管理面板插件设置页内置“自定义头像管理”，支持恢复为 Gravatar安全防护支持代理防盗链、每 IP 限流、代理缓存天数配置截图编辑头像可上传自定义头像上传自行裁剪安装方式一：AB-Store 一键安装（推荐）安装 AdminBeautify 插件后，进入后台 AB-Store 应用商店，搜索 AB Avatar 即可一键安装并获取后续更新。您也可以访问 AB Avatar - AB Store Web 获取口令安装。方式二：下载压缩包前往 GitHub 仓库 / AB Store Web 下载源码或发布包解压后将目录重命名为 AdminBeautifyAvatar上传到 Typecho 的 usr/plugins/ 目录在后台进入 控制台 -> 插件，启用 AdminBeautifyAvatar方式三：Git 克隆cd /your-site/usr/plugins/ git clone https://github.com/lhl77/Typecho-Plugin-AdminBeautifyAvatar.git AdminBeautifyAvatar目录示例：your-site/ └── usr/ └── plugins/ └── AdminBeautifyAvatar/依赖说明必需：AdminBeautify可选：PicUp（作为头像存储后端）当 AdminBeautify 未启用时，插件设置页仅显示依赖提示，不显示其它配置项。主要配置项前台 Gravatar 源：官方 / loli / Cravatar / 自定义 / 本地代理本地代理上游源、缓存天数、限流、防盗链允许用户上传自定义头像自定义头像大小限制（MB）头像存储后端：本地 / PicUpPicUp 上传策略（Profile）前台自动替换 Gravatar 地址路由说明路由作用/ab-avatar/gravatar/{token}头像代理路由（token 编码参数）/ab-avatar/local/{token}本地头像专属访问路由（签名 token）/ab-avatar/upload当前登录用户上传自定义头像/ab-avatar/restore当前登录用户恢复为 Gravatar/ab-avatar/manage管理员恢复指定用户头像 / 代上传使用建议先启用 AdminBeautify，再启用本插件默认推荐“前台 Gravatar 源 = 本地代理”若站点开启 CDN / 缓存，建议保持 proxy_hotlink_protection 与 proxy_rate_limit_per_min 为开启状态若使用 PicUp，请先确认 PicUp 插件已正确配置并可正常上传常见问题1) 访问代理头像返回 invalid token说明当前链接不是插件生成的编码代理地址，或 token 已损坏。请确保头像 URL 来自插件自动生成逻辑。2) 用户头像上传失败请检查：PHP gd 扩展是否可用上传文件格式是否为 JPG/PNG/GIF/WEBP上传文件大小是否超过插件设置阈值3) 设置页更新后样式或脚本不生效插件静态资源带版本参数（基于文件修改时间），如仍未更新，建议清理站点缓存和 OPcache。

Typecho OAuth 第三方登录插件 - AB OAuth
type: item
date: 2026-05-08T00:42:00+08:00
description: 这可能是史上颜值最高的 Typecho OAuth 第三方登录插件目录AB OAuthAdminBeautify 专用 OAuth 登录插件，支持QQ / 微信 / GitHub / Google / MSN / 新浪 / 豆瓣 / 百度 / OIDC等。精简显示完整显示OAuth 配置说明Github进入Github Developer Settings，左侧选择OAuth App，然后点击New OAuth App接着复制你的回调地址然后按照图片填入相关信息接着点击 generate client secret生成密钥将ClientID和生成的Client Secret分别填入AB-OAuth插件后台中即可Google进入Google API 控制台，点击进入OAuth 权限请求界面进入客户端，然后创建客户端填入相关客户端信息，选择Web 应用，并粘贴你的回调地址添加完成后弹出窗口将客户端ID和生成的客户端密钥分别填入AB-OAuth插件后台中即可Microsoft (MSN)进入Azure管理页面，点击进入Entry ID管理页面然后根据使用情况进行配置，粘贴您的回调地址，得到客户端ID进入证书与密码，添加新的客户端密码，其值为您的客户端密码检查API权限，是否有User.Read其他的正在编辑中