如何为你的群聊增加一个AI助手?
平时与朋友在微信群聊天,经常会遇到一个问题。当大家讨论某些观点时,需要去搜索一些相关的信息。如果能在群聊中加入一个AI助手来完成这件事,那自然会方便很多。于是昨晚动手尝试了一下,通过www.perplexity.ai加Cursor,不到一个小时就实现了基础功能。
这篇文章就来分享一下整个过程,我会将与AI对话的内容放在文章中供你参考(微信本身并不支持外接API,我选择在电报中来实现)。
之前我从来没有使用过电报的Bot,所以我先在www.perplexity.ai中搜索了一下,如何注册Bot。
创建Telegram机器人
-
1. 打开Telegram:在您的手机或电脑上启动Telegram应用程序。 -
2. 搜索BotFather: -
• 在搜索栏中输入 @BotFather
并选择它。 -
3. 开始对话: -
• 点击“开始”按钮,BotFather将向您展示可用的命令。 -
4. 创建新机器人: -
• 输入命令 /newbot
,然后按回车。BotFather会提示您输入机器人的名称(可以随意命名)。 -
5. 设置用户名: -
• 接下来,您需要为机器人设置一个唯一的用户名,这个用户名必须以 bot
结尾(例如:MyBot)。注意,用户名不能包含中文或标点符号,并且必须是唯一的[1][2][5]。 -
6. 获取API Token: -
• 创建成功后,BotFather会返回一个API Token。请妥善保管这个Token,因为它是控制您机器人的关键[2][4]。
配置机器人
-
1. 列出所有机器人: -
• 输入命令 /mybots
,查看您创建的所有机器人。 -
2. 编辑机器人设置: -
• 选择刚创建的机器人,点击“编辑”,您可以设置描述、头像等信息[1][4]。 -
3. 设置命令: -
• 使用命令 /setcommands
来定义机器人的可用命令。您可以根据需要输入命令及其描述[4][5]。
添加机器人到群组
-
1. 搜索并添加机器人: -
• 在聊天窗口中输入 @
并搜索您创建的机器人名称。 -
• 选择您的机器人并将其添加到群组中。 -
2. 发送邀请: -
• 确保您的机器人在联系人列表中,并且能够接受邀请[3].
通过以上步骤,您就可以成功创建并配置一个Telegram机器人,并将其添加到您的群组中。
Bot创建完成,接下来就需要写代码让Bot接收和发送消息,这个过程就交由 Cursor 来实现,生成的代码基本无需修改就能使用。
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
# 替换成你从 BotFather 获取的 TOKEN
TOKEN = "你的bot token"
# 处理 /start 命令
asyncdefstart_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('你好!我是一个测试机器人。')
# 处理 /help 命令
asyncdefhelp_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text('你可以使用以下命令:\n/start - 开始对话\n/help - 显示帮助信息')
# 处理普通消息
asyncdefhandle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
message_type = update.message.chat.type
text = update.message.text
print(f'用户 ({update.message.chat.id}) 在 {message_type}: "{text}"')
# 回复用户消息
response = f'你说: {text}'
await update.message.reply_text(response)
# 处理错误
asyncdeferror(update: Update, context: ContextTypes.DEFAULT_TYPE):
print(f'更新 {update} 导致错误 {context.error}')
defmain():
print('启动中...')
# 创建应用程序实例
app = Application.builder().token(TOKEN).build()
# 添加命令处理器
app.add_handler(CommandHandler('start', start_command))
app.add_handler(CommandHandler('help', help_command))
# 添加消息处理器
app.add_handler(MessageHandler(filters.TEXT, handle_message))
# 添加错误处理器
app.add_error_handler(error)
# 开始轮询
print('开始轮询...')
app.run_polling(poll_interval=3)
if __name__ == '__main__':
main()
要使用这个机器人,你需要:
-
1. 首先安装必要的库:
pip install python-telegram-bot
-
2. 从 Telegram 的 BotFather 获取 TOKEN: -
• 在 Telegram 中搜索 @BotFather -
• 发送 /newbot
命令 -
• 按照提示设置机器人名称和用户名 -
• 获取 API TOKEN -
3. 将获取到的 TOKEN 替换到代码中的 TOKEN = "你的bot token"
部分 -
4. 运行程序
这个基础机器人具有以下功能:
-
• 响应 /start
命令 -
• 响应 /help
命令 -
• 回显用户发送的所有文本消息 -
• 基础的错误处理
你可以根据需要扩展这个基础实现,添加更多功能,比如:
-
• 添加更多命令处理器 -
• 处理图片、文件等其他类型的消息 -
• 添加数据库存储 -
• 实现特定的业务逻辑
需要添加什么具体功能,你可以继续问我。
实现这两步后,已经可以在Bot的聊天窗口中接收和发送消息。接下来就是将bot加入群聊中,获取群聊的消息,并发送内容。
要在群聊中使用 bot,请按照以下步骤操作:
-
1. 将 bot 添加到群组: -
• 在群组中点击群组标题打开群组信息 -
• 点击"添加成员"或"Add members" -
• 搜索并选择你的 bot -
• 或者直接在群组中分享 bot 的用户名链接 -
2. 授予 bot 权限: -
• 默认情况下,bot 可以看到所有消息 -
• 如果需要更改权限,可以在群组设置中修改 -
3. 修改代码以支持群组功能:
# ... existing code ...
# 处理普通消息
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
message_type = update.message.chat.type
text = update.message.text
# 获取用户信息
username = update.message.from_user.username
print(f'用户 @{username} ({update.message.chat.id}) 在 {message_type}: "{text}"')
# 区分私聊和群聊的回复
if message_type == 'group'or message_type == 'supergroup':
# 在群组中,只有当消息包含 @ 机器人用户名时才回复
iff'@{context.bot.username}'in text:
response = f"@{username} 在群组中说: {text}"
await update.message.reply_text(response)
else:
# 私聊时直接回复
response = f"你说: {text}"
await update.message.reply_text(response)
# ... existing code ...
这个修改后的代码:
-
1. 区分了群聊和私聊的处理方式 -
2. 在群聊中,只有当消息中 @ 了机器人时才会回复 -
3. 回复时会 @ 发消息的用户
使用方法:
-
• 在群聊中,发送 @你的bot名字 你好
来与 bot 交互 -
• bot 会回复并 @ 发消息的人 -
• 在私聊中,行为保持不变
注意事项:
-
1. 确保 bot 有足够的群组权限(至少需要有读消息和发送消息的权限) -
2. 某些群组可能限制 bot 的使用,需要管理员授权 -
3. 建议添加速率限制以防止滥用
如果你想让 bot 响应群组中的所有消息(不需要 @),只需删除 if f'@{context.bot.username}' in text:
的判断即可。
在这一步中遇到了一个坑。Cursor回复的注意事项中说Bot需要有群组权限,我按照他的提示去找,并没有发现相关的配置。问了一下水镜九奇,原来是需要设置机器人的隐私权限。
为了让机器人能在群组中接收消息,需要关闭 Telegram bot 的隐私模式。步骤:
-
1. 找 @BotFather -
2. 发送 /mybots -
3. 选择你的 bot -
4. 选择 "Bot Settings" -
5. 选择 "Group Privacy" -
6. 选择 "Turn off" -
7. 修改完后,重新将 bot 从群组移除再加入,就可以接收所有消息了。
迈过这个坑,现在Bot可以在群聊中收发消息了。接下来就是为它加入大模型功能,让大模型来回答我们在群里提出的问题。
在这里我先让Cursor接入openai接口,它给出的代码使用的是早期api接口,导致无法使用。当我将错误丢给Cursor继续追问时,尴尬的问题出现了,我的Cursor免费接口次数使用完了,不得不改向ChatGPT求助。第一次问ChatGPT时,它给出的还是早期接口代码。于是我将ChatGPT的联网功能打开,重写问它,这一次它给出了正确的代码。
至此,我就在群聊中增加了一个利用大模型帮我们回答问题的AI助手。
期间几乎不用我自己动手写一行代码,对一个完全不懂编程的小白来说,最大的挑战可能是如何在Cursor中搭建一个python环境。推荐大家可以亲自动手挑战一下。
## 完整代码
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
MessageHandler,
filters,
ContextTypes,
)
import openai
# 添加 OpenAI API 密钥
OPENAI_API_KEY = "你的OpenAI API密钥"
# 创建 OpenAI API 客户端
client = openai.OpenAI(api_key=OPENAI_API_KEY)
# 替换成你从 BotFather 获取的 TOKEN
TOKEN = "你的Bot token"
# 处理 /start 命令
async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("你好!我是一个测试机器人。")
# 处理 /help 命令
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(
"你可以使用以下命令:\n/start - 开始对话\n/help - 显示帮助信息"
)
# 处理普通消息
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
message_type = update.message.chat.type
text = update.message.text
# 获取用户信息
username = update.message.from_user.username
print(f'用户 @{username} ({update.message.chat.id}) 在 {message_type}: "{text}"')
try:
if message_type == "group"or message_type == "supergroup":
iff"@{context.bot.username}"in text:
# 调用 ChatGPT API
response = await get_chatgpt_response(text)
await update.message.reply_text(response)
else:
print(f"@{username} 在群组中说: {text}")
else:
await update.message.reply_text(response)
except Exception as e:
print(f"调用 ChatGPT API 时出错: {str(e)}")
await update.message.reply_text("抱歉,我现在无法回答。请稍后再试。")
# 添加 ChatGPT 调用函数
async def get_chatgpt_response(text: str) -> str:
try:
# 调用聊天补全接口
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": text},
],
)
# 返回助手的回复内容
return response.choices[0].message.content
except Exception as e:
print(f"ChatGPT API 错误: {str(e)}")
raise
# 处理错误
async def error(update: Update, context: ContextTypes.DEFAULT_TYPE):
print(f"更新 {update} 导致错误 {context.error}")
def main():
print("启动中...")
# 创建应用程序实例
app = Application.builder().token(TOKEN).build()
# 添加命令处理器
app.add_handler(CommandHandler("start", start_command))
app.add_handler(CommandHandler("help", help_command))
# 添加消息处理器
app.add_handler(MessageHandler(filters.TEXT, handle_message))
# 添加错误处理器
app.add_error_handler(error)
# 开始轮询
print("开始轮询...")
app.run_polling(poll_interval=3)
if __name__ == "__main__":
main()
说到这里,顺便来简单聊几句微信与电报的区别。
微信从一个简单的即时通讯工具,经过十几年的发展,已经成长为一个涵盖日常生活方方面面的超级App。在迈入AI时代后,它依然不断更新,新增了许多实用的AI功能。然而,微信的缺点同样显而易见,作为一个封闭系统,你无法自主在微信中使用AI赋能。像上述这种简单却实用的对话功能,在微信中却难以实现。
与微信截然相反的是电报。作为一个极度开放的平台,它为用户提供了极大的自由度,以至于让它成为一些灰色产业偏好的通讯工具。
过去十几年间,无数厂商试图挑战微信的地位,都无一成功。这一次AI的崛起,或许将会带来第一次真正有望取代微信的机会。
如果觉得内容不错,欢迎你点一下「在看」,或是将文章分享给其他有需要的人^^
0条留言