news 2026/10/16 14:56:00

DeFlock内容管理进阶:用Directus扩展+GPT-4o-mini自动提取新闻数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeFlock内容管理进阶:用Directus扩展+GPT-4o-mini自动提取新闻数据

【免费下载链接】deflock

Crowdsourced tool for locating and reporting ALPRs

项目地址:https://gitcode.com/gh_mirrors/de/deflock
点击查看免费下载

DeFlock 是一个开源的群众参与式工具,用于定位和举报 ALPR(自动车牌识别)摄像头。除了地图数据,它还需要持续记录各地社区抵制 ALPR 的胜利新闻——而 DeFlock 的 "Recent Victories" 板块正是从新闻文章里逐条录入城市、时间、结果等字段的。本文带你看看 DeFlock 如何用Directus 扩展 + GPT-4o-mini,把"粘贴新闻链接 → 自动生成结构化数据"变成一次点击的事。

为什么需要"新闻数据自动提取"?

DeFlock 的 City Council 页面有一块 Recent Victories 表格,展示各城市"拒绝/取消 ALPR 合同"的最新进展,字段包括:

字段含义示例
cityState城市+州Denver, CO
monthYear发生时间June 2025
outcome结果类型Contract Canceled
description摘要(含原文跳转链接)The councilcanceled their contract…

新闻稿是这些记录的原始素材——传统做法是运营人员手动阅读文章、逐个字段填写,既慢又容易出错。

这些数据存放在 Directus 内容管理系统中,前端通过 blogService.ts 和 cmsService.ts 等 API 服务读取。DeFlock 用 Directus 管理博客、章节(chapters)、供应商(lprVendors)等内容,而"胜利记录"的录入效率就是本文要解决的问题。

整体架构:一个 Directus Bundle 扩展搞定

核心方案是仓库中的 import-win 扩展,它是一个标准的 Directusbundle,同时打包了两类扩展:

  1. Endpoint(后端接口):/import-win,负责抓取新闻正文并调用 GPT-4o-mini 提取字段
  2. Interface(前端控件):win-importer,一个"粘贴 URL + 点 Import"的界面组件

城市终止 ALPR 合同的场景,正是这个扩展要自动归档的数据类型。

在 package.json 中可以看到,扩展通过directus:extension字段声明了两个入口,依赖只有cheerio(解析 HTML)和openai(调用模型),非常轻量。

后端:GPT-4o-mini 提示词设计是灵魂

后端逻辑在 src/api/index.js,流程分三步:

第一步:抓取并清洗文章正文

接口用fetch抓取 URL(带浏览器 User-Agent,15 秒超时),再用 cheerio 移除script / style / nav / footer / header / aside等噪音标签,只留纯文本(截取前 12000 字符)。

第二步:用系统提示词约束输出

系统提示词 定义了提取任务的"游戏规则":

  • 要求模型只返回合法 JSON(配合response_format: { type: 'json_object' })
  • 明确 6 个字段:year、month、city、state、outcome、description
  • outcome只能是三选一:Contract Canceled/Contract Rejected/Cameras Deactivated,并给出每种的判定定义
  • 特别要求description中用<a>标签包裹关键动词短语并链回原文,例如:
The council <a href="ARTICLE_URL" target="_blank">canceled their contract</a> by a 6-2 vote.

这个细节很关键——前端表格的展开行就是用v-html渲染description,用户可以直接从摘要跳回新闻原文,无需运营人员手动加链接。

第三步:转换成 CMS 字段格式

模型输出再经toCmsPayload()映射为 CMS 实际字段,例如把year/month拼成"June 2025"、把city + state拼成"Denver, CO",直接对应 Directus 集合中的字段名。

接口还做了基本的健壮性处理:未登录返回401、缺参数返回400、服务端未配置OPENAI_API_KEY返回500、抓取失败返回422。

前端:一键 Import 的界面体验

界面组件 用 Vuetify 实现,只有两个元素:

  • 一个 URL 输入框(placeholder="https://example.com/article")
  • 一个带 loading 状态的Import按钮

点击后组件调用api.post('/import-win', { url }),拿到结果后对 4 个字段逐一emit('setFieldValue', ...),自动填充 Directus 数据表对应的输入框。如果请求失败,错误信息(如OPENAI_API_KEY is not configured on the server)会直接显示在按钮下方,运营人员立即可见原因。

这些数据最终服务于"说服城市议会"这一场景——Council 页面同时提供演讲模板、谈资库等工具。

整个界面扩展在 src/interface/index.js 中注册,hideLabel/hideLoader设为 true,让控件在 Directus 编辑页中不占额外空间,只留一行输入框。

数据如何流到 DeFlock 网站

运营人员在 Directus 后台保存记录后,数据会通过 CMS API 被前端消费:

  • CouncilView.vue 中的fetchRecentWins()拉取最新胜利记录,按monthYear倒序渲染到 Recent Victories 表格
  • 展开行用v-html渲染带原文链接的摘要,配合mdi-check-bold图标展示结果

此外,仓库里还有一个配套扩展 purge-cf-cache:它监听 Directus 的items.create / items.update / items.delete动作,自动调用 Cloudflare API 清除对应内容的缓存前缀,保证新录入的新闻数据能实时出现在生产网站上,而不是被 CDN 缓存住。

本地部署:三步跑起来

