Bootstrap

大模型接入微信公众号、QQ频道/群/个人 自动回复(专业领域),智能体(扣子,腾讯元器/QQ开放平台)(更新中)

扣子

借助扣子提供的可视化设计与编排工具,你可以通过零代码或低代码的方式,快速搭建出基于大模型的各类 AI 项目,满足个性化需求、实现商业价值。
智能体:智能体是基于对话的 AI 项目,它通过对话方式接收用户的输入,由大模型自动调用插件或工作流等方式执行用户指定的业务流程,并生成最终的回复。智能客服、虚拟伴侣、个人助理、英语外教都是智能体的典型应用场景。
应用:应用是指利用大模型技术开发的应用程序。扣子中搭建的 AI 应用具备完整业务逻辑和可视化用户界面,是一个独立的 AI 项目。通过扣子开发的 AI 应用有明确的输入和输出,可以根据既定的业务逻辑和流程完成一系列简单或复杂的任务,例如 AI 搜索、翻译工具、饮食记录等。

智能体

步骤1:创建一个智能体(应用)

https://www.coze.cn/docs/guides/quickstart
在这里插入图片描述

步骤2:编写提示词,为智能体添加技能,调试智能体(模型支持deepseek)

在这里插入图片描述

步骤3:发布智能体(可以接入微信公众号,api等)

在这里插入图片描述

应用

开发一个 AI 翻译应用

业务逻辑

在这里插入图片描述

用户界面

在这里插入图片描述

发布(支持微信小程序和抖音小程序,需认证)

在这里插入图片描述
模板https://www.coze.cn/template

腾讯元器(可以绑定QQ机器人)

https://yuanqi.tencent.com/my-creation/agent

1.智能体创建(支持deepseek等模型)

在这里插入图片描述

2.发布和使用(可以接入微信公众号,api等)

在这里插入图片描述

QQ机器人(可以绑定腾讯元器,也可以自己购买云服务器开发)

python sdk

在这里插入图片描述

使用腾讯云服务器开发QQ机器人(其余云服务器类似)

腾讯云服务器
在这里插入图片描述

首先购买一个腾讯云服务器,如果需求不多,最便宜的即可,学生有免费试用

https://cloud.tencent.com/product/lighthouse
我买的是最便宜的腾讯云轻量服务器一年99元,对于我自己的需求该配置已够用。
在这里插入图片描述
你想要用它开发网站,可以选择WordPress和Halo建站。
在这里插入图片描述
还可以购买域名,有些系统支持自动设置HTTPS,如不支持需手动配置。
在这里插入图片描述
如需购买域名,一年几元即可拥有。
在这里插入图片描述
域名购买之后,可设置https,并且进行ICP备案,过程可直接在腾讯云操作,这里不再复述。

VSCODE远程连接云服务器,方便代码开发

下载 RemoteSSH

https://code.visualstudio.com/
在VSCODE中搜索并安装第一个, 下面两个会自动帮你装好。
在这里插入图片描述

配置 config

配置的格式为:

Host host1 # 主机的别名
    HostName  121.66.88.886  # 主机的 IP
    User root  ## 要通过 ssh 登陆的用户
  • Host: 显示的名字, 取个自己记得住的就行
  • HostName: 填服务器的 IP 地址
  • User: 要通过 ssh 登陆的用户。

连接

点击连接目标服务器, 输入密码;

如果你遇到报错, 请看报错自查部分, 可能会给你答案.

第一次登陆时, 服务器会下载 VScode Server, 这是正常的.

左下角出现服务器的别名, 说明登陆成功.

在VSCODE中编写python脚本

可参考:https://cloud.tencent.com/lab/courseDetail/1012757351629305

在这里插入图片描述

设置使用范围和人员

在这里插入图片描述

可添加自己,或者群聊和频道用来测试。并且ip白名单需要添加自己的云服务器公网ip。(回调地址为购买并备案icp成功的网址,测试不填也可。)
在这里插入图片描述
需在服务器安装

pip install qq-botpy
pip install pyyaml

config.yaml

token:
  appid: "123"
  token: "xxxx"

测试成功后,服务器会输出
在这里插入图片描述

示例代码

# -*- coding: utf-8 -*-
import asyncio
import os
import random
import time
import datetime
import pandas as pd

from openai import OpenAI

import botpy
from botpy import logging
from botpy.ext.cog_yaml import read
from botpy.message import *

test_config = read(os.path.join(os.path.dirname(__file__), "config.yaml"))

_log = logging.get_logger()


