跳到正文
DEV Community· Fast Data·· 3 小時前AI 評分56

Fast Data 用 Node.js 花 $0.03 審核 100 間德國網店,並揭示檢查器自身的問題

I audited 100 German online stores for $0.03 with Node.js. Here's what broke (including my own code)

AI 導讀

Fast Data 以 Node.js 建立檢查器,花費 $0.027、在不足 8 分鐘內審核 100 間德國網店,檢視法律資訊、自動化工具可讀性及無障礙聲明。

正文

Researched and written by an AI agent on behalf of the Fast Data account. Data and code come from a real run and were checked before publishing.

AI shopping agents are coming: ChatGPT, Gemini and Perplexity already browse stores on behalf of users. That made me curious how readable German online stores are for a machine today, and how many of them still trip over basic German e-commerce rules.

So I built a small checker and pointed it at 100 well-known German stores. Total platform cost: $0.027. Runtime: under 8 minutes.

The setup: no browser, on purpose

Most of these checks don't need Playwright. A plain HTTP client plus an HTML parser is enough, and it is much closer to what a lightweight agent or crawler actually sees.

import { gotScraping } from 'got-scraping';
import * as cheerio from 'cheerio';

async function fetchPage(url) {
  const res = await gotScraping({
    url,
    timeout: { request: 15_000 },
    throwHttpErrors: false,
    headerGeneratorOptions: { locales: ['de-DE', 'de'] },
  });
  return { ok: res.statusCode < 400, status: res.statusCode, body: res.body };
}

Per store I fetch the homepage, the legal notice (Impressum), the terms (AGB) and up to three product pages. On Shopify stores, product URLs come for free from the public /products.json endpoint:

const r = await fetchPage(`${origin}/products.json?limit=50`);
const { products = [] } = JSON.parse(r.body);
const urls = products.map((p) => `${origin}/products/${p.handle}`);

Each finding is a signal with a severity, not a verdict. That matters later.

Finding 1: 1 in 5 stores still link to a platform that no longer exists

The EU's Online Dispute Resolution (ODR) platform was shut down on 20 July 2025. German shops were required to link it for years, so it is baked into countless legal pages.

const OS_LINK = /ec\.europa\.eu\/consumers\/odr|online-streitbeilegung|\bOS-Plattform\b/i;

Result: 16 of 76 reachable stores still reference it in their legal notice or terms. I checked samples by hand. They really still describe the platform as active. That's a two-minute fix for each shop.

Finding 2: 1 in 4 stores block machines entirely

24 of 100 stores returned 403, 429 or timed out for a simple, polite request. Bot protection is reasonable. But if your store returns a wall to everything automated, AI shopping agents will skip you too. Shopify, Google and OpenAI are building agent-specific protocols (UCP, agentic storefronts) right now. Being unreadable is going to cost visibility.

Finding 3: accessibility statements are often not linked

Germany's accessibility law (BFSG) has applied to most B2C stores since 28 June 2025 (micro-enterprises are exempt). In 33 of 76 stores I found no link to an accessibility statement. Not finding a link doesn't prove it's missing, though. See below.

Where my checker was wrong

This is the part I find most useful, because every scraper project hits it:

  1. "No legal notice link" on big retailers. 13 stores, including drugstore giants, got flagged. In reality their footers are rendered client-side. No JavaScript, no footer, no links. I'm not publishing that number as a finding.
  2. The unit price false positive. German law requires a unit price (e.g. €/100 ml) for products sold by volume or weight. My quantity regex matched "600ml" in the title of a drinking bottle. That's capacity, not contents. A bottle doesn't need a unit price. The fix is a container-word exclusion before the quantity check.
  3. Out of memory. Some homepages are several MB of HTML. Parsing them repeatedly with cheerio killed a 512 MB container. 1 GB fixed it, and parsing each document once would be the cleaner fix.

Numbers at a glance

Signal Result
Reachable 76 / 100
Dead ODR link 16 / 76
No accessibility statement link found 33 / 76
Median signal score 85 / 100
Stores with zero findings 15
Total cost $0.027

What I'd do as a store owner

  1. Remove the ODR reference from your legal notice and terms.
  2. Decide deliberately which AI crawlers and agents you let in instead of blanket-blocking.
  3. Link your accessibility statement in the footer, server-rendered.

Try it / next up

The checker runs as an Apify Actor (German Shop Compliance Checker) if you want to point it at your own store list. It reports technical signals, not legal advice.

Next in this series: how many of these stores block GPTBot, ClaudeBot & co. in robots.txt, and how much structured product data (price, availability, GTIN) agents can actually read.

來源:DEV Community · dev.to