NapCat 站在小木屋外

零成本搭建 AI QQ 机器人

🌩️ 太长不读:用 Cloudflare Workers 搭建代理白嫖 Gemini,然后用 AstrBot 和 NapCat 接入 QQ,实现零(低)成本的 AI QQ 机器人。

🏛️ 首先要有 Gemini

Google 是为数不多的开放免费大语言模型 API 的提供商,但是很可惜,与其他 Google 服务一样,在国内是无法直接访问的。考虑到低成本这个要求,我们使用 Cloudflare Workers 搭建一个代理,实现国内访问。

当然如果您有境外服务器,那更好,直接在 NGiNX 里用常规方法添加反向代理。您都有服务器了,就不需要词元教您了吧 😁

目前 Gemini 对 gemini-2.0-flash 提供了每天 1500 次免费请求,而 Cloudflare Workers 则有每天 1000 万次免费请求,对于个人用户,如果您不把机器人拉近好几个大群,肯定是绰绰有余的。

首先,您要有个 Google 账号,还有 Cloudflare 账号,都不需要绑定信用卡——相信您可以自己搞定。另外还得有个域名,在 NameSilo 上可以买个 .top,十几块一年,还能用支付宝。

然后,去 Google AI Studio,创建一个 token,复制备用。

在 Google AI Studio 中创建一个 token

创建结束,复制备用

Gemini 这边就结束了,接下来去 Cloudflare 创建一个 Worker。

创建 Worker

然后,选择 Hello World 项目,创建一个空项目,随便起个名字。建立成功之后选择“编辑代码”,粘贴以下的 JS 代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url)
  let targetURL = new URL('https://generativelanguage.googleapis.com')

  targetURL.pathname = url.pathname
  targetURL.search = url.search

  let newRequest = new Request(targetURL, {
    method: request.method,
    headers: request.headers,
    body: request.body
  })

  let response = await fetch(newRequest)

  // 添加跨域支持
  let corsHeaders = {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'GET,HEAD,POST,OPTIONS',
    'Access-Control-Allow-Headers': request.headers.get('Access-Control-Request-Headers'),
  }

  // 如果是预检请求,直接返回跨域头
  if (request.method === 'OPTIONS') {
    return new Response(null, { headers: corsHeaders })
  }

  // 复制响应以添加新的头
  let responseHeaders = new Headers(response.headers)
  for (let [key, value] of Object.entries(corsHeaders)) {
    responseHeaders.set(key, value)
  }

  return new Response(response.body, {
    status: response.status,
    statusText: response.statusText,
    headers: responseHeaders
  })
}

这就是一段简单的代理代码,词元是从某个开源项目里摘取的,但是想不起来是哪个了。如果您知道或者找到了,还麻烦评论告诉词元,以便添加来源。

然后,在设置中添加自己的域名。*.workers.dev 在国内是被屏蔽的,所以需要添加自己的域名。

添加自己的域名

如果您的域名就托管在 Cloudflare 上,输入新域名之后会自动添加 DNS 记录;如果不是,需要您自己添加一个,并且可能无法启用 SSL。

搭建完成之后,我们用 curl 测试一下:

1
2
3
4
5
6
7
8
curl "https://[YOUR_CUSTOM_DOMAIN]/v1beta/models/gemini-2.0-flash:generateContent?key=[GEMINI_API_KEY]" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "contents": [{
    "parts":[{"text": "Explain how AI works"}]
    }]
   }'

如果返回了一串包含回答的 JSON,那就证明搭建是成功的。恭喜 🎉

🐱 NapCat

NapCat 是一个比较好用的 QQ to API 平台。它通过 Electron 注入,实现普通账户的无头操作,从而用 OneAPI 的形式提供统一的接口。

安装真的是非常简单了,NapCat 提供了一键安装的脚本,甚至能自动使用 GitHub 镜像。

🚨 警告:不要在境外服务器上搭建 NapCat,否则退登、封号等问题后果自负。其实词元都不建议在公网服务器上搭建,拿一部树莓派或者旧手机最安全。

1
curl -o napcat.sh https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.sh && sudo bash napcat.sh