class MyClient(botpy.Client):
    async def on_ready(self):
        _log.info(f"robot 「{self.robot.name}」 on_ready!")

    async def on_direct_message_create(self, message: DirectMessage):
        await self.api.post_dms(
            guild_id=message.guild_id,
            content=qzk(message),
            msg_id=message.id,
        )

    async def on_c2c_message_create(self, message: C2CMessage):
        await message._api.post_c2c_message(
            openid=message.author.user_openid,
            msg_type=0, msg_id=message.id,
            content=qzk(message)
        )

    async def on_group_at_message_create(self, message: GroupMessage):
        messageResult = await message._api.post_group_message(
            group_openid=message.group_openid,
              msg_type=0,
              msg_id=message.id,
              content=qzk(message))
        _log.info(messageResult)

    async def on_at_message_create(self, message: Message):
        _log.info(message.author.avatar)
        if "sleep" in message.content:
            await asyncio.sleep(10)
        _log.info(message.author.username)

        qin = qzk(message)

        await message.reply(content=f"{self.robot.name}: {qin}")


if __name__ == "__main__":
    # 通过预设置的类型,设置需要监听的事件通道
    # intents = botpy.Intents.none()
    # intents.public_guild_messages=True

    # 通过kwargs,设置需要监听的事件通道
    intents = botpy.Intents(public_guild_messages=True, public_messages=True, direct_message=True)
    client = MyClient(intents=intents)
    client.run(appid=test_config["appid"], secret=test_config["secret"])

也可接入大模型api,让QQ机器人回答你问的问题

client = OpenAI(api_key="******", base_url="https://api.deepseek.com")
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "代码智能生成:经过海量优秀开源代码数据训练,可根据当前代码文件及跨文件的上下文,为你生成行级/函数级代码、单元测试、代码优化建议等。沉浸式编码心流,秒级生成速度,让你更专注在技术设计,高效完成编码工作。"
                                      "研发智能问答:基于海量研发文档、产品文档、通用研发知识、阿里云的云服务文档和 SDK/OpenAPI 文档等进行问答训练,为你答疑解惑,助你轻松解决研发问题。"
                                      "AI 程序员:具备多文件代码修改和工具使用的能力,可以与开发者协同完成编码任务,如需求实现、问题解决、单元测试用例生成、批量代码修改等。"},
        {"role": "user", "content": message.content.split(" ")[-1]},
    ],
    stream=False
)

qin = response.choices[0].message.content

python sdk中给了以下示例

examples/
.
├── README.md
├── config.example.yaml          # 示例配置文件(需要修改为config.yaml)
├── demo_announce.py             # 机器人公告API使用示例
├── demo_api_permission.py       # 机器人授权查询API使用示例
├── demo_at_reply.py             # 机器人at被动回复async示例
├── demo_at_reply_ark.py         # 机器人at被动回复ark消息示例
├── demo_at_reply_embed.py       # 机器人at被动回复embed消息示例
├── demo_at_reply_command.py     # 机器人at被动使用Command指令装饰器回复消息示例
├── demo_at_reply_file_data.py   # 机器人at被动回复本地图片消息示例
├── demo_at_reply_keyboard.py    # 机器人at被动回复md带内嵌键盘的示例
├── demo_at_reply_markdown.py    # 机器人at被动回复md消息示例
├── demo_at_reply_reference.py   # 机器人at被动回复消息引用示例
├── demo_dms_reply.py            # 机器人私信被动回复示例
├── demo_get_reaction_users.py   # 机器人获取表情表态成员列表示例
├── demo_guild_member_event.py   # 机器人频道成员变化事件示例
├── demo_interaction.py          # 机器人互动事件示例(未启用)
├── demo_pins_message.py         # 机器人消息置顶示例
├── demo_recall.py               # 机器人消息撤回示例
├── demo_schedule.py             # 机器人日程相关示例

QQ智能体

在这里插入图片描述

软链接

为 Python3 和 pip3 添加软链接可以通过 ln 命令来实现。以下是具体步骤:

  1. 查找 Python3 和 pip3 的安装路径
    首先,你需要知道 Python3 和 pip3 的实际安装路径。可以使用以下命令查找:
which python3
which pip3

这些命令会输出类似如下的路径:

Python3: /usr/local/bin/python3
pip3: /usr/local/bin/pip3
  1. 创建软链接
    假设你想将 Python3 和 pip3 的软链接创建到 /usr/bin/ 目录下(这是一个常见的系统路径),你可以使用以下命令:

创建 Python3 软链接

sudo ln -s $(which python3) /usr/bin/python3

创建 pip3 软链接

sudo ln -s $(which pip3) /usr/bin/pip3
  1. 验证软链接是否成功创建
    你可以通过以下命令验证软链接是否成功创建:
ls -l /usr/bin/python3
ls -l /usr/bin/pip3

你应该看到类似如下的输出,表明软链接已经成功创建:

lrwxrwxrwx 1 root root 22 Oct  1 12:34 /usr/bin/python3 -> /usr/local/bin/python3
lrwxrwxrwx 1 root root 22 Oct  1 12:34 /usr/bin/pip3 -> /usr/local/bin/pip3
  1. 更新环境变量(如果需要)
    如果你希望在终端中直接输入 python 或 pip 来调用 Python3 和 pip3,可以进一步创建软链接:
    创建 python 和 pip 软链接指向 Python3 和 pip3
