用Astrbot框架,实现微信个人号机器人和QQ个人号机器人
要点说明
1.astrbot机器人框架、微信侧wechatpadpro及2个数据库、QQ侧napcat,一共5个容器用docker compose统一编排
2.五个容器,在docker中共用一个网络桥接在宿主机网络,所以5个容器间的通信,可以通过【容器名称:容器端口号】来实现
3.微信侧容易风控,风险自行承担。详见通过 WeChatPadPro 接入微信 | AstrBot(一定要整页看完)
4.首次登入說明
可能出现立刻掉线情況,重新扫码登入2次后即可稳定
24小时内可能会再次掉线,使用原API
key
重新登入即可重新登入后一般可稳定使用3个月
3天后基本稳定,7天后更稳定
⚠️ 注意: 一个授权码
key
仅限一个 WeChat 账号使用,多账号需生成多个授权码
5.关于astrbot的AI服务商配置,这篇文章不做讲解
前期准备
1.linux服务器系统一套(我的是ubuntu系统),并且可以正常通网,我这里用的是废弃电脑刷了ubuntu系统,作为可以连网的本地服务器使用。
2.安装好了docker 和docker compose(如果先安装1panel,在1panel的web端控制后台可以找到docker服务的安装按钮。
3.趁手工具:1panel
4.工具框架:Astrbot
5.消息平台适配器:
QQ个人号:Napcat
微信个人号:wechatpadpro
(ps.github搜索仓库显示too many request,是因为你没登陆github账号)
步骤1-镜像拉取(可跳过)
如果你的服务器支持科学代理网络环境,不会因为网络问题拉取失败,就可以无视这条,直接进行步骤2,因为docker compose up -d命令后,会自动拉取镜像。
1.安装好1panel(安装说明在官网有详细指引,不做展开)
2.拉取4个镜像(注意需要一些科学的环境才能保障网络畅通,可以自查是否能正常打开docker仓库)
2-1.Astrbot镜像拉取
docker pull m.daocloud.io/docker.io/soulter/astrbot:latest #此代码为拉取Astrbot镜像
docker pull soulter/astrbot:latest
#以上两个镜像都可以,选一个即可,只是镜像来源不同而已。
2-2.Napcat镜像拉取
docker pull mlikiowa/napcat-docker:latest #此代码为拉取Napcat镜像
2-3.SQL数据库镜像拉取
docker pull mysql:8.0 #此代码为拉取SQL8.0的镜像
2-4.Redis数据库镜像拉取
docker pull wechatpadpro/redis:6 #此代码为拉取Redis的alpine版本镜像
2-5.wechatpadpro镜像拉取
docker pull wechatpadpro/wechatpadpro:latest #此代码为拉取wechatpadpro镜像
备注:如果安装了1panel,可以在应用商店安装SQL和Redis,但是需要在wechatpadpro的设置文件中去修改对应的数据库变量,并且,在对应数据库要创建新的,为了省事,我懒得做,所以就统一拉取镜像,最后通过docker compose一体化编排,搞定多个容器的创建和管理。
步骤2-docker compose 编排
1.如果1panel的版本有编排功能,则开始利用1panel的编排工具,进行编排内容编写:
#这是2025/07/19 wechatpad更新之后,我在这个日期按照wechatpadpro官方格式调整的compose内容
# docker-compose.yml
# NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose -f ./compose/astrbot.yml up -d
services:
#安装napcat容器
napcat:
environment:
- NAPCAT_UID=${NAPCAT_UID:-1000}
- NAPCAT_GID=${NAPCAT_GID:-1000}
- MODE=astrbot
ports:
- 6099:6099
container_name: as_napcat
restart: unless-stopped
image: mlikiowa/napcat-docker:latest
volumes:
- ./data:/AstrBot/data
- ./ntqq:/app/.config/QQ
networks:
- astrbot_network
mac_address: "02:42:ac:11:00:02"
#安装astrbot容器
astrbot:
environment:
- TZ=Asia/Shanghai
image: soulter/astrbot:latest
container_name: astrbot
restart: unless-stopped
ports:
- "6185:6185"
- "6195:6195"
- "6199:6199"
volumes:
- ./data:/AstrBot/data
- ./napcat/config:/app/napcat/config
- ./ntqq:/app/.config/QQ
networks:
- astrbot_network
#安装wechatpadpro消息平台的数据库--mysql
mysql:
# 指定镜像和版本
image: mysql:8.0
# 指定容器的名称
container_name: as_mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123456}
MYSQL_DATABASE: ${MYSQL_DATABASE:-weixin}
MYSQL_USER: ${MYSQL_USER:-weixin}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-weixin123}
ports:
- "${MYSQL_PORT:-3306}:3306"
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root123456}"]
interval: 5s
timeout: 5s
retries: 10
networks:
- astrbot_network
#安装wechatpadpro消息平台的数据库--redis:
redis:
# 指定镜像和版本
image: wechatpadpro/redis:6
# 指定容器的名称
container_name: as_redis
restart: unless-stopped
command: redis-server --appendonly yes
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 20
networks:
- astrbot_network
#安装微信消息平台wechatpadpro
wechatpadpro:
image: wechatpadpro/wechatpadpro:${WECHAT_TAG:-latest}
# 指定容器的名称
container_name: as_wechatpadpro
# 指定镜像和版本
restart: unless-stopped
ports:
- "${WECHAT_PORT:-8080}:8080"
- "${PORT:-1238}:1238"
env_file:
- 1panel.env
#sql连接格式是:sql用户:sql数据库密码
environment:
- DB_HOST=mysql
- REDIS_HOST=redis
volumes:
- ./1panel.env:/app/.env
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
networks:
- astrbot_network
# === 日志配置 ===
logging:
driver: "json-file" # 指定使用 json-file 日志驱动 (默认,但明确写出更清晰)
options:
max-size: "10m" # 每个日志文件最大 10 MB
max-file: "3" # 最多保留 3 个日志文件
networks:
astrbot_network:
driver: bridge
name: astrbot_network
volumes:
mysql_data:
redis_data:
2.如果没有编排功能,可以手动在以下路径,创建一个新的文件夹astrbot_all
,名字自定义,算是为了这个小项目的容器编排进行命名,同时创建一个docker-compose.yml文件,文件具体代码,在步骤①附上了。
3.注意:docker-compose.yml中注意区分:【数据库用户名】【数据库密码】【数据库名称】【sql数据库root密码】,图中标注的很清楚了。
另外:如果你不是用1panel的编排,那么需要自己创建.env文件,并且把docker-compose.yml内容中所有的1panel.env
更改成.env
,比如:
步骤3-创建env文件
左边是最小部署环境变量,右边是其他的环境变量,根据情况自己配置
#留意【自己修改】的部分,需要设置
# 基础配置
WECHAT_PORT=8080
PORT=1238
TZ=Asia/Shanghai
GH_WXID=
ADMIN_KEY=自己修改
# Worker配置
WORKER_POOL_SIZE=500
MAX_WORKER_TASK_LEN=1000
# Web配置
WEB_DOMAIN=localhost:1238
WEB_TASK_NAME=
WEB_TASK_APP_NUMBER=
NEWS_SYN_WXID=true
DT=true
# 消息队列配置
TOPIC=wx_sync_msg_topic
ROCKET_MQ_ENABLED=false
ROCKET_MQ_HOST=127.0.0.1:9876
ROCKET_ACCESS_KEY=
ROCKET_SECRET_KEY=
RABBIT_MQ_ENABLED=false
RABBIT_MQ_URL=
KAFKA_ENABLED=false
KAFKA_URL=
KAFKA_USERNAME=
KAFKA_PASSWORD=
# MySQL配置
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=自己修改
MYSQL_DATABASE=weixin
MYSQL_USER=wechatpadpro
MYSQL_PASSWORD=自己修改(下行的sql密码自己修改)
MYSQL_CONNECT_STR=wechatpadpro:sqlpassword@tcp(mysql:3306)/weixin?charset=utf8mb4&parseTime=true&loc=Local
# 任务配置
TASK_RETRY_COUNT=3
TASK_RETRY_INTERVAL=5
HEARTBEAT_INTERVAL=25
AUTO_AUTH_INTERVAL=30
AUTO_SYNC_INTERVAL_MINUTES=30
TASK_EXEC_WAIT_TIMES=500
QUEUE_EXPIRE_TIME=86400
# WebSocket配置
WS_HANDSHAKE_TIMEOUT=10
WS_READ_BUFFER_SIZE=4096
WS_WRITE_BUFFER_SIZE=4096
WS_READ_DEADLINE=120
WS_WRITE_DEADLINE=60
WS_PING_INTERVAL=25
WS_CONNECTION_CHECK_INTERVAL=45
WS_MAX_MESSAGE_SIZE=8192
# 集群
CLUSTER_NAME=
ZK_ADDR=
ETCD_ADDR=
# 禁用命令
DISABLED_CMD_LIST=
#如果数据库第一次设置没设置对,导致wechatpadpro和sql数据库连接不上,调整好后,可以用 docker compose down -v 的命令,删除挂载卷(但是会清空数据库容器在挂载卷下的可持久化数据)
#其他的环境变量
# 是否开启调试模式(true: 开启,false: 关闭)
DEBUG=false
# 服务监听地址(0.0.0.0表示监听所有网卡)
HOST=0.0.0.0
# 服务端口号
PORT=1238
# API版本前缀(如 /v1, /v2)
API_VERSION=
# MCP服务端口(用于AI大模型集成服务)
MCP_PORT=8099
# 推广公众号微信ID(用于新用户首次登录时推广)
GH_WXID=
# ==========================================
# Redis配置
# ==========================================
# Redis服务器地址
REDIS_HOST=redis
# Redis端口
REDIS_PORT=6379
# Redis数据库编号
REDIS_DB=1
# Redis密码
REDIS_PASSWORD=123456
# Redis最大空闲连接数
REDIS_MAX_IDLE=30
# Redis最大活动连接数
REDIS_MAX_ACTIVE=100
# Redis空闲连接超时时间(毫秒)
REDIS_IDLE_TIMEOUT=5000
# Redis连接最大生命周期(秒)
REDIS_MAX_CONN_LIFETIME=3600
# Redis连接超时时间(毫秒)
REDIS_CONNECT_TIMEOUT=5000
# Redis读取超时时间(毫秒)
REDIS_READ_TIMEOUT=10000
# Redis写入超时时间(毫秒)
REDIS_WRITE_TIMEOUT=10000
# ==========================================
# 应用配置
# ==========================================
# 时区设置
TZ=Asia/Shanghai
# 工作池大小(并发处理任务的goroutine数量)
WORKER_POOL_SIZE=500
# 工作池最大任务队列长度
MAX_WORKER_TASK_LEN=1000
# Web域名(设置为localhost:1238表示使用本地服务器,留空则不上报状态)
WEB_DOMAIN=localhost:1238
# Web任务名称
WEB_TASK_NAME=
# Web任务应用编号
WEB_TASK_APP_NUMBER=
# 是否按微信ID同步消息
NEWS_SYN_WXID=true
# 是否启用DT
DT=true
# ==========================================
# 消息队列配置
# ==========================================
# 消息主题
TOPIC=wx_sync_msg_topic
# 是否启用RocketMQ
ROCKET_MQ_ENABLED=false
# RocketMQ服务器地址
ROCKET_MQ_HOST=
# RocketMQ访问密钥
ROCKET_ACCESS_KEY=123
# RocketMQ密钥
ROCKET_SECRET_KEY=123!#@13$
# 是否启用RabbitMQ
RABBIT_MQ_ENABLED=false
# RabbitMQ连接URL(格式:amqp://用户名:密码@主机:端口/,例如:amqp://yunkong:123456@127.0.0.1:5672/)
RABBIT_MQ_URL=
# 是否启用Kafka
KAFKA_ENABLED=false
# Kafka服务器地址列表
KAFKA_URL=
# Kafka用户名
KAFKA_USERNAME=
# Kafka密码
KAFKA_PASSWORD=
# ==========================================
# 任务配置
# ==========================================
# 任务重试次数
TASK_RETRY_COUNT=3
# 任务重试间隔(秒)
TASK_RETRY_INTERVAL=5
# 心跳包间隔(秒)
HEARTBEAT_INTERVAL=25
# 自动认证间隔(分钟)
AUTO_AUTH_INTERVAL=30
# 自动同步间隔(分钟)
AUTO_SYNC_INTERVAL_MINUTES=30
# 任务执行等待时间(毫秒)
TASK_EXEC_WAIT_TIMES=500
# 队列过期时间(秒)
QUEUE_EXPIRE_TIME=86400
# ==========================================
# WebSocket配置
# ==========================================
# WebSocket握手超时时间(秒)
WS_HANDSHAKE_TIMEOUT=10
# WebSocket读缓冲区大小(字节)
WS_READ_BUFFER_SIZE=4096
# WebSocket写缓冲区大小(字节)
WS_WRITE_BUFFER_SIZE=4096
# WebSocket读取超时时间(秒)
WS_READ_DEADLINE=120
# WebSocket写入超时时间(秒)
WS_WRITE_DEADLINE=60
# WebSocket心跳间隔(秒)
WS_PING_INTERVAL=25
# WebSocket连接检查间隔(秒)
WS_CONNECTION_CHECK_INTERVAL=45
# WebSocket最大消息大小(字节)
WS_MAX_MESSAGE_SIZE=8192
# ==========================================
# 集群配置
# ==========================================
# 集群名称
CLUSTER_NAME=
# ZooKeeper地址
ZK_ADDR=
# ETCD地址
ETCD_ADDR=
# ==========================================
# 禁用命令配置
# ==========================================
# 禁用命令列表(逗号分隔)
DISABLED_CMD_LIST=
然后保存好,跟docker-compose.yml要在同一个路径下。
步骤4-运行docker compose编排,创建容器并且观察容器日志是否正常
1.利用1panel创建的编排,设置编辑好docker-compose.yml的内容后,就会开始运行了。
2.或者在终端输入
cd /opt/1panel/docker/compose/astrbot_all #先进入到我们创建的这个astrbot_all的文件夹内,这也是刚刚编辑好的docker-compose.yml文件所在位置
docker compose up -d #根据这个编排文件进行容器创建,其中-d是为了不在终端直接显示容器日志
3.容器全部创建好之后,应该有5个:
4.检查关键容器日志和容器状态
as_wechatpadpro容器日志:
astrbot容器日志:
as_napcat容器日志:
这3个容器日志检查都没问题,安装部分就大功告成。接下来是配置。
步骤5-astrbot+napcat配置QQ
在浏览器打开astrbot的web端后台,登录初始用户名和密码都是astrbot(登陆后会强制你改密码,然后重新用新账号密码登录即可)
登录地址:localhost:6185
,如果你是在另一台局域网中的电脑浏览器打开,那么就是你的服务器内网ip:6185的形式,
比如我打开就是用192.168.5.122:6185
,登录进入后看图配置即可:
astrbot容器日志出现aiocqhttp适配器已连接就ok了
接下来就登录napcat的web控制后台,扫码登录QQ即可
步骤6-astrbot+wechatpadpro配置微信
在浏览器打开astrbot的web端后台,登录初始token是napcat(登陆后会提示你改token,然后重新用新账号密码登录即可)
来到消息平台适配器-新增适配器
选择WeChatPadPro
保存即可
查看astrbot容器日志,这样的状态,就是随时可以微信扫码登录了
如果登录时间超过180秒,就在astrbot的web管理后台,消息平台开关一下即可。
扫码登录成功后,astrbot容器日志会提示
扫码成功后,wechatpadpro容器日志会提示
- 感谢你赐予我前进的力量