10分钟,无需公网 IP!零门槛搭建 NapCatQQ 趣味 AI 人机,聊天互动超简单

news/2025/11/23 17:33:29/文章来源:https://www.cnblogs.com/28Blog/p/19261096

超简单使用NapCatQQ创建AI人机 - 无需公网IP

突然发现一个有趣的项目:通过 go-cqhttp 生态模拟QQ客户端行为,让账号伪装成合法虚拟用户,再通过 AstrBot 触发AI对话,实现智能人机交互。核心逻辑如下:

来自NapCat的脑图

核心原理:go-cqhttp 登录QQ账号后,模拟合法客户端接收消息;AstrBot 搭建WebSocket服务端,NapCat 获取消息后通过WS连接触发AI对话,最终将回复返回给QQ用户。


核心流程

  1. 部署 NapCatAstrBot 容器
  2. NapCat 登录QQ账号,接收用户消息(基于 go-cqhttp 生态)
  3. AstrBot 启动WebSocket服务端,NapCat 通过WS连接推送消息,AI生成回复后返回

⚠️ 重要警告

  1. 务必使用QQ小号测试!go-cqhttp 并非QQ官方认可生态,账号有被封禁风险(封禁后无法解封)
  2. 严禁用于盈利行为,否则可能面临法律责任

第一步:部署 AstrBot 生态

1.1 创建容器

# 创建工作目录并进入
mkdir astrbot && cd astrbot# 启动AstrBot容器
sudo docker run -itd \-p 6180-6200:6180-6200 \-p 11451:11451 \-v $PWD/data:/AstrBot/data \--name astrbot \soulter/astrbot:latest

1.2 配置 AstrBot 基础信息

容器启动后,通过Web界面配置机器人和WS服务:

  1. 访问地址:http://服务器IP:6185
  2. 默认账号密码:NapCat/NapCat
  3. 配置步骤:
    • 点击左侧「机器人」→「创建新的机器人」
    • 选择「QQ个人账户」
    • 机器人名称自定义
    • 反向WebSocket端口保持 11451(或自定义宿主机映射端口)


第二步:部署 NapCat 消费者(消息接收与转发)

2.1 创建容器

docker run -d \-e NAPCAT_GID=$(id -g) \-e NAPCAT_UID=$(id -u) \-p 3000:3000 \-p 3001:3001 \-p 6099:6099 \--name napcat \--restart=always \mlikiowa/napcat-docker:latest

2.2 查看容器关键信息

2.2.1 获取WebUI登录Token与QQ登录二维码

# 查看NapCat日志(替换为实际容器ID,可通过 docker ps 查看)
docker logs 容器ID

日志中会包含:

  • WebUI访问Token(用于登录 6099 端口控制面板)
  • QQ登录二维码(扫码登录小号)

2.2.2 获取 AstrBot 容器IP(关键)

# 查看astrbot容器的内网IP(用于WS连接)
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' astrbot

示例输出:172.17.0.4(需记住此IP,后续配置WS用)

2.3 配置 NapCat WebSocket 客户端

  1. 访问 NapCat WebUI:http://服务器IP:6099,输入日志中的Token登录
  2. 左侧「网络配置」→「创建WebSocket Client(客户端)」
  3. 配置参数:
    • URL格式:ws://AstrBot容器IP:11451/ws(例:ws://172.17.0.4:11451/ws
    • 注意:/ws 后缀必须保留,端口与AstrBot配置一致



第三步:配置 AI 模型(以硅基流动为例)

3.1 获取硅基流动API密钥

  1. 访问 硅基流动官网(填入邀请码 EaeNjBKZ 有优惠)
  2. 注册登录后,创建API密钥并复制