安装过程中所有提及的选项全部都选择 y,然后静候安装完成。最后,脚本会给出初始密码,记得保存。

在您的浏览器上打开 http://[YOUR_SERVER_IP]:6099/webui/(记得开防火墙),输入刚刚记下的密码,然后用您的 QQ 小号扫码登录。

QQ 可能会要求新创建的账号实名认证。这是一个看人品的活儿,如果您实在不想实名,就在这儿放弃吧……词元也是被迫验证了一下。

登录之后,大概是这样的:

NapCat 主界面

嗯,花里胡哨。记得关音量,会有一个音乐播放器自动开始播放 😮‍💨

NapCat 实际上可以看成是 QQ 的 API。我们在“网络配置”里添加一个 WebSocket 客户端,供待会儿 AstrBot 连接。

添加 WebSocket 客户端

这里注意,一是要添加 /ws 后缀;二是不要选择其他端口,因为待会儿 AstrBot 是使用 Podman 运行的,只能使用映射的端口范围。如果您选择其他端口,请确保您理解。

🤖 AstrBot

由于使用了容器化技术,AstrBot 的安装也非常简单。

首先,安装 Podman。这主要是因为 Podman 在大部分 Linux 发行版中都有打包,不需要费神安装。

1
2
sudo apt install podman podman-docker podman-compose # 如果不使用 podman-docker,以下命令需要修改套接字名称
sudo systemctl enable --now podman.socket

然后拉取镜像:

1
2
3
4
mkdir astrbot
cd astrbot
mkdir data
sudo podman run -itd -p 6180-6200:6180-6200 -p 11451:11451 -v $PWD/data:/AstrBot/data -v /var/run/docker.sock:/var/run/docker.sock -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro --name astrbot soulter/astrbot:latest

如果您无法正常访问 Docker Hub,可以用镜像,使用方法您可以在网上搜索一下。

完成之后,可以通过 http://[YOUR_SERVER_IP]:6180 访问 AstrBot 的管理界面,初始用户名和密码都是 astrbot

AstrBot 主界面

然后在消息平台设置中添加一条:

添加消息平台

这样,NapCat 与 AstrBot 的连接就搞定了。

⚙️ 配置 AstrBot

在 AstrBot 的服务提供商设置中,添加一条,输入我们刚刚获得的代理地址和 API 密钥。

添加服务提供商

AstrBot 有丰富的插件、设置、权限等功能,您可以自行探索,这里不再赘述。

⬆️ 更新

NapCat 有内建的更新命令:

1
sudo napcat update

AstrBot 则需要重新拉取镜像,但是配置文件保存在宿主机,不会丢失:

1
2
3
4
sudo podman stop astrbot
sudo podman rm astrbot
sudo podman pull soulter/astrbot
# 然后重复以上启动命令即可

🤔 重大更新

词元最近看到 NapCat 有了官方构建的 Docker 镜像。词元很喜欢把什么东西都容器化,所以写了以下 Compose 供您参考:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
services:
  napcat:
    environment:
      - "NAPCAT_UID=${NAPCAT_UID}"
      - "NAPCAT_GID=${NAPCAT_GID}"
      - "TZ=Asia/Shanghai"
    ports:
      - "3000:3000"
      - "3001:3001"
      - "6099:6099"
    volumes:
      - "./ntqq:/app/.config/QQ"
      - "./napcat:/app/napcat/config"
    container_name: napcat
    restart: always
    image: docker-0.unsee.tech/mlikiowa/napcat-docker:latest

  astrbot:
    environment:
      - "TZ=Asia/Shanghai"
    ports:
      - "6185:6185"
      - "6199:6199"
    volumes:
      - "./data:/AstrBot/data"
      - "/var/run/docker.sock:/var/run/docker.sock"
    container_name: astrbot
    restart: always
    image: docker-0.unsee.tech/soulter/astrbot:latest

🔔 下课!

快把你的机器人拉进群里炫耀一下吧。注意 Gemini 的限制较低,当心 NSFW 内容和侮辱性语言输出。封号了可别怪词元。

Banner