AI PLAY玩法更新持续收录
← 回到更新流

2026-10-06 · 原文发布日

盯Vinted上新,低于市价的好货自动推Discord

n8n模板:在Google Sheet里每行维护一个搜索,每15分钟用Apify以增量模式抓Vinted新上架,见过的商品不重复计费。每次结果先记入History表,再用该搜索近14天的真实中位价判断是否真的便宜,按低于中位价幅度、成色、卖家评分算deal分;可选的OpenAI步骤过滤假货、破损、缺尺码的listing。低于中位价三成以上立刻推Discord,一两成的进每日早八点摘要。

原文要点

这是一个n8n模板:Google Sheet的Searches表每行存一个Vinted搜索(含各自Discord webhook),每15分钟以增量模式调用Apify的vinted-listing-lookup,已见商品不重复计费也不重复提醒。每个商品先写入History表,再用该搜索近14天记录算中位价,按低于中位价幅度、成色权重、可选卖家评分算deal分。低30%以上即时推Discord,10-29%进每日早8点摘要。OpenAI假货/破损/缺尺码过滤默认接好但凭据为空,不加key就安全跳过。连续三次失败会标记needs attention并一次性告警。

这次做成什么

在本站练习方案里,我们先不上真Apify抓数据,而是用三条合成Vinted商品CSV走一遍‘历史表→14天中位价→deal分→路由’的判定逻辑,并配好Searches表结构与OpenAI红旗过滤提示词,练熟后再接真实模板。这是本站独立设计的中位价判定练习,原模板的Apify actor参数和n8n节点细节需在模板页核对。

准备什么

  • 一个n8n实例(云端或自托管),能创建Google Sheets节点
  • 一个Google账号和新建的空Google Sheet
  • 一个Discord频道管理权限,用于创建webhook
  • 可选:Apify免费账号token、OpenAI API key(练习阶段可都不要)

具体怎么做

  1. 建三表结构的Google Sheet

    新建一个Sheet,建三个标签页:Searches、History、Digest。Searches表头依次为searchInput, country, maxPrice, conditions, brands, discordWebhook, active, failCount, status;History表头为searchLabel, listingId, title, price, priceEur, currency, condition, country, url, imageUrl, discordWebhook, checkedAt;Digest表头为searchLabel, title, priceEur, dealScorePct, medianPriceEur, url, imageUrl, discordWebhook, checkedAt。先按下面材料里的合成CSV手工填入History三行历史数据和一个Searches行。

  2. 在n8n里复刻判定练习流

    建一个新工作流:Manual Trigger→Google Sheets读History→Code节点。Code节点中筛选同一searchLabel且checkedAt在近14天内的行,取priceEur排序后取中位(偶数条取中间两条均值),再对每条候选新商品计算discountPct=(median-price)/median*100,乘以成色权重(本站练习设定:new=1.1, very_good=1.0, good=0.9),得到dealScorePct。Switch节点分三路:>=30进'即时推送'分支,10-29进'摘要队列'分支写Digest表,<10仅写History。

  3. 接Discord推送

    在Discord频道设置→Integrations→Webhooks→New Webhook复制URL,粘贴到Searches行的discordWebhook列。即时分支用HTTP Request节点POST到该URL,body含embeds:标题、价格、中位价、折扣百分比、商品链接和imageUrl缩略图。摘要分支由每天8:00的Schedule Trigger驱动,读Digest表当天记录拼成一条消息发出后清空已发记录。

  4. 可选接OpenAI红旗过滤

    在Switch之前插入OpenAI Chat Model节点,用下面材料的提示词对title+description判定是否疑似假货、replica、破损、for parts或缺尺码,返回JSON {"flagged":true/false,"reason":"..."}。IF节点只放行flagged为false的商品;提示词要求无法判定时返回flagged:false,保证凭据缺失或回复异常时流程不中断。

可直接复制的材料

Searches表合成行与History合成历史数据(CSV)

本站虚构练习数据;discordWebhook要换成你自己的URL,真实模板用Apify自动写History,练习阶段手工填即可。

Searches行:
searchInput,country,maxPrice,conditions,brands,discordWebhook,active,failCount,status
vintage levis 501,FR,80,"new,very_good,good",Levi's,https://discord.com/api/webhooks/REPLACE_WITH_YOUR_WEBHOOK,yes,0,ok

