本文目标是解决馒头网站的定期自动登录的问题;防止号养好了,但也没了。。毕竟40天的限期,一不留神就忘了。
直入正题,首先介绍下用到的 docker
工具:
n8n
,一个图形化的低代码自动化流程平台,类似扣子、dify
chromium
,chrome的开源浏览器内核,用来模拟用户操作
clash
梯子,如果没有点这 -> “最便宜的VPN”
cloudflared
,用来解析你的域名
环境部署
环境部署使用 docker compose
方式,具体配置如下。
n8n
services:
n8n:
container_name: n8n
image: n8nio/n8n:latest
ports:
- "5678:5678"
environment:
- N8N_HOST=n8n.wangqiukeke.top # 修改为你自己的域名
- WEBHOOK_URL=https://n8n.wangqiukeke.top # 修改为你自己的域名,注意格式保持一致
- N8N_SECURE_COOKIE=false # 新加入的环境变量,默认即可
- GENERIC_TIMEZONE=Asia/Shanghai # 时区
- N8N_PORT=5678
- N8N_DEFAULT_LOCALE=zh-CN # 默认显示中文
- N8N_PROXY_HOPS=1
- N8N_RUNNERS_ENABLED=true
- HTTP_PROXY=http://192.168.3.100:7890 # 修改为你的代理服务,见下文的 clash
- HTTPS_PROXY=http://192.168.3.100:7890
- NO_PROXY=localhost,127.0.0.1
- PUID=0
- PGID=0
volumes:
- ./dist:/usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist # 国际化,教程参考:https://blog.csdn.net/weixin_47831992/article/details/147632297
- ./n8n:/home/node/.n8n # 冒号前面映射n8n-data文件夹绝对路径
- ./n8n-data:/home/node/n8ndata
restart: unless-stopped
chromium
浏览器内核,用来模拟用户的真实输入,具体使用见下文的 n8n puppeteer 配置
services:
chromium:
container_name: chromium
image: ghcr.io/browserless/chromium:latest
ports:
- "3003:3000"
environment:
- GENERIC_TIMEZONE=Asia/Shanghai # 时区
- HTTP_PROXY=http://192.168.3.100:7890 # 代理配置
- HTTPS_PROXY=http://192.168.3.100:7890
- NO_PROXY=localhost,127.0.0.1
- PUID=0
- PGID=0
restart: unless-stopped
clash
安装梯子,不多解释。梯子不仅可以作为 docker
工具的代理,也可以为局域网内的设备提供代理,详情请自行搜索。
如果你还没有便宜的 VPN
的话,我推荐你用 “全网最便宜的VPN”,99一年,每月 100G
流量!
services:
clash:
image: dreamacro/clash-premium:latest
container_name: clash
restart: unless-stopped
# 网络配置
network_mode: host
ports:
- "7890:7890" # HTTP 代理端口
- "7891:7891" # SOCKS5 代理端口
- "9090:9090" # Web 控制面板
# 挂载配置文件和数据目录
volumes:
- ./config:/root/.config/clash
- ./ui:/ui
# 环境变量
environment:
- TZ=Asia/Shanghai
# 健康检查
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:9090"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# DNS 配置
dns:
- 114.114.114.114
- 8.8.8.8
cloudflared
cloudflared 主要功能是将你的域名解析到 nas
上,推荐通过 tunnel
的方式,支持 https
、去除端口,不需要你有独立的 IP
!具体部署教程自行搜索,如果有困难可以留言告诉我。
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
network_mode: host
# 明确指定启动命令
command: tunnel --no-autoupdate run --token 修改为你自己的token!!!
volumes:
- ./cloudflared:/etc/cloudflared
- ./logs:/var/log/cloudflared
environment:
- HTTP_PROXY=http://192.168.3.100:7890 # 推荐使用代理,不然会经常断线
- HTTPS_PROXY=http://192.168.3.100:7890
- NO_PROXY=localhost,127.0.0.1
- TUNNEL_TOKEN=修改为你自己的token!!!
healthcheck:
test: ["CMD-SHELL", "cloudflared tunnel info || exit 1"]
interval: 60s
timeout: 10s
retries: 3
start_period: 30s
复制完记得修改你自己的 token
n8n 工作流搭建
以我的馒头账号为例,注册邮箱是 gmail
,其他账号需要自行测试。

在开始之前,需要为 n8n
安装 n8n-nodes-puppeteer
:点击左下角名字旁边的设置 -> 社区节点 -> 安装。
下面我们开始搭建工作流吧。
1. 添加触发器
1.1 点 +
号,创建一个触发器,选择 按计划
,如图:

1.2 配置你的登录计划,这里配置的是每周五的早10点执行

2. 登录节点
2.1 添加 puppeteer
节点,点 +
号、搜索 puppeteer
并进入,选择 Run Custom Script

2.2 输入下面脚本,将 你的账号
、你的密码
、你的邮箱
修改为你自己的
// Navigate to an IP lookup service
await $page.goto('https://next.m-team.cc/login')
// Perform login
await $page.waitForSelector('#username')
await $page.type('#username', '你的账号')
await $page.type('#password', '你的密码')
await $page.keyboard.press('Enter')
// email
await $page.waitForSelector('#email')
await $page.type('#email', '你的邮箱')
await $page.click('button.ant-btn-default.ant-btn-color-default.ant-btn-variant-outlined')
await $page.waitForNetworkIdle()
// Return the result in the required format
const content = await $page.evaluate(() => document.querySelector('body').innerHTML)
return [{ content }]
2.3 添加 Browser WebSocket EndPoint
,这里的地址和端口见你在环境中安装的 chromium

3. 等待一分钟
等待一分钟,让验证码飞一会儿。添加 wait
节点,配置如下

4. 收取馒头邮件
4.1 添加 GMail
节点,选择 Get many messages

4.2 配置谷歌凭证(按系统引导,自行研究),Limit
填 1,添加 Filters
-> Sender
,输入框中输入:web@m-team.cc

5. 解析验证码
5.1 添加 Code
节点,Mode
选择 Run Once for All Items
,Language
选择 JavaScript
,并输入以下代码
let code = null
const reg = /驗證碼:\s+(\d{6}),/
for (const item of $input.all()) {
const matches = reg.exec(item.json.text)
code = matches?.[1]
}
return { json: { code }}
6. 输入验证码并登录
6.1 与步骤2一样,添加 Puppeteer
自定义脚本节点,输入以下脚本,并替换你的账号信息
// Navigate to an IP lookup service
await $page.goto('https://next.m-team.cc/login')
// Perform login
await $page.waitForSelector('#username')
await $page.type('#username', '你的账号')
await $page.type('#password', '你的密码')
await $page.keyboard.press('Enter')
// email
await $page.waitForSelector('#email')
await $page.type('#email', '你的邮箱')
// 验证码
await $page.type('input.ant-input.ant-input-outlined', $json.code)
// 登录
await $page.click('button.ant-btn-primary.ant-btn-variant-solid.ant-btn-lg')
await $page.waitForNetworkIdle()
// Return the result in the required format
const content = await $page.evaluate(() => document.querySelector('body').innerHTML)
return [{ content }]
6.2 添加 Browser WebSocket Endpoint Option
:ws://192.168.3.100:3003(同步骤2)

如果你成功的做到了这一步,那么恭喜你!配置完成了,点击 执行工作流程
测试下吧!
如果不出意外,你已经成功创建了自动登录的工作流,最后激活一下,点击上方的活动开关并打开:

如果你在某一步出了意外,请留言告诉我,双击点开这个节点,截图发到评论区吧~