暗色模式

TeoSeo v1.2.0 发布:AI 自动生成摘要与关键词,SEO 三件套一次配齐

插件发布
2026-08-07
444
12
本文要点
  • v1.2.0 新增 AI 内容优化:发布文章自动生成摘要与关键词,前台输出 description/keywords 与 JSON-LD 结构化数据。
  • 兼容任意 OpenAI 兼容接口(/chat/completions),换平台只改 BaseURL 与模型名,本站用智谱 glm-4-flash-250414
  • AI 生成挂到请求收尾异步执行不卡发布,且不覆盖手动摘要;存量文章可在面板单篇或批量生成(每篇 302 续跑防限流,上限 200 篇)。
  • 升级需覆盖 Plugin.phpClient.phpai.php 三个文件后停用再启用插件,且先清空 options.plugins 再激活,否则钩子重复注册导致 JSON-LD 输出两条。

TeoSeo :从推送工具到 SEO 三件套

TeoSeo 是本站自研的 Typecho 1.3 SEO 插件,一路小步快跑:

  • v1.0Typecho1.3SEO插件TeoSeo:自动 sitemap + 发布即推送):sitemap.xml + IndexNow + 百度推送,发布即推送,一个不落;
  • v1.1:推送历史面板,每条推送成败都能查;
  • v1.2.0(本次):AI 内容优化——发布文章自动生成摘要与关键词,前台输出 meta description / keywords / JSON-LD 结构化数据,存量文章一键批量生成。

也就是说,一篇文章的 SEO 三件套(meta 描述、关键词、结构化数据)现在全自动了。

适配说明:插件的 AI 摘要、前台 meta 输出与编辑页字段联动目前主要针对本站主题(Inaline)适配;其他主题的输出样式可能不同,如遇问题欢迎到 GitHub 反馈。

新功能一:发布即自动生成摘要与关键词

支持任意 OpenAI 兼容接口

插件走的是通用的 /chat/completions 协议,所以 DeepSeek、通义千问、智谱 GLM、Kimi、OpenAI 都行,换平台只改 BaseURL 和模型名,代码不用动。本站实测用 智谱:

BaseURL = https://open.bigmodel.cn/api/paas/v4
模型名  = glm-4-flash-250414

设置页配置项

在「设置 → TeoSeo」里新增了一组 AI 配置:

配置项说明
AI 开关关闭时不调用任何接口
AI 接口 BaseURLOpenAI 兼容接口地址
API Key存在本地数据库,不经过第三方
模型名deepseek-chat / qwen-plus / glm-4-flash 等
摘要长度(字)默认 120,建议 80~200
请求超时(秒)默认 30,长文接口一般要 20~40 秒
SSL 校验默认严格校验;虚拟主机 CA 链残缺导致失败时勾选,自动降级重试一次

两个设计细节

① 生成不卡发布。 AI 接口再快也要几秒到几十秒,如果发布文章要干等,体验就毁了。插件把生成挂到请求收尾阶段(shutdown 阶段)异步执行:发布响应先返回,AI 结果写完字段,下次刷新面板就能看到。生成失败也静默记日志,不影响发布本身。

② 已有摘要不覆盖。 发布钩子只对没有摘要的文章生成,你手动写好的摘要不会被 AI 冲掉;真想要 AI 重写,面板上有「强制覆盖」按钮。

新功能二:存量文章批量生成

后台新增「TeoSeo → AI 内容优化」面板:未生成摘要的文章排前面,显示最近 50 篇,支持单篇生成、强制重新生成、一键批量生成。

批量生成的实现有点"笨"但很稳:每处理一篇就 302 跳转一次续跑。为什么不循环一把梭?Typecho 部署在不同环境(虚拟主机 / VPS / Docker)性能差异很大,加上各家 AI 接口普遍有速率限制,几十篇一起跑很容易超时或被限流;一篇一跳转是最土也最稳的办法,还能顺便看进度。连续失败的同一篇文章不会反复重试(last 守卫防死循环),每次批量上限 200 篇。

批量生成前:文章摘要与关键词均未生成

批量生成后:摘要与关键词自动填充,按钮变为更新生成

新功能三:前台 SEO 输出实测

文章页现在会自动输出三样东西:

meta name="description"   → AI 摘要(没配 AI 时从正文截取)
meta name="keywords"      → AI 生成的关键词
JSON-LD Article           → 标题/发布时间/修改时间/作者/发布者/链接

线上文章页的 SEO 输出实测

