事情是这样的。
前两天我的公众号后台收到一条消息:“今天带不带伞?”
我愣了一下。后来才反应过来——估计有粉丝把我的号当天气预报机器人了。没办法,我平时发的内容太像真人,给人家整出信任感来了。
行吧,那我就干脆做一个呗。不花钱、一下午就能搞定、回复得比女朋友还贴心。
今天就把整个流程捋一遍。看完你也能给公众号或微信号加一个天气预报对话机器人,零成本的那种。
一、这玩意儿本质上是个啥
先帮小白把逻辑理清楚。
你给公众号发个消息,比如“南京明天天气”,后台拿到这个消息,做三件事:
理解你要干啥——这叫意图识别。可以很蠢,比如看到“天气”这个词就直接触发; 调天气接口查数据——随便找个免费天气 API; 把数据拼成人话回给你——比如“明天南京多云,12°C~21°C,出门不用带伞。”
所以不是什么黑科技,就是一个带 API 调用的自动回复。
我选的方案:微信公众号 + 微信对话开放平台(腾讯自家的免费产品)+ 和风天气 API(有免费额度)。
为什么不直接用云函数写?因为对话平台自带意图识别、上下文、技能配置,想改回复不用改代码,比较省命。
二、准备工作:三个东西先注册好
动手之前,先把材料备齐。
1. 微信公众号订阅号就行,个人就能注册,用来做测试完全够。
2. 微信对话开放平台
地址:https://openai.weixin.qq.com
用公众号绑定的微信扫码登录,授权一下就绑上了。这个平台可以让你用“技能”的方式配自动回复,不需要自己搭服务器。
3. 和风天气 API Key
地址:https://dev.qweather.com
注册后创建一个免费开发者项目,拿到 Key。免费版每天能调用 1000 次,够你个人玩到退休。
三、核心环节:手把手配一个天气技能
微信对话开放平台里,高级自动回复靠的是技能。我们现在就创建一个天气技能。
步骤1:创建技能
进入对话平台后台 -> 自定义技能 -> 新建技能。 技能名称就写:天气查询
步骤2:创建意图
意图的意思就是“用户想干嘛”,这里我们建一个叫查天气的意图。
然后加几个语料(用户可能会说的话):
北京天气
今天南京会不会下雨
后天上海多少度
深圳这周天气怎么样
杭州明天带不带伞
……
多写几条,平台会自动训练匹配。
步骤3:写字典(抓关键信息)
光有意图不够,你得提取城市和时间。
在意图配置里,可以添加一个叫词典的东西。新建两个词典:
城市词典:把常见城市名扔进去 时间词典:今天、明天、后天、这周、下周……
加完之后,用户的问句里平台就能自动把#城市#和#时间#抠出来,传给下一步用。
步骤4:配置服务(调API)
这里的“服务”就是你实际调天气接口的地方。对话平台支持直接用云函数,我们就用腾讯云函数——免费额度也够。
新建一个云函数,选 Node.js 16 环境。核心代码如下:
const axios = require('axios');
exports.main = async (event) => {
// 从对话平台传过来的参数里拿到城市和时间
const city = event.slot['城市'] || '北京';
const time = event.slot['时间'] || '今天';
// 调天气API,换成你自己的key
const key = '你的和风天气KEY';
const geoUrl = `https://geoapi.qweather.com/v2/city/lookup?location=${encodeURIComponent(city)}&key=${key}`;
const geoRes = await axios.get(geoUrl);
const cityId = geoRes.data.location[0].id;
// 根据时间选接口:今天/明天用3天预报,后面用7天
const dayMap = { '今天': 0, '明天': 1, '后天': 2 };
const dayOffset = dayMap[time] !== undefined ? dayMap[time] : 0;
const weatherUrl = `https://devapi.qweather.com/v7/weather/7d?location=${cityId}&key=${key}`;
const weatherRes = await axios.get(weatherUrl);
const dayData = weatherRes.data.daily[dayOffset];
// 组装回复
const reply = `${time}${city}天气:${dayData.textDay},` +
`${dayData.tempMin}°C ~ ${dayData.tempMax}°C,` +
`${dayData.windDirDay}风${dayData.windScaleDay}级。` +
(dayData.textDay.includes('雨') ? '建议带伞哦🌂' : '不用带伞~');
return { reply: reply };
};
解释几个要点:
和风天气的 API 是先查城市 ID,再拿天气,所以要调两个接口。 “今天/明天”这种词没法直接给 API,要自己映射成数组下标。 带伞建议就硬编码,看到“雨”字就触发,简单粗暴。
步骤5:把云函数绑定到技能服务
云函数部署后,会有一个触发器地址。回到对话平台技能配置里的“服务调用”,选“腾讯云函数”,填上函数名和区域,参数映射那里把提取的城市和时间槽位传给云函数。搞定。
四、测试一下,看它理不理你
用你自己微信给公众号发消息:
“北京明天天气” “后天杭州带伞吗” “上海这周什么天气”
如果能回出来正确信息,恭喜你,已经成功了。
如果回复“我不太懂”,检查三个地方:
意图里的语料够不够(多写几条,包含不同说法); 城市有没有在词典里(没加的城市它匹配不到); 云函数日志,看 event.slot是不是正确拿到了参数。
我上次踩坑就是城市词典忘加“哈尔滨”,朋友在东北冻够呛,骂我是骗子。
五、进阶玩法:让你的助手更像人
上面那个版本能用,但比较呆。我给几个“更像真人”的升级方向,按需选用。
1. 加一点随机语气
别每次都回“北京明天天气”,冷冰冰的。可以弄个数组随机选:
const opening = ['来咯来咯~', '稍等下,我看看哈~', '收到,天气预报已查收📡'];
const randomOpen = opening[Math.floor(Math.random() * opening.length)];
2. 加上穿衣建议(很实用)
根据最低温给个简单建议:
let clothes = '';
if (tempMin < 10) clothes = '天冷,穿厚外套。';
elseif (tempMin < 20) clothes = '建议穿件薄外套。';
else clothes = '短袖走起,注意防晒。';
3. 支持“每周天气”概览
问“这周天气”时,直接遍历 7 天数据拼成一段简略回复,别让用户问 7 次。
4. 配上图标
微信支持 emoji,用一下没人怪你。晴天☀️,下雨🌧,下雪❄️,多云⛅,让你的回复自带表情包气质。
六、花多少钱?我帮你算好了
按我这种方案:
微信对话开放平台:免费 腾讯云函数:调用量不超免费额度,免费 和风天气 API:免费版每天 1000 次,免费
结论:零元购。
唯一成本就是一下午的时间。而这一下午换来的,是以后每次朋友问你天气,你都可以把公众号甩过去,相当解压。
最后说一句扎心的。
市面上很多“AI天气助手”报价几百上千,无非就是把上面这套流程多套了层壳。你要不是特在意那种“包装感”,自己手搓一个足够用,而且还知道它每一步是怎么跑的,要改啥都不求人。
别被“AI技能”这个词唬住,它就是个带 API 的自动回复,你比它聪明。
程序员小白条的编程日记:https://xbt.xiaobaitiao.top/ (分享如何拿到腾讯实习 Offer 和多个中大厂的面试机会,大学经历、求职经历、职场工作、创作经历、生活日常、面经、技术分享、毕设项目指导)定期更新内容,成长打怪系列,分享从大一到大四的完整面经,更新好玩的,有趣的事!看完可冲中大厂!dy同名程序员小白条,主要口述面试经历和分享我认为的实用网站,会比面经讲的详细很多,以真实面试录音为主!公粽号:程序员落叶(秋招技巧、面经、公司投递表、谈offer)
欢迎关注上方公众号!感谢支持!一起进步,共勉!
夜雨聆风