DeFlock 的 CMS 用 Docker Compose 编排,配置文件见 cms/docker-compose.yml。本地运行只需:

  1. 在cms/目录准备环境变量,关键是SECRET、OPENAI_API_KEY(以及缓存扩展用的CF_API_KEY、CF_ZONE_ID)
  2. 执行docker compose up -d,Directus 11.5.1 会挂载本地./extensions目录到容器内
  3. 由于配置了EXTENSIONS_AUTO_RELOAD: true,import-win 扩展 的代码修改会自动热加载,开发时无需重启容器

💡小贴士:扩展源码在 cms/extensions/import-win/src/,修改提示词或字段映射后,配合EXTENSIONS_AUTO_RELOAD即可立即生效,非常适合快速调优提取效果。

这套方案值得借鉴的 3 个点

  1. 提示词即 Schema:把目标字段、取值枚举、格式要求全部写进系统提示词,模型输出即可直接入库,省去二次清洗
  2. JSON Mode + 前端校验:response_format: json_object保证输出可解析,接口层再逐层 try/catch,错误信息对运营人员友好
  3. CMS 原生扩展 > 独立脚本:用 Directus 的 Endpoint + Interface 机制,让 AI 能力直接长在数据录入界面里,非技术背景的内容维护者也能零学习成本使用

DeFlock 的全国地图界面——内容管理层的每次更新,最终都会服务于这张众包地图背后的数据生态。

常见问题 FAQ

Q:为什么选 GPT-4o-mini 而不是更大的模型?新闻摘要+字段提取属于结构化信息抽取,mini 级别模型完全胜任,且延迟和成本都低得多。对高频录入场景,"够用+快"比"更强"更重要。

Q:如果文章抓取失败怎么办?接口会返回422 Failed to fetch article: ...,常见原因是网站反爬或 URL 失效,换个可访问的报道链接即可。

Q:outcome 三分类不够用,想加新类别怎么办?只需同步修改 SYSTEM_PROMPT 中的枚举定义 和 Directus 集合的字段选项,两处保持一致即可。

通过import-win这个不到百行的 Directus 扩展,DeFlock 把"读新闻—抄字段—加链接"的重复劳动压缩成了一次粘贴,这就是 LLM 与内容管理系统结合的最小可行范式:提示词定规则,CMS 管数据,扩展做桥梁。

【免费下载链接】deflock

Crowdsourced tool for locating and reporting ALPRs

项目地址:https://gitcode.com/gh_mirrors/de/deflock
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 14:53:14

Python入门教程之Python的安装下载配置

前言 对刚开始学 Python 的人来说&#xff0c;第一道坎往往不是语法&#xff0c;而是「怎么把 Python 装到自己的电脑上&#xff0c;并让它能在命令行里跑起来」。这一步会牵扯几个概念&#xff1a;下载哪个版本、安装时勾什么选项、命令行里为什么敲 python 没反应、为什么有时…

作者头像 李华
网站建设 2026/10/16 14:52:25

Kotlin空安全全面解析:从类型系统到工程实践

直接说个我观察到的现象&#xff1a;很多人是从Java切到Kotlin的&#xff0c;刚上手时对?和!!这套符号特别不适应&#xff0c;甚至有人觉得“Kotlin的空安全也就是编译期帮你加几个空判断”。这个理解不能说错&#xff0c;但真的把它用明白、用在项目里不踩坑&#xff0c;你会…

作者头像 李华
网站建设 2026/10/16 14:50:55

并发编程经典同步问题全解析:从信号量到死锁预防

刚带新人调一个并发任务队列的bug&#xff0c;排查到最后&#xff0c;问题出在一个再经典不过的地方&#xff1a;两个线程同时往队列里写数据&#xff0c;因为没有做同步&#xff0c;跑着跑着数据丢了。那一刻我突然意识到&#xff0c;操作系统课上学的那几个“经典同步问题”&…

作者头像 李华
网站建设 2026/10/16 14:48:28

Windows 11防火墙出站规则配置:放行TCP 18789端口实战指南

前几天有人在一个技术交流群里提到&#xff0c;他们一套业务系统突然连不上中心服务器了。我远程一看&#xff0c;软件报错信息指向目标端口18789&#xff0c;排查到最后&#xff0c;问题出在Windows 11防火墙的出站规则上——系统安全策略把默认出站行为改成了阻止&#xff0c…

作者头像 李华
网站建设 2026/10/16 14:48:24

Claude Code 免费方案实测:低成本搭建终端编程智能体工作台

最近不少朋友私信我&#xff0c;说看到一个叫 free-claude-code 的项目&#xff0c;问是不是真的能“白嫖” Claude Code。说实话&#xff0c;我第一次看到这个名字也挺好奇&#xff0c;点进去翻了半天&#xff0c;发现它更像一个“免费使用 Claude Code 的方案合集”&#xff…

作者头像 李华
网站建设 2026/10/16 14:47:47

Nginx+Tomcat动静分离与负载均衡:Java Web集群部署实战

先说结论&#xff1a;这套 Nginx Tomcat 的动静分离 负载均衡方案&#xff0c;是 Java Web 项目从单机走向集群的第一道坎&#xff0c;也是我近几年帮团队做架构升级时最常用到的基础组合。Nginx 处理静态文件的高并发能力和 Tomcat 处理动态业务的稳定性各有分工&#xff0c…

作者头像 李华