截图是直接在线上文章页抓的,JSON-LD 的 headline、datePublished、mainEntityOfPage 都是真实数据,搜索引擎拿到的就是这份。

和 Inaline 主题的协同

Inaline 主题自带 seo_description / seo_keywords 自定义字段支持,会自己输出 meta description。如果插件再输出一遍就变成两条 description——插件在钩子里先检查主题是否已输出,有就让主题的留下,避免重复标签被搜索引擎嫌弃。正文截取摘要时也会先把 markdown 的行首 # 和行内 **、反引号去掉,description 里不会出现一坨符号。

版本细节:上线前修掉的三个坑

v1.2.0 最初版本来自 AI 辅助开发(opencode),检查后修了三处再上线:

  1. JSON-LD 注入风险:AI 生成的摘要是外部接口返回的不可信内容,如果里面混进 </script> 会提前闭合标签变成注入点。补了 JSON_HEX_TAG 转义;
  2. SSL 校验全关:原版为了兼容虚拟主机把 TLS 校验整个关了——API Key 是钱,不能裸奔。改成默认严格校验,勾选开关后才在失败时降级重试;
  3. 发布同步阻塞:原版发布时同步调 AI,改成了 shutdown 异步,见上文。

升级方式

线上已经升级到 v1.2.0(GitHub Astarry-1127/TeoSeoAi 分支,后续合入 main)。其他站点升级:把 Plugin.phpClient.phpai.php 三个文件覆盖到 usr/plugins/TeoSeo/,然后停用再启用一次插件重建钩子(注意:启用前先清空 options.plugins 再激活,重复激活会把钩子注册两遍,我们线上就踩过这个坑,症状是 JSON-LD 输出两条)。

升级后到设置页保存一次配置,让 AI 配置项写入数据库,然后就可以在面板里批量生成了。

参考资料

发表评论

小兵
小兵
2026-08-27 21:40 #1
感谢作者发布新版本,已经正常运行,我现在用的主题是MWordStar:https://www.misterma.com/archives/812/
小兵
小兵
2026-08-27 09:16 #2
现在插件 启用 和 设置 点了都是server error了
小兵
小兵
2026-08-27 09:13 #3
我在邮件里面回复了
小兵
小兵
2026-08-27 08:49 #4
我这里github打不开,可以发我个1.3.1到我邮箱吗:3602300163@qq.com,感谢
Astarry
Astarry
2026-08-27 08:58 4.1
@小兵 已发送,检查邮箱。
小兵
小兵
2026-08-27 08:24 #5
打开typecho个人设置页面的调试后,页面底部显示如下信息:

插件TeoSeo的配置信息没有找到
Typecho\Plugin\Exception: 插件TeoSeo的配置信息没有找到 in /www/sites/xywork.work/index/var/Widget/Options.php:347
Stack trace:
#0 /www/sites/xywork.work/index/var/Widget/Users/Profile.php(165): Widget\Options->personalPlugin('TeoSeo')
#1 /www/sites/xywork.work/index/var/Widget/Users/Profile.php(131): Widget\Users\Profile->personalForm('TeoSeo', '\\TypechoPlugin\\...', '/www/sites/xywo...', 'subscriber')
#2 /www/sites/xywork.work/index/admin/profile.php(50): Widget\Users\Profile->personalFormList()
#3 {main}
Astarry
Astarry
2026-08-27 08:40 5.1
@小兵 更新一下插件版本,1.3.1。 个人设置页面正常了,然后Ai生成,这下会提示真实错误原因了,你看一下具体原因是什么,我好定位修复。
小兵
小兵
2026-08-27 08:22 #6
用的deepseek,url/api/模型名都配的是对的,也可以生成关键词了,但是但是,系统报错了,只要启用插件:typecho的-控制台-个人设置就点不开,报server error,手工一条条的用AI生成数据时可以生成,生成后返回信息报错:请求失败: Unexpected token '<', "
"... is not valid JSON
小兵
小兵
2026-08-26 23:19 #7
现在找到菜单了,运行后报错:请求失败: Unexpected token '<', "
"... is not valid JSON
Astarry
Astarry
2026-08-27 08:15 7.1
@小兵 你用的什么模型呢?我看看是不是这个模型的请求方法不一样。
小兵
小兵
2026-08-26 23:12 #8
我的把BaseURL,API Key,模型名都设置进去了,怎么启用呢, TeoSeo → AI 内容优化这里也没东西出来啊。
astarry
astarry 博主
2026-08-07 12:47 #9
免费模型已经直接集成到源码默认了,直接注册账号填key即可!