30,816
社区成员
发帖
与我相关
我的任务
分享周末闲来无事,想着用Node.js搭个能查天气、讲笑话、算运势的问答机器人,一方面练练手,一方面解决群聊里的“日常一问”。这篇文章就记录下整个搭建过程,包括框架选择、API集成、上下文管理以及部署,送给所有想摸鱼但手痒的开发者。
机器人主要实现以下功能:
天气查询(某地实时天气)
笑话随机推送
星座运势
简单的单位换算
聊天兜底(第三方闲聊API)
框架选了Express做轻量Web服务,对话交互通过WebSocket完成,方便后续接入网页聊天组件。另外引入Axios做API请求,dotenv管理密钥,整个项目目录结构干净,无冗余。
天气接口需要城市名,但用户输入往往不规范,比如“南京”或“江苏南京”。我第一步做了个地名清洗,去除“省”“市”等后缀,并支持拼音自动补全。但更聪明的做法是利用用户IP定位。
从req.ip获得IP后,调用免费的IP定位API(某开放平台每天3000次免费),拿到城市名,再请求天气API。两个接口一个链式调用,前端无感。
javascript
async function getWeatherByIP(ip) {
const loc = await axios.get(`https://wapi.cn/api_detail/66/174.html`);
const city = loc.data.city;
const weather = await axios.get(`https://wapi.cn/api_detail/66/174.html`);
return `当前${city}天气:${weather.data.weather},温度${weather.data.temp}℃`;
}
这个小设计让机器人显得格外“聪明”,知道你在哪儿,也能给出对应的天气。返回文本配上emoji,聊天感十足。
笑话接口返回段子数组,每次随机挑一条。为了避免重复,我在内存里维护了一个最近50条的队列,优先取不在队列里的笑话,这样用户不会听到重复的。如果全部重复,再重新初始化队列。
星座运势采用了前面提到的星座API,用户输入“双子座今日运势”,机器人提取星座名称,调接口,拿到幸运数字、颜色和运势概述,拼成一条走心回复。加上一点随机延迟,模拟人类思考过程,用户反馈很好,说“感觉像在和真人聊天”。
当用户问题没命中任何意图时,不能尴尬地沉默。我接了一个免费的智能闲聊API,把用户的原始问题作为输入,获得回复。虽然有时候回复逻辑比较飘,但至少不会冷场。而且我加了个过滤层,如果闲聊接口返回的置信度低于0.6,就统一回复一句土味情话或者哲理短句,由另一个金句接口提供。这种多层次兜底,整体体验丝滑。
真正的智能体现在多轮对话。我用一个简单的Map存储每个会话ID的历史记录(最多10条),每次收到新消息,把历史作为上下文一并传给意图分析模块——这个模块我是用简单的关键词匹配做的,没上NLP,因为功能有限。
比如用户先问“南京天气”,接着问“那后天呢”,机器人通过上下文知道城市是南京,接口请求时带上日期“后天”,最终返回后天天气。这种简易状态管理在原型阶段足够好用,而且内存占用极低。
最后一步,我把项目部署到一台低配云服务器上,用PM2管理进程。配置了日志轮转,避免硬盘写满。同时,为每个API调用加上耗时统计,超过2秒的请求单独记录,方便后续排查。还做了健康检查端点/health,返回各API连通状态,放在UptimeRobot上监控,出问题秒级告警。
整个项目从开始写到上线只花了两天,代码量不超过800行,但功能之丰富、体验之顺滑,超过许多付费的聊天机器人平台。这就是用轮子的魅力,把精力集中在交互设计上,而不是重复造基础服务。
如果你也准备搭一个类似的小玩意儿,强烈建议直接用现成的API开始堆功能。别在底层耗费热情,快速拼出成品,然后骄傲地发到朋友圈和GitHub,那种成就感,绝对能点亮一整个周末。
#Node.js #API接口 #智能机器人 #聊天机器人 #开发实战 #Express #免费API #WebSocket #项目分享