3.2 在 AstrBot 中配置AI模型

  1. 回到 AstrBot WebUI(http://服务器IP:6185
  2. 左侧「模型提供商」→「新增模型」→ 选择「硅基流动」
  3. 配置参数:
    • ID:保持默认(无需修改)
    • API Base URL:https://api.siliconflow.cn/v1
    • API Key:粘贴硅基流动的密钥
    • 模型配置:留空即可
    • 点击「启用」→「保存」



测试效果

给 NapCat 登录的QQ小号发送消息,即可触发AI回复:

  • 发送 /help 可查看功能列表
  • 日常聊天直接输入内容即可


趣味插件推荐(丰富交互)

AstrBot 支持多种插件,以下是简单易配置的趣味插件:

插件名称 功能描述 效果示例
astrbot_plugin_emotionai 为AI回复添加情感色彩(开心/难过等) 情感回复
zhiyu-astrbot-hjm 输入「哈基米」返回随机哈基米音乐 哈基米音乐
astrbot_plugin_doro 输入 /doro/cheshire 返回随机表情包 随机表情包

插件安装方式

  1. 进入 AstrBot WebUI → 左侧「插件市场」
  2. 搜索插件名称 → 点击「安装」→ 启用即可

最后:邀请码福利

如果觉得硅基流动好用,欢迎使用我的邀请码,双方都有优惠哦!(/ω\)

  • 邀请码:EaeNjBKZ
  • 邀请链接:https://cloud.siliconflow.cn/i/EaeNjBKZ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/974077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1088. Rational Arithmetic (20)

1088. Rational Arithmetic (20)#include <iostream>using namespace std;long long getsame(long long a, long long b) {if(b != 0){return getsame(b, a % b);}else{return a;} }void simplify(long long &am…

1087. All Roads Lead to Rome (30)

1087. All Roads Lead to Rome (30)#include <iostream> #include <vector> #include <string.h>using namespace std;struct node {int next, cost; };vector<node> v[27000]; vector<int…

解码UDP

UDP 协议基础认知 UDP(User Datagram Protocol,用户数据报协议)是传输层核心协议之一,基于 IP 协议实现跨网络主机进程间的无连接数据传输。它面向事务提供简单通信服务,不保证数据交付、有序性和重复防护,也不提…

人工智能之数据分析 numpy:第六章 数组基本操作

人工智能之数据分析 numpy:第六章 数组基本操作人工智能之数据分析 numpy 第六章 数组基本操作@目录人工智能之数据分析 numpy前言一、修改数组形状(Reshaping)1. reshape()2. resize()3. ravel() 与 flatten()二、…

2025中山办公场地租赁优选:中山西区金嘉创新港,一站式创业空间,赋能企业成长新机遇

随着中山市产业升级与创新创业浪潮的蓬勃发展,优质办公空间已成为企业发展的重要基石。在2025年中山商业地产市场中,中山西区金嘉创新港凭借多元化的空间解决方案、完善的配套服务体系及卓越的区位优势,成为各类企业…

国产数据库替代MongoDB:政务电子证照新选择 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

读书笔记《投资的未来》,估算收益率

比较IBM和新泽西标准石油两家公司,一个新兴的,受追捧的,一个传统的,但结果,是石油公司胜出。尽管两只股票的业绩都不错,但是1950~2003年,新泽西标准石油的投资者每年可以取得14.42%的年收益率,这比IBM提供的1…

使用代码查询快递信息的方法(与查询天气的方式雷同)

第一步:在标签中添加JS文件具体内容如下:第二步:写出大概的框架第三步:写JS部分(1)定义appkey和API地址(2)校验输入和显示加载状态(3)调用API和解析返回数据(4)展示拼接内容和判断内容是否正确第四步:保存并运行查…

1101. Quick Sort (25)

1101. Quick Sort (25)#include <iostream> #include <vector> #include <algorithm>using namespace std;int num[100010], low[100010], high[100010];int main() {int n;scanf("%d", &…

1100. Mars Numbers (20)

1100. Mars Numbers (20)#include <iostream> #include <string.h>using namespace std;char ch[2][13][5] = {"tret", "jan", "feb", "mar", "apr",…

解码网络编程基础

进程间通信方式 基础概念 程序是数据和指令的集合,运行时成为进程,操作系统会为其分配资源并记录参数。同一主机内进程通信可通过管道、信号、消息队列、信号量集、共享内存实现,这些方式依赖主机本地系统资源,无法…

C++的3种继承方式

C++的3种继承方式 在 C++ 中,继承方式(public、protected、private)决定了基类成员在派生类中的访问权限,以及派生类对象对基类成员的访问权限。正确选择继承方式是实现封装、复用和多态的关键。以下是三种继承方式…

1082. Read Number in Chinese (25)

1082. Read Number in Chinese (25)#include <iostream> #include <string.h>using namespace std;int first = 1;void setfirst() {if(first == 1){first = 0;}else{printf(" ");} }int main()…

1081. Rational Sum (20)

1081. Rational Sum (20)#include <iostream>using namespace std;long long getsame(long long a, long long b) {if(b != 0){return getsame(b, a % b);}else{return a;} }void simplify(long long &a, lo…

1067. Sort with Swap(0) (25)

1067. Sort with Swap(0) (25)#include <iostream>using namespace std;int index[100010], num[100010];int main() {int n;scanf("%d", &n);int i, count = 0;for(i = 0; i < n; i++){scanf(…

1066. Root of AVL Tree (25)

1066. Root of AVL Tree (25)#include <iostream> #include <stdlib.h>using namespace std;typedef struct node {int key, bf;struct node *lchild, *rchild; }*bnode;void rrotate(bnode *root) {bnode…

1070. Mooncake (25)

1070. Mooncake (25)#include <iostream> #include <algorithm>using namespace std;struct node {double amounts, prices, perprice; }mooncakes[1010];int cmp(node n1, node n2) {return n1.perprice …

1069. The Black Hole of Numbers (20)

1069. The Black Hole of Numbers (20)#include <iostream> #include <string.h> #include <algorithm>using namespace std;int cmp(char a, char b) {return a > b; }int main() {int num[2];s…

1050. String Subtraction (20)

1050. String Subtraction (20)#include <iostream> #include <string.h>using namespace std;int flag[130]; char s[2][10010];int main() {int i, len[2];for(i = 0; i <= 1; i++){gets(s[i]);len[i…

1049. Counting Ones (30)

1049. Counting Ones (30)#include <iostream>using namespace std;int main() {int n;scanf("%d", &n);int low, mid, high, d = 1, res = 0;while(n >= d){high = n / (d * 10);mid = (n - h…