动手做个 AI 机器人,帮我回消息

article/2025/8/28 20:47:01

大家好,我是鱼皮,自从做了知识分享,我的微信就没消停过,平均每天会收到几百个消息,大部分都是学编程的朋友向我咨询编程问题。

但毕竟我只有一个人,没法所有消息都一个个回复,所以也是很愧疚和无力吧;另外我发现,大家的很多问题是重复的,而且大多数我都专门写文章来回答过。

所以,我决定自制一个 AI 问答机器人,帮我自动回复大家的常见问题,减少重复工作。

结果没想到,制作过程中被 Bug 坑惨了,闹了不少笑话,感兴趣的朋友可以看看视频哈哈:

地址:https://www.bilibili.com/video/BV1Vq4y1B7zu/

由于制作方法实在太简单,所以给大家分享下完整的教程,让大家也能轻松制作自己的 AI 机器人。

自制 AI 机器人教程

预计整个制作过程 10 分钟

先描述下需求:做一个能够自动回答微信消息的机器人。

要实现这个需求,有两个要点:

  1. 如何让程序接收到微信发来的消息?
  2. 如何根据消息来回复对应的内容?

这两个问题,如果没有一定的专业知识,是很难自行解决的。但如今是开源的时代,我们可以站在巨人的肩膀上,用现成的技术来解决这些问题。

接受消息

可以使用开源的 wechaty 库来实现对微信的自动化操作,比如收发消息、通过好友、拉群等。

开源微信机器人库

使用方法很简单,在 wechaty 仓库的项目介绍文件中,有最简单的入门示例代码,只需要 6 行代码 ,就能启动一个帮你接受消息的机器人!

wechaty 支持几乎所有主流的编程语言,其中 JavaScript 的入门代码如下:

import { WechatyBuilder } from 'wechaty'
// 启动
WechatyBuilder.build().on('scan', (qrcode, status) => console.log(`Scan QR Code to login: ${status}\nhttps://wechaty.js.org/qrcode/${encodeURIComponent(qrcode)}`)).on('login',            user => console.log(`User ${user} logged in`)).on('message',       message => console.log(`Message: ${message}`)).start()

解释一下上述代码,你会发现,wechaty 中定义了很多事件,比如扫码、用户登录、接受消息、接受好友请求等。你不需要关心事件是如何被它触发的,只需要针对不同事件来编写处理方法就好,比如收到消息后自动回复同样的消息,示例代码如下:

// 初始化机器人
const bot = WechatyBuilder.build({name: 'yupi-wxrobot',// 用于兼容不同 IM 协议,不用关心puppet: 'wechaty-puppet-wechat',
})
// 处理消息
bot.on('message', async function (msg) {// 获取消息发送人const contact = msg.talker()// 获取消息内容const text = msg.text()// 获取群聊信息const room = msg.room()// 是私聊if (contact && text) {// 回复相同内容msg.say(text, contact);}
}

但是,大家 千万不要 直接运行上述代码!因为一旦你启动了机器人、又没有限制回复者昵称的话,它会对所有给你发消息的人生效!

我刚开始没注意,就被坑了。。。

所以,如果你只想自动回复某人或某群聊的消息,记得在代码中补充相应的过滤逻辑,比如:

// 处理消息
bot.on('message', async function (msg) {// 获取消息发送人const contact = msg.talker()// 获取消息内容const text = msg.text()// 获取群聊信息const room = msg.room()// 不处理自己的消息if (msg.self()) {return}// 群聊还是私聊if (room) {if(room.topic() === '鱼皮群') {// 回复}} else {if(contact.name() === '小号') {// 回复}}
}

OK,使用上述代码,就能实现接受消息和自动回复啦!

那么你是否好奇,wechaty 是如何接受到微信消息的呢?其实原理很简单,执行 wechaty 程序时,它会利用无头浏览器技术悄悄打开一个网页版微信,然后在你运行程序的控制台弹出微信网页版的登录二维码,在你扫码登录后,程序只需要监听页面元素的变化、或者自动触发点击事件即可。

网页版微信

其实道理很简单,就是把我们能对网页进行的人工操作转化为后台自动化执行。

智能回复

第一个问题解决了,那么如何根据不同的问题给出不同的回复呢?

很多同学肯定上来就说 AI,那都是被我用的 “智能” 一次带偏了。其实如果只是简单的自动回复,问题规则可收敛、可枚举的情况下,直接用 if ... else ... 就能解决了!

if(/你好/.test(text)) {msg.say('好的');
} else if (/谢谢/.test(text)) {msg.say('不客气');
} else if (/加群/.test(text)) {msg.say('公众号[程序员鱼皮],回复[加群]');
} else {msg.say('我不懂');
}

不是说人工智能的本质就是 if else 么哈哈,只不过是让机器来帮你去做 if else 而已。

但现实是,我的读者对于同一个问题也会有不同的表达方式,比如 “怎么学 Java?”、“我想学 Java,怎么学?” 等等。因此,还是需要人工智能登场了。

到哪里去搞人工智能呢?

我们可以直接利用 微信对话开放平台 提供的强大能力,一行代码都不用写,就能免费实现智能对话!

地址:https://openai.weixin.qq.com/

登录后先创建一个机器人:

创建机器人


然后可以为机器人添加技能,你可以自定义技能,向机器人灌输指定的问题和回答;也可以直接使用平台提供的默认技能,比如听歌、聊天、百科等:

配置技能

我的需求是自动回答读者的编程相关问题,因此需要创建一个新技能。在这里,可以灵活地自定义题目、不同的问法以及回答,全部用界面操作即可,轻松打造你的专属机器人:

自定义技能

配置好之后,就可以发布和使用机器人了。我们可以将机器人和公众号 / 小程序绑定,自动回复读者消息;可以直接在 H5 网页中接入智能客服;还可以在程序中调用开放接口来使用智能对话能力:

发布和使用

此处我们希望在 wechaty 程序中自动获得回复,所以要使用 开放接口 的方式,也很简单,就是用个请求库去调用接口,示例代码如下:

// 获取 API 签名,2小时过期
// token 需从平台获取
const url = `https://openai.weixin.qq.com/openapi/sign/${token}`;
const {signature} = (await axios.post(url, {userid: 'test'
})).data;// 调用 AI 接口,获取答案
async function getAnswer(userid, text) {const apiUrl = `https://openai.weixin.qq.com/openapi/aibot/${token}`;return (await axios.post(apiUrl, {"signature": signature,"userid": userid,"query": text,})).data?.answer;
}

大概就是这样,又简单又实用,感兴趣的同学可以用它来做出很多有趣的功能~


我是鱼皮,肝文不易,有帮助的话还希望能给个 点赞 支持下,谢谢大家。


http://chatgpt.dhexx.cn/article/jWd14i35.shtml

相关文章

开发一个智能问答机器人

近期开发了一套基于自然语言处理的问答机器人,之前没有做过python,主要做asp.net,写这篇目的是给想要开发这类智能客服系统的朋友提供一个思路,项目已经上线,但在开发和设计过程中仍然有很多问题没有得到解决&#xff…

【原创】聊天机器人与自动问答技术

聊天机器人与自动问答技术 作者:mjs (360电商技术) 引言 最近半年,微软的聊天机器人小冰比较火,有些人对这方面的技术产生了兴趣,恰好之前做过自动问答方面的一些简单工作,这次写一篇应景之作&…

智能问答机器人

1. 前言 问答机器人现在很多场合都有使用,比如:网页智能客服、微信公众号智能回复、淘宝的售后客服,QQ聊天机器人等等。有了这些客户机器人就能帮我们回答很多预置的一些问题,帮助用户解决常见问题,还可以进行自主训练…

智能问答机器人概述

智能问答机器人概述 总览任务机器人FAQ机器人闲聊机器人 总览 处理逻辑: query–>中控逻辑–>response 任务机器人 指特定条件下提供信息或服务的机器人。 任务型机器人核心模块主要包括三部分: 自然语言理解模块 —— Language Understanding …

数仓实时数据同步 debezium

数仓实时数据同步 debezium 背景debezium 简介架构基本概念 例子Router目前遇到的问题 背景 数据湖将源库的数据同步到hive数仓ods层,或直接在kafka中用于后面计算。源库包括mysql、postgresql、sqlserver、oracle,大部分是mysql数据库。当前采用的sqoo…

基于日志的同步数据一致性和实时抽取

宜信技术研发中心架构师 目前就职于宜信技术研发中心,任架构师,负责流式计算和大数据业务产品解决方案。曾任职于Naver china(韩国最大搜索引擎公司)中国研发中心资深工程师,多年从事CUBRID分布式数据库集群开发和CUB…

解析 TiDB 在线数据同步工具 Syncer

TiDB 是一个完全分布式的关系型数据库,从诞生的第一天起,我们就想让它来兼容 MySQL 语法,希望让原有的 MySQL 用户 (不管是单机的 MySQL,还是多机的 MySQL Sharding) 都可以在基本不修改代码的情况下,除了可以保留原有…

服务器与客户端的数据同步

2019独角兽企业重金招聘Python工程师标准>>> 问题 从一个例子说起,我们的客户端从服务器获取数据,这里假定获取文章。第一次使用,我们获取服务器端最新发表的几篇文章。 我们可以每次都重新获取,但这样费时又费流量。好…

数据实时同步或抽取上收的技术分析

原文:http://blog.csdn.net/dsg_gulibin/article/details/1696365 1 实现数据集中的技术手段分析比较 根据业界提供数据同步或抽取的解决方案来看,主要包括以下几大类: l 存储复制技术 l 数据库复制技术 l …

时间同步/集群时间同步/在线/离线

目录 一、能够连接外网 二、集群不能连接外网--同步其它服务器时间 一、能够连接外网 1.介绍ntp时间协议 NTP(Network Time Protocol)网络时间协议,是用来使计算机时间同步的一种协议,它可以使计算机对其服务器或时钟源做同步…

如何实时同步数据到StarRocks

我们知道,是StarRocks基于Doris开发的,它在多表连接查询的性能方面引领OLAP市场,是一个很好用的结构化数据仓库。但是一直没有很好的工具能够实现业务数据库的数据实时同步到StarRocks分布式数据仓库集群中,本文将带领读者一起来通…

文件实时同步

rsync remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的、数据在内存缓存区完成之后还没有写入到磁盘中去、所以有时候要同步到磁盘中去的,而rsync说白了跟复制差不多、能将一个文件从一个地方复制到另外一个地方的、但是他也可以实现跨主机复…

系统间通讯实现数据信息实时同步解决方案

项目开发阶段遇到一个需求,描述大致就是同一个用户在A系统数据库保存的数据信息与在B系统数据库保存的数据信息要保持同步。当A系统用户修改了个人信息,A系统后台在将用户修改后的信息入库的同时也会向B系统发送消息,让B系统后台进行自动数据…

一文带你玩转实时数据同步方案

1、概述 1.1、目标 实时数据同步主要实现从源数据库到目标数据库的实时数据同步。源数据主要支持mysql数据库,目标数据包括mysql数据库和hbase数据库。 下面是实时数据同步的数据流转图,mysql的增量订阅数据经过canal和kafka,数据最终实时…

两台服务器同时写文件 怎么做同步,两台服务器做实时数据同步

两台服务器做实时数据同步 内容精选 换一换 DCS Memcached即将下线,部分Region已暂停售卖,建议使用Redis4.0/5.0。本章节主要描述Memcached主备实例。Memcached主备实例在单机实例基础上,增强服务高可用以及数据高可靠性。Memcached主备实例具…

实时数据同步方案

一.Flume收集各数据库日志,准实时抽取到HDFS 安装HDP,包含Flume 方案优点: 1.配置简单,不用编程:只要在flume.conf文件中配置source、channel及sink的相关属性 2.采用普通SQL轮询的方式实现,具有通用性&…

如何实现数据自动化的实时同步?

企业在日常业务中,比如总分支机构之间、数据中心之间、不同节点之间、跨国业务之间等,都需要将文件及时的传输,以供协同使用。所以,很多企业会选择一些同步工具或软件。 谈到文件同步备份大家使用较多的可能是Rsync、同步盘等一些…

像素是什么,一个像素有多大,像素和分辨率的关系

图片的像素和分辨率 对于像素和分辨率这两个词,主要见于图片和显示设备上。只要你用到手机里的照相功能,你都要接触到这两个概念。只是大多数人都是一知半解,而更多的人却根本就不知道,白白浪费了手机里500万、800万像素的摄影头&…

屏幕尺寸、分辨率、DPI、PPI

屏幕尺寸 下面这张图是华为荣耀7的尺寸图,图上写的是5.2英寸。我们所说的这个5.2英寸是手机屏幕对角线的长度。 我们平时是不用英寸这个单位的,我们用的是毫米,厘米,米这些单位。那么英寸和毫米,厘米之间怎样的换算关…

像素(Pixel)、DPI与PPI一看就明白

像素(Pixel)、DPI与PPI 像素(Pixel)DPI 英文全写是(Dots Per Inch,每英寸点数)PPI 英文全写是(Pixels Per Inch,每英寸像素数)比喻来区分应用(这张图熟悉吗)1.分辨率啥意思&#xff…