n8n从入门到放弃：一个开发者的自动化摸鱼指南
为什么我需要n8n？先说结论：我受够了。受够了每天早上打开电脑，面对：147封未读邮件，其中143封是垃圾5个不同平台的告警通知，3个是同一个问题Slack里@我的消息，一半是"在吗"Jira上又多了几个莫名其妙的ticket作为一个支付系统的开发者，我的日常是这样的：08:30 打开电脑，看邮件 09:00 还在看邮件，试图找到那封重要的 09:30 终于找到了，但已经过期了 10:00 开始处理告警，发现是同一个问题触发了5个告警 10:30 写代码？不存在的，先开个会 ... 18:00 今天又没写几行代码直到我发现了n8n——一个可以自己部署、免费使用、随便折腾的自动化工具。现在我的早晨是这样的：08:30 打开电脑，看n8n帮我整理好的"今日重要邮件摘要" 08:35 瞄一眼"告警聚合报告"，确认没有P0 08:40 开始写代码下面是我的实战配置，拿走不谢。第一步：本地部署（5分钟搞定）别跟我扯什么云服务，我就要自己掌控数据。最简单的部署方式创建一个 docker-compose.yml：version: '3.8' services: n8n: image: n8nio/n8n:latest container_name: n8n restart: always ports: - "5678:5678" environment: - N8N_HOST=localhost - N8N_PORT=5678 - N8N_PROTOCOL=http - NODE_ENV=production - WEBHOOK_URL=http://localhost:5678/ - GENERIC_TIMEZONE=Asia/Dubai - TZ=Asia/Dubai # 执行历史保留7天 - EXECUTIONS_DATA_PRUNE=true - EXECUTIONS_DATA_MAX_AGE=168 volumes: - n8n_data:/home/node/.n8n volumes: n8n_data:然后：docker-compose up -d打开 http://localhost:5678，完事。如果你需要外网访问（接收Webhook）用Cloudflare Tunnel，免费又安全：# 安装cloudflared brew install cloudflared # Mac # 或者 apt install cloudflared # Linux # 登录并创建隧道 cloudflared tunnel login cloudflared tunnel create n8n cloudflared tunnel route dns n8n n8n.yourdomain.com # 运行隧道 cloudflared tunnel run --url http://localhost:5678 n8n这样你就有了一个 https://n8n.yourdomain.com 的公网地址，可以接收GitHub Webhook、邮件通知等。场景一：邮件自动分类+AI摘要这是我最得意的工作流。问题每天100+封邮件，真正重要的可能就5封。人工筛选太浪费时间。解决方案flowchart LR A[📧 IMAP 每5分钟检查] --> B[🔀 Filter 过滤垃圾邮件] B --> C[🤖 Claude API 分析重要性+摘要] C --> D{重要程度?} D -->|🔴 紧急| E[📱 Slack私信 立即通知] D -->|🟡 重要| F[📝 汇总列表 稍后处理] D -->|🟢 普通| G[📁 归档 不打扰]核心配置1. IMAP节点 - 收取邮件协议: IMAP 服务器: imap.gmail.com (或你的邮箱) 端口: 993 检查间隔: 5分钟 只获取未读邮件: true2. AI分析节点 - 用Claude判断重要性这里是关键，我用Claude API来分析邮件：// HTTP Request节点，调用Claude API // Method: POST // URL: https://api.anthropic.com/v1/messages // Headers: { "x-api-key": "{{$credentials.claudeApi.apiKey}}", "anthropic-version": "2023-06-01", "content-type": "application/json" } // Body: { "model": "claude-sonnet-4-20250514", "max_tokens": 500, "messages": [ { "role": "user", "content": "分析这封邮件的重要性。返回JSON格式：{\"level\": \"urgent/important/normal\", \"summary\": \"一句话摘要\", \"action\": \"需要的操作\"}\n\n发件人: {{$json.from}}\n主题: {{$json.subject}}\n内容: {{$json.text.substring(0, 2000)}}" } ] }3. 分流处理根据AI返回的level字段，用Switch节点分流：urgent → 立即Slack通知important → 加入今日待办normal → 静默归档实际效果以前：每天花1小时处理邮件现在：每天花5分钟看AI整理好的摘要省下的时间用来写bug...不对，是修bug。场景二：多平台告警聚合问题我的系统告警来自：Grafana（监控指标）Sentry（错误追踪）AWS CloudWatch（云服务）自建的健康检查脚本每个平台都在喊，同一个问题可能触发5条告警。我的手机一天响200次。解决方案flowchart TB subgraph 告警来源 A1[Grafana Webhook] A2[Sentry Webhook] A3[CloudWatch SNS] A4[自定义脚本] end subgraph n8n处理 B[Webhook接收] --> C[格式标准化] C --> D[去重 相同告警5分钟内只报一次] D --> E[🤖 AI分析 判断严重性+关联性] E --> F{是否需要通知?} end subgraph 通知方式 F -->|是| G[Slack/钉钉 带上下文] F -->|否| H[静默记录 供查询] end A1 --> B A2 --> B A3 --> B A4 --> B去重逻辑（关键！）// Code节点：告警去重 const alertKey = `${$json.source}_${$json.alertName}_${$json.host}`; const cacheKey = `alert_${alertKey}`; // 检查5分钟内是否已经发过 const lastAlert = await this.helpers.cache.get(cacheKey); const now = Date.now(); if (lastAlert && (now - lastAlert) < 5 * 60 * 1000) { // 5分钟内已发过，跳过 return []; } // 记录本次告警时间 await this.helpers.cache.set(cacheKey, now, 10 * 60 * 1000); return [{ json: { ...$json, dedupKey: alertKey, isNew: true } }];AI告警分析让AI帮你判断告警的真实严重性：// 发送给Claude的prompt const prompt = `你是一个DevOps专家。分析这个告警： 告警名称: ${$json.alertName} 来源: ${$json.source} 主机: ${$json.host} 描述: ${$json.description} 指标值: ${$json.value} 请返回JSON： { "severity": "P0/P1/P2/P3", "needsImmediate": true/false, "possibleCause": "可能原因", "suggestedAction": "建议操作" }`;告警消息模板🚨 **{{$json.severity}} 告警** **来源**: {{$json.source}} **主机**: {{$json.host}} **告警**: {{$json.alertName}} **AI分析**: - 可能原因: {{$json.possibleCause}} - 建议操作: {{$json.suggestedAction}} {{$json.needsImmediate ? '⚠️ 需要立即处理！' : '📋 可稍后处理'}}场景三：GitHub + CI/CD 通知优化问题GitHub通知太多了：有人给你的PR点了个赞 → 通知CI跑过了 → 通知有人在PR里回复了"ok" → 通知有人把你的PR合并了 → 通知我只想知道：需要我做什么？解决方案flowchart LR A[GitHub Webhook] --> B{事件类型} B -->|PR Review 请求| C[🔴 立即通知] B -->|CI 失败| D[🔴 立即通知] B -->|PR 被合并| E[🟢 汇总通知] B -->|评论/点赞| F[📁 静默归档] C --> G[Slack @你] D --> G E --> H[每日汇总]GitHub Webhook过滤逻辑// 只关心这些事件 const importantEvents = { 'pull_request_review': (data) => data.action === 'submitted' && data.review.state === 'changes_requested', 'pull_request': (data) => data.action === 'review_requested' && data.requested_reviewer?.login === 'YOUR_USERNAME', 'check_suite': (data) => data.action === 'completed' && data.check_suite.conclusion === 'failure', 'issue_comment': (data) => data.comment.body.includes('@YOUR_USERNAME') }; const eventType = $json.headers['x-github-event']; const shouldNotify = importantEvents[eventType]?.($json.body); if (!shouldNotify) { return []; // 不重要的事件，直接丢弃 } return [{ json: $json.body }];场景四：AI辅助日报生成作为开发者，最烦的事情之一就是写日报/周报。工作流flowchart LR A[⏰ 每天下午5:30] --> B[📊 收集数据] B --> C[Git Commits] B --> D[Jira 完成的任务] B --> E[Slack 重要讨论] C --> F[🤖 Claude 生成日报] D --> F E --> F F --> G[📝 发送到你的邮箱 或者Notion]数据收集Git Commits（今天的）：// 调用GitHub API获取今天的commits const today = new Date().toISOString().split('T')[0]; const url = `https://api.github.com/repos/${owner}/${repo}/commits?author=${username}&since=${today}T00:00:00Z`;Jira完成的任务：// Jira JQL查询 const jql = `assignee = currentUser() AND status changed to "Done" after startOfDay()`;AI生成日报const prompt = `根据以下信息，帮我生成一份简洁的工作日报： 今日Git提交: ${commits.map(c => `- ${c.message}`).join('\n')} 完成的Jira任务: ${jiraTasks.map(t => `- [${t.key}] ${t.summary}`).join('\n')} 要求： 1. 用第一人称 2. 突出完成的成果 3. 提及遇到的问题（如果commit message里有fix/bug相关） 4. 不要废话，控制在200字以内`;输出示例📝 2024-01-15 工作日报 今日完成： • 完成了用户认证模块的重构，将登录响应时间从800ms优化到200ms • 修复了支付回调偶发超时的问题（PAY-1234） • Review了小王的缓存优化PR，已合并 进行中： • IBAN迁移方案设计，预计明天完成文档 明日计划： • 继续IBAN迁移开发 • 参加架构评审会议场景五：我的"老板探测器"好吧这个有点皮，但确实有用。需求当老板在Slack上@我或者给我发邮件时，我希望能第一时间知道，而不是淹没在其他消息里。实现flowchart LR A[Slack Event] --> B{发送者是老板?} B -->|是| C[🔴 高优先级通知 手机推送+声音] B -->|否| D[正常流程]// Slack事件过滤 const bossIds = ['U1234567', 'U7654321']; // 老板们的Slack ID const isBossMessage = bossIds.includes($json.event.user); if (isBossMessage) { return [{ json: { priority: 'CRITICAL', message: $json.event.text, channel: $json.event.channel, alertTitle: '⚠️ 老板找你！' } }]; } return [];然后用Pushover或者Bark发送手机推送，确保你不会错过。我的n8n工作流全景图这是我目前在用的所有自动化：flowchart TB subgraph 输入源 E1[📧 Email] E2[💬 Slack] E3[🐙 GitHub] E4[🚨 告警系统] E5[📋 Jira] end subgraph n8n处理中心 N1[邮件分类+摘要] N2[消息过滤+聚合] N3[PR/CI状态追踪] N4[告警去重+分析] N5[任务状态同步] end subgraph AI能力 AI[🤖 Claude API] end subgraph 输出 O1[📱 重要通知 Slack/手机] O2[📊 每日摘要] O3[📁 自动归档] end E1 --> N1 E2 --> N2 E3 --> N3 E4 --> N4 E5 --> N5 N1 AI N2 AI N4 AI N1 --> O1 N1 --> O2 N2 --> O1 N3 --> O1 N4 --> O1 N4 --> O2 N5 --> O3实用技巧：与AI工具的最佳组合Claude API调用模板我封装了一个可复用的HTTP Request配置：// 保存为"Claude分析"模板，随时复用 // URL: https://api.anthropic.com/v1/messages // Method: POST // Headers { "x-api-key": "{{$credentials.claudeApi.apiKey}}", "anthropic-version": "2023-06-01", "content-type": "application/json" } // Body模板 { "model": "claude-sonnet-4-20250514", "max_tokens": 1024, "system": "你是一个专业的{{角色}}。请用简洁的JSON格式回复。", "messages": [ { "role": "user", "content": "{{你的prompt}}" } ] }成本控制技巧AI API是按token收费的，几个省钱技巧：先过滤再调用AI：不是所有数据都需要AI处理限制输入长度：邮件正文截取前2000字符就够了缓存结果：相同输入不要重复调用用小模型处理简单任务：分类任务用Haiku就够了// 成本优化示例：根据任务复杂度选择模型 const model = taskComplexity === 'simple' ? 'claude-haiku-4-5-20251001' // 便宜 : 'claude-sonnet-4-20250514'; // 贵但强踩坑备忘录坑1：Webhook收不到请求症状：GitHub/Slack的Webhook死活收不到原因：你的n8n在内网，外面访问不到解决：用Cloudflare Tunnel（前面讲了）或者ngrok坑2：定时任务不准症状：设置了每天9点执行，结果凌晨1点执行原因：时区没设对解决：确保设置了 GENERIC_TIMEZONE 和 TZ坑3：工作流莫名其妙停了症状：工作流显示Active，但就是不执行原因：容器重启后Webhook地址变了解决：用固定的 WEBHOOK_URL 环境变量坑4：AI返回格式不稳定症状：让AI返回JSON，有时候带`json标记，有时候不带解决：在prompt里强调，然后后处理时清理// 清理AI返回的JSON let response = $json.content[0].text; response = response.replace(/```json\n?/g, '').replace(/```\n?/g, ''); return JSON.parse(response);总结：值不值得折腾？投入时间：大概一个周末搭建+调试收益：每天节省1-2小时处理邮件/告警的时间不再错过重要消息不再被垃圾消息打扰周报/日报自动生成最大的收获：心智负担减轻了。以前我需要时刻惦记着：邮件看了吗？告警处理了吗？PR review了吗？现在我知道：真正重要的事情，n8n会通知我。没通知的，就是不重要的。这种确定感，比节省的时间更有价值。最后的最后有人可能会说：你花这么多时间搞自动化，还不如直接处理那些邮件呢。我的回答是：程序员花3小时写脚本来自动化一个10分钟的任务，不是因为效率，是因为那10分钟太TM无聊了。好了，我要去看看n8n帮我整理的今日摘要了。如果没什么重要的，就继续摸鱼...不对，是继续学习。祝各位自动化愉快！🎉本文属于「从入门到放弃」系列第N篇。如果这篇对你有帮助，说明你还没放弃；如果没帮助，说明你可能需要的是放弃。
(注意，该github项目代码已被作者删除，官网也无法打开)Auto.js是啥Auto.js 是一款基于JavaScript 编写的 Android 自动化工具，可以用于模拟用户操作，比如点击、滑动、输入文本等等，还可以获取屏幕截图、录制视频等等。Auto.js 的优点是简单易学、脚本编写方便，可以实现多种自动化任务，如自动化测试、自动化签到、自动化刷分、自动化挂机等等。此外，Auto.js 还支持插件化开发，可以自由扩展功能。由于Auto.js使用的是无障碍组件，大部分功能都不需要手机root，这带来了很大方便，他适用的范围覆盖快捷(shortcut)，而且更为强大。Autojs原理本篇以2个例子来指导AutoJs脚本的编写，让我们进入正题。自动签到在生活当中，有很多app需要每天签到、早起签到，如果当日或限定时间段未完成签到，可能还会触发惩罚。笔者就有过这种惨痛经历，一个月辛苦早起签到，不小心有一天起晚了没签成功然后奖励都被扣除了，而AutoJs可以完美得帮助我们解决这个痛点。# 比亚迪app每日早起签到脚本 “咸鱼之王”游戏挂机很多小程序游戏现在都是挂机类的，需要极少量的操作即可，而Autojs可以为我们完成这部分极少量的操作。“咸鱼之王”（以下简称咸鱼）里面比较多的操作是日常任务和抢/收罐子，这里我们看AutoJs如何自动帮我们完成日常任务。# 咸鱼之王日常任务完成 # 自动招募 # 福利领取 # 好友金币 # 黑市购买 # 自动开宝箱 # 分享游戏 # 点金*3 # 自动完成任务 关于AutoJs的后续相关资料：解放双手神器-autojsAuto.js脚本开发教程Auto.js Github仓库[Auto.js应用下载地址]()