History行(searchLabel=vintage levis 501,近14天,EUR):
searchLabel,listingId,title,price,priceEur,currency,condition,country,url,imageUrl,discordWebhook,checkedAt
vintage levis 501,9001,Levi's 501 vintage W32,45,45,EUR,very_good,FR,https://www.vinted.fr/items/9001,https://example.com/img1.jpg,https://discord.com/api/webhooks/REPLACE,2026-09-28T08:00:00Z
vintage levis 501,9002,Levi's 501 bleu W34,52,52,EUR,good,FR,https://www.vinted.fr/items/9002,https://example.com/img2.jpg,https://discord.com/api/webhooks/REPLACE,2026-10-01T08:00:00Z
vintage levis 501,9003,Levi's 501 noir W30,38,38,EUR,very_good,FR,https://www.vinted.fr/items/9003,https://example.com/img3.jpg,https://discord.com/api/webhooks/REPLACE,2026-10-04T08:00:00Z

OpenAI红旗过滤提示词(可粘贴)

本站独立编写的示例提示词,非原模板原文;{{ $json.title }}是n8n表达式写法,字段名按你实际数据调整。

你是二手平台商品质检员。阅读下面的商品标题和描述,判断它是否属于以下任一情况:疑似假货或replica(复刻)、明显破损、标注为for parts/配件机、缺少尺码信息导致无法判断是否可穿。
只返回JSON,不要多余文字:{"flagged": true 或 false, "reason": "一句话中文原因"}
如果你无法确定,或描述信息不足,一律返回 {"flagged": false, "reason": "信息不足,默认放行"}。

商品标题:{{ $json.title }}
商品描述:{{ $json.description }}

deal分计算Code节点逻辑说明

成色权重与30/10阈值是本站练习设定,原模板默认HOT=30%、GOOD=10%可在Switch节点改;卖家评分权重需开启actor的includeDetails才有数据。

// 本站练习用伪代码逻辑(在n8n Code节点选JavaScript)
// 输入:historyRows = 本搜索近14天历史,candidate = 新商品
const prices = historyRows.map(r => r.priceEur).sort((a,b)=>a-b);
const mid = Math.floor(prices.length/2);
const median = prices.length%2 ? prices[mid] : (prices[mid-1]+prices[mid])/2;
const condWeight = {"new":1.1,"very_good":1.0,"good":0.9}[candidate.condition] ?? 1.0;
const discountPct = (median - candidate.priceEur) / median * 100;
const dealScorePct = discountPct * condWeight;
// 路由:dealScorePct>=30 即时推送;10-29 进Digest;其余只记History

输入与输出示例

本站虚构演示,数字为手算示意,非真实抓取或运行结果。

输入

Searches行搜索vintage levis 501,History近14天三条价格45/52/38 EUR,新进来一条商品:Levi's 501 vintage W33,very_good,售价28 EUR,描述齐全。

对应输出

中位价median=45 EUR;discountPct=(45-28)/45=37.8%;成色权重very_good=1.0,dealScorePct=37.8;>=30进即时推送分支,Discord收到embed:‘Levi's 501 vintage W33 — 28 EUR(近14天中位45 EUR,低37.8%)’附链接和图。OpenAI过滤返回{"flagged":false,"reason":"无明显风险"},不拦截。

做完检查这些

  • History表中位价计算正确:三条45/52/38排序后取中位得45 EUR
  • dealScorePct为37.8的商品走了即时推送分支,而不是进Digest或静默
  • OpenAI凭据留空时工作流能完整跑完,红旗步骤被安全跳过不报错
  • 接入真实模板后验证:让某搜索的数据源连续失败三次,Searches行status变为needs attention,且只收到一条一次性Discord告警(练习流未实现该逻辑)

容易卡住的地方

  • Searches/History/Digest三个表的列名必须和模板逐字一致,否则节点字段映射会全部失效
  • OpenAI节点默认凭据为空是设计行为,不会报错,但也意味着过滤实际没生效,别误以为已开启
  • Delta增量模式依赖actor记录已见商品,第一次跑会抓回一批存量商品,History暴涨属正常
  • Discord webhook泄露等于任何人都能往你频道发消息,练习时也要当密钥保管,不要提交到公开仓库

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Find underpriced Vinted deals with Apify, Google Sheets, OpenAI, and Discord
原作者
Adrian Voss
原始发布日期
2026-10-05T18:41:21.592Z
来源
https://n8n.io/workflows/20485