sudo ln -s $(which python3) /usr/bin/python
sudo ln -s $(which pip3) /usr/bin/pip

示例

ln -s /root/python37/bin/python3.7 /usr/bin/python3
ln -s /root/python37/bin/pip3 /usr/bin/pip3

注意: 这里的 /root/python37/ 是我的 Python3 安装路径,和之前下载的安装包放在同一个位置。运行前请确认一下你的安装路径是否和我一样。

注意事项

  • 权限问题:创建软链接时可能需要管理员权限,因此使用了 sudo。
  • 冲突问题:确保 /usr/bin/ 下没有同名文件或链接,否则可能会导致冲突。如果有同名文件或链接,建议先备份或删除旧的链接。

发布到QQ智能体
发布到微信公众号(订阅号、服务号)

大模型提示词示例

使用deepseek设置课堂随机点名,最后生成html,点击就能运行

<!DOCTYPE html>
<html>
<head>
    <title>秦老师课堂点名</title>
    <style>
        body {
            margin: 0;
            height: 100vh;
            display: flex;
            flex-direction: column;
            align-items: center;
            background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1);
            background-size: 400% 400%;
            animation: gradientBG 15s ease infinite;
            font-family: '微软雅黑', sans-serif;
        }

        @keyframes gradientBG {
            0% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
            100% { background-position: 0% 50%; }
        }

        h1 {
            color: #fff;
            text-shadow: 3px 3px 5px rgba(0,0,0,0.3);
            font-size: 2.5em;
            margin: 20px 0;
            letter-spacing: 4px;
        }

        #nameDisplay {
            font-size: 3em;
            margin: 40px 0;
            min-height: 100px;
            color: #333;
            transition: all 0.3s;
            text-shadow: 2px 2px 4px rgba(255,255,255,0.5);
        }

        button {
            padding: 15px 30px;
            font-size: 1.2em;
            background: #ff9a9e;
            border: none;
            border-radius: 30px;
            color: white;
            cursor: pointer;
            transition: all 0.3s;
            box-shadow: 0 4px 15px rgba(0,0,0,0.2);
            margin-bottom: 20px;
        }

        button:hover {
            transform: scale(1.1);
            background: #ff6b6b;
        }

        .speed-control {
            margin-top: 20px;
            background: rgba(255,255,255,0.3);
            padding: 15px;
            border-radius: 20px;
            width: 300px;
        }

        input[type="range"] {
            width: 100%;
            height: 10px;
            background: #fff;
            border-radius: 5px;
            outline: none;
        }

        .selected {
            color: #0066ff !important;
            font-size: 4em !important;
            font-weight: bold;
            animation: select 0.5s ease;
        }

        @keyframes select {
            0% { transform: scale(1); }
            50% { transform: scale(1.2); }
            100% { transform: scale(1); }
        }
    </style>
</head>
<body>
    <h1>🎉 秦老师课堂开课啦 🎉</h1>
    <div id="nameDisplay">准备好接收惊喜吧!</div>
    <button id="startBtn">开始/停止点名</button>
    
    <div class="speed-control">
        <input type="range" id="speed" min="1" max="100" value="50">
        <div>火星调节器 🚀</div>
    </div>

    <script>
        const names = ["所有的人名"];
        
        let isRunning = false;
        let intervalId = null;
        const nameDisplay = document.getElementById("nameDisplay");
        const startBtn = document.getElementById("startBtn");
        const speedControl = document.getElementById("speed");

        function getRandomName() {
            return names[Math.floor(Math.random() * names.length)];
        }

        function updateSpeed() {
            if (isRunning) {
                clearInterval(intervalId);
                intervalId = setInterval(() => {
                    nameDisplay.textContent = getRandomName();
                }, 100 - speedControl.value);
            }
        }

        startBtn.addEventListener('click', () => {
            if (!isRunning) {
                isRunning = true;
                intervalId = setInterval(() => {
                    nameDisplay.textContent = getRandomName();
                }, 100 - speedControl.value);
                startBtn.textContent = "停止点名";
                nameDisplay.classList.remove("selected");
            } else {
                isRunning = false;
                clearInterval(intervalId);
                startBtn.textContent = "开始点名";
                nameDisplay.classList.add("selected");
            }
        });

        speedControl.addEventListener('input', updateSpeed);
    </script>
</body>
</html>

在这里插入图片描述

参考

1.https://www.coze.cn/
2.https://yuanqi.tencent.com/agent-shop
3.https://q.qq.com/#/
4.https://ollama.com/search
5.https://github.com/datawhalechina/coze-ai-assistant
6.https://chat.deepseek.com/
7.https://bot.q.qq.com/wiki/#

;