2026-09-30 · 原文发布日
n8n:LINE 植物养护助手,拍照识别加问答
把 LINE 官方账号变成植物管家:webhook 收到图片消息时下载照片,结合 n8n Data Tables 里该用户的当前植物、语言偏好和近期对话,交给 Google Gemini 识别品种、判断可见的健康症状与成因并给养护建议;认出是新植物就建档并设为当前植物,不确定则请用户补拍。文字消息则读取当前植物与观察记录生成上下文回复。分析结果存为观察记录,对话历史也入库,仅用户明确要求时才切换语言。
原文要点
来源是一个免费n8n模板:LINE Messaging API webhook 收消息后按图片/文字分流;图片从 LINE content API 下载,连同 n8n Data Tables 中该用户的当前植物、语言偏好、近期对话一起交给 Google Gemini 识别品种、可见健康症状、成因与养护建议。匹配现有植物则保留身份,新植物则建档并设为当前,不确定则请用户补拍;分析存为观察记录。文字消息读取当前植物、观察记录与对话史生成上下文回复,仅在用户明确要求时切换保存的语言。Setup 要求 LINE 官方账号开通 Messaging API、webhook 指向 plantcare-line-webhook、LINE channel access token 用 HTTP Header Auth 凭据、Google Gemini 凭据,并建 plant_users、plants、plant_observations、conversations 四张 Data Tables。
这次做成什么
在自托管或云端 n8n 上复现这条流程的核心:用一个练习版 LINE 植物助手,做到发照片能识别并建档、发文字能基于当前植物上下文回答,并用 Data Tables 落库。本站提供可直接粘贴的识别提示词与建表配置。
准备什么
- 一个 n8n 实例(1.x 版本,已开通 Data Tables 功能)
- LINE 官方账号并在 LINE Developers 控制台开通 Messaging API、拿到 channel access token
- Google AI Studio 的 Gemini API key
- 可用的 HTTPS 公网地址(如 n8n cloud 或隧道)用于配置 LINE webhook
- 四张空 Data Tables:plant_users、plants、plant_observations、conversations
具体怎么做
建四张 Data Tables
在 n8n 左侧 Data tables 里新建 plant_users(列:line_user_id 文本、active_plant_id 文本、preferred_language 文本)、plants(列:plant_id 文本、line_user_id 文本、name 文本、species 文本、created_at 文本)、plant_observations(列:plant_id 文本、observed_at 文本、symptoms 文本、advice 文本、confidence 数字)、conversations(列:line_user_id 文本、role 文本、message 文本、created_at 文本)。记下每张表的 ID,后面每个 Data Table 节点都要选对。
配 webhook 与消息分流
新建工作流,加 Webhook 节点,路径设为 plantcare-line-webhook、方法 POST、响应模式设为用后续节点响应。复制生产 URL,到 LINE Developers 控制台的 Messaging API 设置里填为 Webhook URL 并启用。webhook 后加 If 节点,判断 {{$json.body.events[0].message.type}} 是否等于 image,走图片分支与文字分支。
图片分支:下载照片并组装上下文
图片分支加 HTTP Request 节点,方法 GET,URL 为 https://api-data.line.me/v2/bot/message/{{$json.body.events[0].message.id}}/content,认证选预置的 Header Auth(名 Authorization,值 Bearer 加你的 channel access token),响应格式选 File。再加 Data Table 节点查 plant_users 里 line_user_id 等于 {{$json.body.events[0].source.userId}} 的行,取出 active_plant_id 与 preferred_language,并查 conversations 取该用户最近几条记录。
调用 Gemini 识别并处理三种结果
加 Google Gemini 节点,凭据用 PaLM/Gemini API key,选支持图片输入的模型,把上一步的图片二进制与下面的识别提示词一起传入,要求返回 JSON。随后加 Switch 节点按返回的 status 分流:match 保持原 active_plant_id;new_plant 用 Data Table 节点向 plants 插入一行并把 plant_users 的 active_plant_id 更新为新 plant_id;uncertain 不改库,只回复请用户补拍清晰的整株和叶片照片。match 与 new_plant 都要向 plant_observations 插入一条观察记录。
回复 LINE 与文字问答分支
各分支末端加 HTTP Request 节点 POST 到 https://api.line.me/v2/bot/message/reply,同样用 Header Auth,body 为 {"replyToken":"{{$json.body.events[0].replyToken}}","messages":[{"type":"text","text":"..."}]},text 里拼接识别摘要与置信度。文字分支则先查当前植物、最近观察与对话史,把用户文本和上下文一起发给 Gemini 生成回复,再把用户与助手两条消息插入 conversations。只有用户在消息里明确要求换语言时,才更新 plant_users.preferred_language。
用测试事件验证
先用 LINE Developers 控制台的 webhook 测试或真实加好友发一张植物照片,在 n8n 执行记录里逐步检查:图片是否下载成功、Gemini 返回 JSON 是否解析出 status、plants 表是否新增、reply 是否 200。再发一条文字问题确认文字分支读取了当前植物。
可直接复制的材料
植物识别提示词(图片分支,可直接粘贴)
本站独立编写,双花括号处由上游节点数据替换;不确定时要求补拍的回复文案也需自行在回复节点写好。
你是一位严谨的室内植物养护助手。用户语言偏好为:{{preferred_language}}。该用户当前登记的植物是:{{active_plant_name}}(品种:{{active_plant_species}})。近期对话摘录:{{recent_history}}。
请分析随附的植物照片,只输出 JSON,不要输出其他文字,格式如下:
{"status":"match|new_plant|uncertain","plant_name":"常见中文名","species":"学名或品种名,不确定写 null","symptoms":["可见症状1","可见症状2"],"likely_causes":["可能成因1"],"care_advice":["具体可执行建议1","具体可执行建议2"],"confidence":0到1之间的小数}
判定规则:
1. 照片特征与当前登记植物一致时 status 为 match;明显是另一种植物时为 new_plant;照片模糊、只有局部、无法判断时为 uncertain。
2. 只描述照片中实际可见的症状,不要臆测看不到的问题。
3. care_advice 必须具体,例如“暂停浇水至表层土下2厘米干燥”,不要写“注意浇水”这类空话。
4. 全部文字内容使用用户的语言偏好书写。文字问答提示词(文字分支,可直接粘贴)
本站独立编写;下游需加一个判断 LANG_CHANGE 行是否存在的小逻辑再决定是否更新 preferred_language。
你是用户的植物养护助手。用户当前植物:{{active_plant_name}}({{active_plant_species}})。最近观察记录:{{recent_observations}}。近期对话:{{recent_history}}。用户语言偏好:{{preferred_language}}。
用户说:{{user_message}}
要求:
1. 结合当前植物与历史观察作答,不要泛泛而谈;若信息不足,说明需要用户补一张什么角度的照片。
2. 仅当用户在本条消息里明确要求切换语言时,在回复末尾单独输出一行 LANG_CHANGE:目标语言代码,否则不要输出该行。
3. 回复控制在300字以内,口语化、可直接发到 LINE 聊天里。输入与输出示例
本站虚构演示,未实际调用 Gemini 或 LINE,返回内容仅为结构示意。
输入
练习事件(虚构):LINE 用户 U1234abcd 发来一张绿萝照片,此前 plant_users 中其 active_plant_id 为空、preferred_language 为 zh,conversations 无记录。对应输出
Gemini 节点解析出的 JSON 示意:{"status":"new_plant","plant_name":"绿萝","species":"Epipremnum aureum","symptoms":["下部两片叶尖发黄"],"likely_causes":["浇水偏勤或盆土排水不畅"],"care_advice":["暂停浇水,待表层土下2厘米干燥后再浇","将花盆移到明亮散射光处"],"confidence":0.82}。随后 plants 表新增一行 plant_id=plt-0001、LINE 回复为“认出这是绿萝(置信度0.82)……”,plant_users.active_plant_id 更新为 plt-0001。做完检查这些
- 在 LINE 里发植物照片后,n8n 执行记录中 HTTP 下载节点输出二进制文件而非报错
- Gemini 节点输出能解析出 status、confidence 等字段,且新植物时 plants 表出现新行且 plant_users.active_plant_id 被更新
- 发文字消息后,回复内容引用了当前植物名称,且 conversations 表新增用户与助手各一行
- 用户未提换语言时 preferred_language 保持不变,明确提出后才更新
容易卡住的地方
- LINE webhook 必须填工作流的生产 URL 并激活工作流,测试 URL 只对单次手动执行有效
- replyToken 只能使用一次且很快过期,前面节点耗时过长会导致回复 400
- 下载图片的接口是 api-data.line.me 而非 api.line.me,域名写错会 404
- Gemini 偶尔会返回带 Markdown 代码块的 JSON,需在解析节点剥离 ```json 包裹
- Data Table 节点选错表 ID 会静默写错表,配置后逐节点核对
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Provide plant care chat and photo analysis with LINE and Google Gemini
- 原作者
- Takahiro Shimizu
- 原始发布日期
- 2026-09-30T07:41:54.922Z
- 来源
- https://n8n.io/workflows/20195