一、前言
在大学生活中,各类学科竞赛、创新创业大赛是提升能力、丰富履历的重要途径。从含金量极高的“挑战杯”、“互联网+”,到各类专业领域的建模赛、程序设计赛、外语演讲赛,竞赛信息如同雨后春笋般涌现。然而,竞赛信息分散在官网、公众号、群聊等多个渠道,容易错过报名截止时间。本篇文章将介绍如何基于OpenClaw打造一个竞赛情报自动监听与报名系统, 实现竞赛信息的自动识别、智能过滤、及时提醒,让大学生不再错过任何重要比赛。
二、核心痛点
1.信息的“碎片化”与“孤岛化”
竞赛通知散落在学校官网的角落、导师的微信群、学长的转发、以及层出不穷的公众号推文中。这些信息没有统一的入口,往往当我们看到某个极具吸引力的竞赛时,报名链接可能早已失效,或者已经在聊天记录中被海量的“收到”淹没。
2.文本内容的“高熵化”与“低效率”
一份正规的竞赛通知往往伴随着长达十几甚至几十页的PDF、word文件,或者长达数千字的纯文字公告。学生需要从这些“高熵”内容中艰难地抠出报名时间、参赛资格、作品要求等核心要素。这种机械的提取工作极大地消耗了宝贵的科研精力,甚至让人因为“文档太长”而产生畏难情绪。
三、方案设计
1.技术选型
- Openclaw:开源AI Agent框架,支持多种IM(企业微信、飞书、Telegram等 )
- 飞书:国内广泛使用的企业协作平台,支持群聊、机器人、多维表格、云文档等
- 多维表格:用于存储竞赛情报数据
- 云文档:用于生成详细的备赛攻略
- 定时任务(Cron) :实现每日定时提醒
2.系统架构
用户(飞书群) → OpenClaw Agent → AI处理 → 多维表格/云文档
↓
定时提醒Cron → 用户(私信)
核心流程:
1.监听群消息 → 2. 关键词过滤 → 3. AI验证 → 4. 提取信息 → 5. 写表+写文档 → 6. 定时提醒
四、部署说明
1.环境准备
(1)服务器:通过腾讯云的Lighthouse服务器(轻量应用服务器)来安装运行OpenClaw。
(2)为OpenClaw配置模型和通道
在创建好服务器后,打开服务器的管理应用,进入OpenClaw的配置面板,如下图,我们需要在这里配置模型与通道。
首先是配置模型,这里支持多种国内大模型API Key一键配置,也支持配置其他的自定义模型(如OpenAI GPT、Gemini、Claude等),这里我配置了MiniMax M2模型,在开放平台的API Key管理页获取了API Key,填写到面板的“API Key”输入框,点击添加并应用按钮保存模型API Key。
接着是配置通道,这里我接入了飞书,需要在飞书开放平台创建企业自建应用,在凭证与基础信息获取App ID以及App Secret,之后在“通道配置”输入框,选择“飞书”,输入前面步骤中查询到的飞书机器人的App ID和App Secret,并点击应用并确定执行操作。
2.配置飞书机器人
基本操作步骤如下:
(1)登录飞书开放平台:open.feishu.cn/
(2)创建企业自建应用
(3)添加应用权限(我这里添加了所有的应用权限,以下是部分核心权限):
- im:message(接收消息)
- im:chat:member(群成员管理)
- bitable:table(多维表格操作)
- docx:file(云文档操作)
(4)在群里添加机器人为成员
这里具体配置步骤不做过多展示。
3.配置文件
在 /root/.openclaw/openclaw.json 中配置:
{
"channels": {
"feishu": {
"enabled": true,
"appId": "cli_xxxxxxxxxxxxx",
"appSecret": "xxxxxxxxxxxxxxxx",
"domain": "feishu",
"groupPolicy": "open"
}
}
}
五、核心功能实现
1.创建Skill目录结构
mkdir -p /root/.openclaw/workspace/skills/competition-listener
cd /root/.openclaw/workspace/skills/competition-listener
2.关键词过滤模块
监听群消息,自动检测竞赛相关关键词:
// 关键词列表
const KEYWORDS = ['竞赛', '比赛', '征集', '报名', '截止', '大赛', '征稿', '挑战杯', '互联网+'];
// 检查消息是否包含竞赛关键词
function isCompetitionMessage(message) {
if (!message) return false;
return KEYWORDS.some(kw => message.includes(kw));
} // 检查是否是PDF文件 function isPDFMessage(message, attachments) { return attachments && attachments.some(a => a.type === 'file' && a.name.endsWith('.pdf')); }
3.AI预处理模块
使用AI验证内容是否与竞赛相关,并提取关键信息:
// AI验证是否与竞赛相关
async function isCompetitionRelated(content) {
const prompt = `请判断以下内容是否与大学生竞赛/比赛/征集活动相关。
只需要回答"相关"或"不相关"。
内容:${content.substring(0, 500)}`;
const response = await callAI(prompt); return response.includes('相关'); } // AI提取竞赛关键信息 async function extractCompetitionInfo(content)
{ const prompt = `请从以下内容中提取竞赛关键信息,
JSON格式: { "竞赛名称": "", "主办单位": "", "报名截止日期": "", "报名链接": "", "参赛对象": "", "竞赛简介": "" }
内容:${content}`;
const response = await callAI(prompt);
return JSON.parse(response); }
4.多维表格写入
按顺序填充,从上到下查找空行:
AI代码解释
async function writeToBitable(competitionInfo) {
// 1. 获取所有记录
const records = await feishu_bitable_list_records({
app_token: APP_TOKEN,
table_id: TABLE_ID
});
// 2. 找到第一个空行 let emptyRecordId = null; for (const r of records.records) { if (!r.fields || !r.fields['竞赛名称'])
{ emptyRecordId = r.record_id; break; } }
// 3. 写入空行 await feishu_bitable_update_record({ app_token: APP_TOKEN,
table_id: TABLE_ID,
record_id: emptyRecordId,
fields: { '竞赛名称': competitionInfo.竞赛名称,
'主办单位': competitionInfo.主办单位,
'报名截止日期': parseDate(competitionInfo.报名截止日期),
'详细攻略链接': { text: '备赛全攻略', link: docLink },
'提醒状态': '开启' }
}
);
}
5.备赛攻略生成
自动生成详细的备赛文档:
AI代码解释
async function createGuideDoc(competitionInfo) {
const doc = await feishu_doc({
action: 'create',
title: `关于《${competitionInfo.竞赛名称}》的备赛全攻略`
});
const content = `一、竞赛速览 【竞赛名称】${competitionInfo.竞赛名称}
【主办单位】${competitionInfo.主办单位} ...
二、报名指南 【报名截止日期】${competitionInfo.报名截止日期} ...
三、备赛方案 【团队配置建议】... ...
四、注意事项 以上信息仅供参考,具体请以官方通知为准。`;
await feishu_doc({ action: 'append', content: content, doc_token: doc.document_id });
return `https://feishu.cn/docx/${doc.document_id}`;
}
6.定时提醒模块
每天10:00检查即将截止的竞赛:
AI代码解释
/ Cron任务配置
{
schedule: { kind: 'cron', expr: '0 10 * * *', tz: 'Asia/Shanghai' },
payload: {
kind: 'agentTurn',
message: '检查竞赛截止日期,给3天内截止的竞赛发送提醒'
}
} // 提醒逻辑 async function checkDeadlines() { const records = await feishu_bitable_list_records({...});
const now = Date.now();
const threeDaysLater = now + 3 * 24 * 60 * 60 * 1000;
for (const r of records.records) { const deadline = r.fields['报名截止日期'];
const status = r.fields['提醒状态'];
if (status === '开启' && deadline && deadline <= threeDaysLater)
{ // 发送私信提醒 await sendDM(userId, `提醒:${r.fields['竞赛名称']} 将在3天内截止!`);
}
}
}
六、效果展示
1.自动识别
用户在群里发送竞赛通知文件PDF或者word格式,并@机器人。实现功能:群里任何成员发送竞赛文件以后,机器人就可以自动开始识别并检测竞赛信息,如果检测到与竞赛相关,机器人就会私信群里的所有成员,询问他是否要报名比赛,如果用户回复“需要报名”之类的意思,机器人会确认并准备写入表格以及自动生成攻略(下一步操作)。
2.自动写表与生成攻略
确认后自动写入多维表格(按顺序填充空行)并生成详细的备赛攻略云文档:
其中需要注意的是,用户需要在飞书开放平台配置多维表格的相关权限。
3.定时提醒
每天10:00自动检查,给3天内截止的竞赛发送私信提醒。这里我分别做了模拟测试和真实的定时提醒。
七、总结与展望
本文详细介绍了如何基于OpenClaw打造竞赛情报助手,实现了:
- 关键词+AI双重过滤:避免误报,提高准确性
- PDF/文档自动解析:从各类文件中提取竞赛信息
- 多维表格顺序存储:规范管理竞赛数据
- 自动生成备赛攻略:提供详细的参赛指导
- 定时提醒功能:确保不会错过截止日期
该系统可广泛应用于:
- 学生社团:自动收集整理各类竞赛信息
- 教务处:统一管理校内竞赛通知
- 创新创业学院:跟踪各类创业大赛
- 所有参加竞赛的大学生:获取竞赛攻略
未来进一步扩展:
-
支持更多IM平台(企业微信、Telegram)
-
提升PDF、word解析能力
-
实现群里全员@通知
-
对接更多数据源(官网RSS、公众号)