如何为你的群聊增加一个AI助手?

平时与朋友在微信群聊天,经常会遇到一个问题。当大家讨论某些观点时,需要去搜索一些相关的信息。如果能在群聊中加入一个AI助手来完成这件事,那自然会方便很多。于是昨晚动手尝试了一下,通过www.perplexity.aiCursor,不到一个小时就实现了基础功能。

这篇文章就来分享一下整个过程,我会将与AI对话的内容放在文章中供你参考(微信本身并不支持外接API,我选择在电报中来实现)。

之前我从来没有使用过电报的Bot,所以我先在www.perplexity.ai中搜索了一下,如何注册Bot。

创建Telegram机器人

  1. 1. 打开Telegram:在您的手机或电脑上启动Telegram应用程序。
  2. 2. 搜索BotFather
    • • 在搜索栏中输入@BotFather并选择它。
  3. 3. 开始对话
    • • 点击“开始”按钮,BotFather将向您展示可用的命令。
  4. 4. 创建新机器人
    • • 输入命令/newbot,然后按回车。BotFather会提示您输入机器人的名称(可以随意命名)。
  5. 5. 设置用户名
    • • 接下来,您需要为机器人设置一个唯一的用户名,这个用户名必须以bot结尾(例如:MyBot)。注意,用户名不能包含中文或标点符号,并且必须是唯一的[1][2][5]。
  6. 6. 获取API Token
    • • 创建成功后,BotFather会返回一个API Token。请妥善保管这个Token,因为它是控制您机器人的关键[2][4]。

配置机器人

  1. 1. 列出所有机器人
    • • 输入命令/mybots,查看您创建的所有机器人。
  2. 2. 编辑机器人设置
    • • 选择刚创建的机器人,点击“编辑”,您可以设置描述、头像等信息[1][4]。
  3. 3. 设置命令
    • • 使用命令/setcommands来定义机器人的可用命令。您可以根据需要输入命令及其描述[4][5]。

添加机器人到群组

  1. 1. 搜索并添加机器人
    • • 在聊天窗口中输入@并搜索您创建的机器人名称。
    • • 选择您的机器人并将其添加到群组中。
  2. 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. 1. 首先安装必要的库:
pip install python-telegram-bot
  1. 2. 从 Telegram 的 BotFather 获取 TOKEN:
    • • 在 Telegram 中搜索 @BotFather
    • • 发送 /newbot 命令
    • • 按照提示设置机器人名称和用户名
    • • 获取 API TOKEN
  2. 3. 将获取到的 TOKEN 替换到代码中的 TOKEN = "你的bot token" 部分
  3. 4. 运行程序

这个基础机器人具有以下功能:

  • • 响应 /start 命令
  • • 响应 /help 命令
  • • 回显用户发送的所有文本消息
  • • 基础的错误处理

你可以根据需要扩展这个基础实现,添加更多功能,比如:

  • • 添加更多命令处理器
  • • 处理图片、文件等其他类型的消息
  • • 添加数据库存储
  • • 实现特定的业务逻辑

需要添加什么具体功能,你可以继续问我。

实现这两步后,已经可以在Bot的聊天窗口中接收和发送消息。接下来就是将bot加入群聊中,获取群聊的消息,并发送内容。

要在群聊中使用 bot,请按照以下步骤操作:

  1. 1. 将 bot 添加到群组:
    • • 在群组中点击群组标题打开群组信息
    • • 点击"添加成员"或"Add members"
    • • 搜索并选择你的 bot
    • • 或者直接在群组中分享 bot 的用户名链接
  2. 2. 授予 bot 权限:
    • • 默认情况下,bot 可以看到所有消息
    • • 如果需要更改权限,可以在群组设置中修改
  3. 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. 1. 区分了群聊和私聊的处理方式
  2. 2. 在群聊中,只有当消息中 @ 了机器人时才会回复
  3. 3. 回复时会 @ 发消息的用户

使用方法:

  • • 在群聊中,发送 @你的bot名字 你好 来与 bot 交互
  • • bot 会回复并 @ 发消息的人
  • • 在私聊中,行为保持不变

注意事项:

  1. 1. 确保 bot 有足够的群组权限(至少需要有读消息和发送消息的权限)
  2. 2. 某些群组可能限制 bot 的使用,需要管理员授权
  3. 3. 建议添加速率限制以防止滥用

如果你想让 bot 响应群组中的所有消息(不需要 @),只需删除 if f'@{context.bot.username}' in text: 的判断即可。

在这一步中遇到了一个坑。Cursor回复的注意事项中说Bot需要有群组权限,我按照他的提示去找,并没有发现相关的配置。问了一下水镜九奇,原来是需要设置机器人的隐私权限。

为了让机器人能在群组中接收消息,需要关闭 Telegram bot 的隐私模式。步骤:

  1. 1. 找 @BotFather
  2. 2. 发送 /mybots
  3. 3. 选择你的 bot
  4. 4. 选择 "Bot Settings"
  5. 5. 选择 "Group Privacy"
  6. 6. 选择 "Turn off"
  7. 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条留言

留言