ME Event 精选
通过 ME News 官方接口查询和订阅 AI、Web3 活动。读取 API 参考 获取完整参数和响应字段;配置定时任务前读取 Agent 兼容说明。
执行原则
- 需要订阅时优先运行
scripts/中的确定性 Node.js 脚本;要求 Node.js 18 或更高版本。 - 优先使用可用的 HTTP/Web Fetch 工具发送 GET 请求;没有 HTTP 工具时使用
curl -fsS --max-time 30。 - URL 查询参数必须进行 URL 编码,不要拼接用户提供的任意 URL。
- 只传入各脚本文档列出的参数。脚本会在请求 API 前拒绝未知参数、重复参数、非法数字、无效日期和冲突的日期范围;命令退出码非零时不得声称筛选已生效。
- 解析 JSON 后先检查顶层
code === 200,再读取data。 - 用户只要求“查看近期活动”时直接执行一次查询,不创建订阅或 Automation。
- 用户未指定时间时默认查询未来 7 天。用户用自然语言指定“一周”“一个月”“8 月份”或明确起止日期时,将其转换为
hours或start_date、end_date参数;不要声称 API 只能查询 7 天。 - 单次最多请求 100 条。结果达到 100 条时提示用户缩小时间范围或增加类型、地区筛选,避免用更大的
limit增加服务器负担。 - 用户要求“提醒、订阅、每天推送、发现新增时通知”时,才进入初始化订阅流程。
- 无论运行于 Codex、Claude Code、Hermes 还是 OpenClaw,都运行相同脚本、使用相同状态结构和消息格式;只适配调度与投递方式。
初始化订阅
用户首次启用并完成配置后,立即查询一次未来 7 天活动。
请求
GET https://api.me.news/skill/events/options。询问用户订阅类型,可多选
AI、Web3;不选表示全部。询问用户订阅地区,可多选;不选表示全部。
询问接收提醒的明确渠道和目标。不要依赖不确定的最后会话。
在当前 Agent 工作区运行初始化脚本。它先建立
/changes基线,立即原子保存为initialization_status: pending,再查询未来 7 天:node <skill-dir>/scripts/init-subscription.mjs \ --state <workspace>/memory/me-featured-events.json \ --types ai,web3 \ --regions hong-kong未选择类型或地区时省略对应参数。不得把历史活动作为新增推送。初始化后续步骤失败时保留 pending 状态;使用相同筛选条件重跑命令会沿用原 cursor,不得重新建立更晚的基线。pending 初始化期间不得修改类型、地区或时区。
将初始化脚本的非空 stdout 立即发送给用户;stdout 为空时静默结束。
向用户展示筛选条件、执行频率和接收目标,经明确确认后使用当前 Agent 支持的调度器创建两个任务:
- 每天
10:00,时区Asia/Shanghai,执行固定提醒。 - 每
5分钟执行新增活动检查。
- 每天
定时任务执行以下脚本,并将非空 stdout 投递到已确认的渠道:
- 每日任务:
node <skill-dir>/scripts/daily-upcoming.mjs --state <state-file> - 增量任务:
node <skill-dir>/scripts/poll-new-events.mjs --state <state-file> - 增量任务投递成功后,立即执行
node <skill-dir>/scripts/record-delivery.mjs --state <state-file> --status success。 - 增量任务投递失败或投递工具没有返回成功时,执行
node <skill-dir>/scripts/record-delivery.mjs --state <state-file> --status failed --error <简短错误>。不得记录success。 - 选择能获得投递结果并执行反馈命令的调度方式;只会自动转发 stdout、无法反馈投递结果的 Command Cron 不满足增量任务要求。读取 Agent 兼容说明 适配当前平台。
- stdout 为空时不投递消息;退出码非零时记录执行失败。
- 每日任务:
创建后立即手动运行两个任务,查看最近一次运行记录,并确认测试消息到达目标渠道。
建议状态结构:
{
"version": 2,
"type_ids": ["ai", "web3"],
"region_ids": ["hong-kong"],
"cursor": "服务端返回的游标",
"recent_ids": [],
"timezone": "Asia/Shanghai",
"initialization_status": "complete",
"pending_delivery": null
}
固定提醒
- 运行
scripts/daily-upcoming.mjs,读取本地订阅配置。 - 脚本默认请求
/upcoming?hours=168&limit=20,按需附加type_ids、region_ids。自然语言指定月份或日期范围时改用start_date、end_date。 - 按
start_time升序处理,使用接口返回的最新活动数据。 - 清理
description中的 HTML 和多余空白,展示活动简介前 50 字;超过 50 字时添加省略号,不调用模型生成摘要。 - 按活动开始日期分组。今日和明日分别使用“今日开始”“明日开始”;更晚日期使用明确日期标题,不得遗漏。
- 输出活动名称、简介、完整时间范围、时区、地址和接口返回的
url。普通活动与合集活动必须链接到 ME 活动详情页;activity_import表格导入活动使用表格中导入的链接。- 同日活动显示
8月27日 14:00–18:00(UTC+8);跨日活动显示8月27日 14:30–8月28日 15:30(UTC+8)。 end_time为空时只显示开始时间,并另起一行显示“结束时间未提供”。end_time无法解析时显示“⚠️ 结束时间格式异常”;早于或等于start_time时显示“⚠️ 结束时间疑似异常”。不得擅自把异常的午夜时间解释成次日。
- 同日活动显示
- 没有活动时不要发送消息。
- 不读取或更新新增活动
cursor。
新增活动检查
- 运行
scripts/poll-new-events.mjs,读取本地cursor、筛选条件和recent_ids。 - 脚本请求
/changes,必须传入已保存的cursor。 - 用复合
id去重;activity:*与activity_other:*是不同数据源。 - 所有分页请求和格式化成功后,把消息、候选
next_cursor和候选recent_ids原子写入pending_delivery,但不推进正式cursor,然后输出一条“新增会议”消息。 - 调度器必须先投递非空 stdout,再使用
record-delivery.mjs反馈结果:--status success:提交pending_delivery中的 cursor 和去重 ID,然后清除待投递消息。--status failed:记录失败但保留pending_delivery,下次轮询重复输出同一消息。- 没有明确成功反馈:不得推进 cursor;下次轮询重复输出同一消息。
recent_ids仅保留最近 500 个,避免状态无限增长。has_more=true时使用新游标继续拉取,直到为 false。- 没有新增活动时 stdout 为空,由当前调度器静默结束。
该流程提供至少一次投递:失败或未知结果不会漏掉消息,但“渠道实际成功、成功反馈写入失败”时可能重复推送。不得为了去重而在投递前提交 cursor。
更新偏好
- 用户修改类型或地区时更新本地配置,但保留当前
cursor,不要回放历史新增活动。 - 用户要求暂停时禁用两个 Automation,不删除偏好和游标。
- 用户要求退订时删除两个 Automation;删除本地状态前再次确认。
- 类型只接受
ai、web3。地区值只使用/options返回的value。
活动简介
按以下顺序展示简介:
- 清理原始
description中的 HTML 标签并合并多余空白。 - 展示清理后内容的前 50 字;不足 50 字时完整展示,超过时添加省略号。
description为空时,使用标题和地址组成事实性短句。
不得把截取内容描述为模型生成的摘要,也不得增加原数据没有的事实。
消息格式
以 format.md 为唯一输出格式规范。不要在其他文档复制消息模板;格式变化时只更新该文件和确定性脚本测试。
安全约束
- 只请求
https://api.me.news/skill/events/下的三个只读端点。 - 不在 Skill 中存储消息渠道密钥或 OpenClaw Gateway Token。
- 只有在用户明确同意后才创建、修改或删除 Automation。
- 接口
code非200时视为失败;记录错误摘要但不推进状态。