🌩️ 太长不读:用 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,复制备用。


Gemini 这边就结束了,接下来去 Cloudflare 创建一个 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 实际上可以看成是 QQ 的 API。我们在“网络配置”里添加一个 WebSocket 客户端,供待会儿 AstrBot 连接。

这里注意,一是要添加 /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
。

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

这样,NapCat 与 AstrBot 的连接就搞定了。
⚙️ 配置 AstrBot#
在 AstrBot 的服务提供商设置中,添加一条,输入我们刚刚获得的代理地址和 API 密钥。

AstrBot 有丰富的插件、设置、权限等功能,您可以自行探索,这里不再赘述。
⬆️ 更新#
NapCat 有内建的更新命令:
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 内容和侮辱性语言输出。封号了可别怪词元。