<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans">
  <title>Nicasia Digital Solutions · 现场笔记</title>
  <link href="https://nicasiadigital.com/zh/notes/feed.xml" rel="self"/>
  <link href="https://nicasiadigital.com/zh/notes"/>
  <id>https://nicasiadigital.com/zh/notes</id>
  <updated>2026-09-30T12:12:25+08:00</updated>
  <author><name>Nicasia Digital Solutions</name></author>
  <entry>
    <title>一栋 10 户，清单就只能有 10：追踪 146 户学到的事</title>
    <link href="https://nicasiadigital.com/zh/notes/what-146-homes-taught-us-about-job-tracking"/>
    <id>https://nicasiadigital.com/zh/notes/what-146-homes-taught-us-about-job-tracking</id>
    <published>2026-09-30T00:00:00+08:00</published>
    <updated>2026-09-30T12:12:25+08:00</updated>
    <summary>一栋 10 户的清单却能选到 50、总数里多算了 76 份根本不存在的活、旧版画面去打新的后台。一座金属加工厂的真实教训。</summary>
    <content type="html">&lt;p&gt;一个房屋项目，146 户：114 户在排屋中间，32 户在转角。每一户要装一套铁件：大门、转角户才有的侧门、栏杆，部分户型还有百叶窗。每一件都要走七个步骤：到现场量尺寸、订钢材、加工、打磨和打胶、喷底漆、安装、收尾补漆。&lt;/p&gt;
&lt;p&gt;工人用手机回报每一步，界面有中文、孟加拉文和缅甸文。工人的应用跑在 Telegram 里，记录存在云端数据库，老板在网页驾驶舱上看得到每一栋、每一户，不用打一通电话。这套系统是我们为自己的金属加工厂做的，一直每天在用。&lt;/p&gt;
&lt;p&gt;2026 年 9 月我们学到的，大多来自四个错误，四个都是我们自己犯的。&lt;/p&gt;
&lt;h2 id=&quot;s1&quot;&gt;一栋 10 户，清单就只能有 10&lt;/h2&gt;
&lt;p&gt;9 月 4 日，老板打开厂内派工那一屏。「几件」的清单写着 1、2、3、4、5、6、8、10、12、20、30、50。他选的那一栋 B12 只有 10 户。那一项是百叶窗，这一栋每一户都要装，所以上限就是 10；换成只有转角户才装的侧门，上限只有 2。&lt;/p&gt;
&lt;p&gt;他问：为什么这个清单不是照数据库算出来的？他说得对。清单要的每一个数字，数据库里本来就有，工人回报完工的那一屏也一直照它在算；只有厂内派工这一屏，用了一份「差不多」的固定清单。&lt;/p&gt;
&lt;p&gt;清单错比画面丑严重得多，因为人会照着它做事。照那一屏开一张 30 件的单，厂里就会切 30 件，钢材也会照 30 件去订。&lt;/p&gt;
&lt;p&gt;当天改了三处：&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;选栋只列出装得下这一项的栋，名字旁边写几户：「B12 · 10」。&lt;/li&gt;&lt;li&gt;件数的上限，照这一栋、这一项在记录里的数字。&lt;/li&gt;&lt;li&gt;后台自己挡掉不可能的单。画面上的清单可能被绕过、可能是旧的，后台是最后一个能说「不行」的地方。&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;我们也把一句话拆成了两句。「算不出来」和「这一项不按户算」，以前在画面上长得一样，上限一格空白。这是两件不同的事，而且后一种很正常：帮别的公司做的活，我们的记录里本来就没有户数。现在画面会说清楚是哪一种。&lt;/p&gt;
&lt;h2 id=&quot;s2&quot;&gt;总数跟件数一样要紧&lt;/h2&gt;
&lt;p&gt;同一天，把每一份清单都拿去跟数据库对了一遍，对出一个更大的数字问题。数据库写百叶窗装在全部 146 户；工程量清单（BQ）是合约自己的数字，写的是 70。差额 76，正好等于 A 型房的数目，而百叶窗只有 B 型房才装。&lt;/p&gt;
&lt;p&gt;就这一格，让工人可以在根本不装百叶窗的房子上回报百叶窗，也让项目的总数里多出 76 份不存在的活。改正之后，项目进度一夜之间从 4.2% 变成 4.7%。没有人做得更快，是总数缩回了真实的数字。&lt;/p&gt;
&lt;p&gt;进度数字要给客户看之前，先拿分母去对工程量清单，再让人看百分比。&lt;/p&gt;
&lt;h2 id=&quot;s3&quot;&gt;两个画面各算各的，迟早会对不上&lt;/h2&gt;
&lt;p&gt;9 月 17 日，另一个项目的一位工人，做完了他那一栋两户里的一户，回报了，却报不了第二户：再点那一栋想加第二户时，画面反而把他已经选的清掉了。后台的数据一直是对的，陷阱在画面里。&lt;/p&gt;
&lt;p&gt;修这个的同时，我们把每个项目都查了一遍有没有同类的陷阱，又找到一个老板没报的。工人的应用和老板的驾驶舱，各自用不同的代码判断一户装哪几样。百叶窗改成只装 B 型之后，应用按「每一户记下的户型」来判断；可是那个 146 户的项目，户型是按整栋记的，所以应用认定 70 户 B 型房一户都不装百叶窗，谁都报不了。驾驶舱那边有一行写死的判断，碰巧给了对的答案，所以看起来一切正常。&lt;/p&gt;
&lt;p&gt;改法是一条规则，两边共用：一栋如果没有按户记户型，每一户就照整栋的户型算。上线之前，我们把驾驶舱对五个按户追踪的项目、每一户的判断全部列出来，一共 2,209 组「哪一户、哪一样」，改前改后对照。变动的只有那 70 户的百叶窗，驾驶舱上的画面一格都没变。那次比对现在成了我们留着用的工具。&lt;/p&gt;
&lt;h2 id=&quot;s4&quot;&gt;旧画面会一直去打新的后台&lt;/h2&gt;
&lt;p&gt;9 月 4 日，后台回传的格式换了样：栋的清单从单纯的名字，改成「名字加户数」，新画面才能印出「B12 · 10」。新画面同时上线，我们也两边一起测过。&lt;/p&gt;
&lt;p&gt;老板手机里跑的却不是新画面。他是从一则旧的 Telegram 讯息点进去的，Telegram 给他的是之前存下来的那一页。旧的那一页把新的回传当文字印出来，他清单上的每一栋都变成了 [object Object]。&lt;/p&gt;
&lt;p&gt;什么都没当掉，所以才危险。我们的测试永远是最新的画面配最新的后台，现场的人不是。Telegram 只有在发出新讯息时，才会换掉那则讯息打开的版本。&lt;/p&gt;
&lt;p&gt;从那以后的规矩：应用已经在读的字段，永远不换形状。新资料放进新字段；新画面读不到新字段，就退回旧的那个，并且说出哪一项它不知道。&lt;/p&gt;
&lt;h2 id=&quot;s5&quot;&gt;买工地追踪系统之前，先问这五件事&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;清单从哪里来？工人和主管点的每一个选项，都应该照你项目的记录，按栋、按户算出来。&lt;/li&gt;&lt;li&gt;挡掉不可能的单的，是后台，还是只有画面？&lt;/li&gt;&lt;li&gt;进度的总数是不是照你的工程量清单算的？图纸和清单对不上时，谁来查？&lt;/li&gt;&lt;li&gt;有人打开旧版应用时，会发生什么事？&lt;/li&gt;&lt;li&gt;它分不分得清「不知道」和「不适用」？&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;现在我们也帮别的公司做这种系统，一样从他们自己的记录开始。&lt;a href=&quot;https://nicasiadigital.com/zh/contact&quot;&gt;私人诊断&lt;/a&gt; 会看你公司里的工作是怎么流动的。&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>ChatGPT、Claude 读得到你的网站吗？一行命令自己查</title>
    <link href="https://nicasiadigital.com/zh/notes/can-ai-assistants-read-your-website"/>
    <id>https://nicasiadigital.com/zh/notes/can-ai-assistants-read-your-website</id>
    <published>2026-09-30T00:00:00+08:00</published>
    <updated>2026-09-30T12:01:25+08:00</updated>
    <summary>我们的 robots.txt 写着欢迎所有爬虫，Cloudflare 却回了 GPTBot 一个 403，还把邮箱对 AI 爬虫藏了起来。各家 AI 爬虫做什么，以及一行命令自己查。</summary>
    <content type="html">&lt;p&gt;2026 年 9 月 19 日，我们用 AI 爬虫的身份打开自己的一个网站。它的 robots.txt 写着欢迎所有爬虫。Googlebot、Bingbot、OAI-SearchBot、PerplexityBot 都拿到了页面；GPTBot、ClaudeBot、CCBot 拿到的却是 Cloudflare 回的 25 个字节纯文字：「Your request was blocked.」&lt;/p&gt;
&lt;p&gt;9 月 30 日，我们在这个网站 nicasiadigital.com 上又发现一个更不起眼的缺口：每个爬虫都打得开页面，但页面上的邮箱，到了它们手里变成「[email protected]」。&lt;/p&gt;
&lt;p&gt;这两个设定都不是我们打开的，都是 Cloudflare 自带的。用浏览器看网站，两个都看不出来：浏览器拿得到页面，也会执行那段把邮箱还原的脚本。&lt;/p&gt;
&lt;h2 id=&quot;s1&quot;&gt;每个爬虫各做什么&lt;/h2&gt;
&lt;p&gt;做 AI 助手的公司，每家都不只一个爬虫，每个爬虫喂的东西不一样。挡掉一个，可能损失很大，也可能毫无影响，要看挡的是哪一个。下表整理自各家公司自己的说明文件（2026 年 9 月）。&lt;/p&gt;
&lt;div class=&quot;tablewrap&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;爬虫&lt;/th&gt;&lt;th&gt;公司&lt;/th&gt;&lt;th&gt;读你的网站做什么&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;OAI-SearchBot&lt;/td&gt;&lt;td&gt;OpenAI&lt;/td&gt;&lt;td&gt;让你的页面出现在 ChatGPT 搜索的回答里&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPTBot&lt;/td&gt;&lt;td&gt;OpenAI&lt;/td&gt;&lt;td&gt;训练以后的模型&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ChatGPT-User&lt;/td&gt;&lt;td&gt;OpenAI&lt;/td&gt;&lt;td&gt;用户叫 ChatGPT 打开某一页时，由它去打开&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Claude-SearchBot&lt;/td&gt;&lt;td&gt;Anthropic&lt;/td&gt;&lt;td&gt;改进 Claude 的搜索结果&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ClaudeBot&lt;/td&gt;&lt;td&gt;Anthropic&lt;/td&gt;&lt;td&gt;训练以后的模型&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Claude-User&lt;/td&gt;&lt;td&gt;Anthropic&lt;/td&gt;&lt;td&gt;用户叫 Claude 打开某一页时，由它去打开&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PerplexityBot&lt;/td&gt;&lt;td&gt;Perplexity&lt;/td&gt;&lt;td&gt;在 Perplexity 的回答里列出并链接网站；Perplexity 说它不拿这些来训练&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Perplexity-User&lt;/td&gt;&lt;td&gt;Perplexity&lt;/td&gt;&lt;td&gt;回答问题途中打开页面；它一般不理会 robots.txt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Google-Extended&lt;/td&gt;&lt;td&gt;Google&lt;/td&gt;&lt;td&gt;只是 robots.txt 里的一个名字，背后没有爬虫：它决定 Gemini 能不能拿你的页面来训练、来支撑回答&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CCBot&lt;/td&gt;&lt;td&gt;Common Crawl&lt;/td&gt;&lt;td&gt;一个公开的网页档案库，AI 公司拿它训练过模型&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;说明文件里最要紧的是两点。OpenAI 写明：挡掉 OAI-SearchBot 的网站，不会出现在 ChatGPT 搜索的回答里；挡掉 GPTBot，只是让页面不进训练。Google 写明：Google-Extended 不影响 Google 搜索。&lt;/p&gt;
&lt;p&gt;所以 9 月那个网站，ChatGPT 搜索其实还读得到，因为 OAI-SearchBot 进得来。我们损失的是训练这一块：下一代模型对这个网站会知道得更少。&lt;/p&gt;
&lt;h2 id=&quot;s2&quot;&gt;在自己的电脑上测&lt;/h2&gt;
&lt;p&gt;下面这段命令用每个爬虫的名字去打开你的首页，印出状态码。Mac 的终端机和 Linux 都能直接跑；Windows 用 Git Bash。把网址换成你的。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for b in Googlebot bingbot GPTBot \
    OAI-SearchBot ChatGPT-User ClaudeBot \
    Claude-SearchBot Claude-User \
    PerplexityBot CCBot; do
  echo &amp;quot;$b $(curl -s -o /dev/null \
    -w &amp;#x27;%{http_code}&amp;#x27; -A \
    &amp;quot;Mozilla/5.0 (compatible; $b/1.0)&amp;quot; \
    https://www.example.com/)&amp;quot;
done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;9 月 30 日马来西亚时间 11:05，nicasiadigital.com 对这十个名字全部回 200。200 表示爬虫拿到了页面；403 或 503 表示网站前面有东西把它挡了，不管 robots.txt 怎么写。不想开终端机的话，&lt;a href=&quot;https://nicasiadigital.com/zh/tools/ai-crawler-check&quot;&gt;我们的免费爬虫检测&lt;/a&gt;在网页上就能跑同样的测试，连同这篇文章后面几项检查。&lt;/p&gt;
&lt;p&gt;这个测法有一个局限：名字是从你的电脑送出去的，有些防火墙还会查请求从哪里来，所以真正的爬虫可能被另外对待。看到 200，算是好消息；看到 403，一定要追：我们 9 月那次的 403，对应的正是一个连真爬虫也会挡掉的设定。&lt;/p&gt;
&lt;h2 id=&quot;s3&quot;&gt;Cloudflare 的开关在哪里&lt;/h2&gt;
&lt;p&gt;从 2025 年 7 月 1 日起，每个新加入 Cloudflare 的域名，注册时都会被问要不要让 AI 爬虫进来，而且默认是挡。我们那个域名是 2026 年 9 月 2 日搬进 Cloudflare 的，17 天后训练用的爬虫还在被挡。&lt;/p&gt;
&lt;p&gt;在后台打开那个域名，依次点 Security、Settings，找到 Bot traffic 那一组。「Configure AI bot policies」里有三行：Search、Agent、Training。我们的是 Allow、Allow、Disallow，回 403 给 GPTBot、ClaudeBot、CCBot 的就是 Training 那一行。9 月 19 日 15:10 我们把它改成 Allow，再跑一次上面的命令，当天测的九个名字全部 200。&lt;/p&gt;
&lt;p&gt;同一个面板最下面有个「Enable Bot Preference Sync」，开了之后 Cloudflare 会往你的 robots.txt 里写它自己的规则。我们让它关着：网站本来就有自己的 robots.txt，两套规则迟早会打架。&lt;/p&gt;
&lt;h2 id=&quot;s4&quot;&gt;爬虫读不到的邮箱&lt;/h2&gt;
&lt;p&gt;这个域名的 Cloudflare「Email Address Obfuscation」（邮箱加密）是开着的，我们没开过它。它把页面上每个邮箱换成一个指向 &lt;code&gt;/cdn-cgi/l/email-protection&lt;/code&gt; 的链接，外加「[email protected]」几个字，再用一段小脚本在访客的浏览器里把真邮箱放回去，所以人完全看不出来。&lt;/p&gt;
&lt;p&gt;爬虫如果只读 HTML、读完就走，拿到的就是「[email protected]」。Vercel 和 MERJ 在 2024 年 12 月的研究发现，GPTBot、ClaudeBot、PerplexityBot 抓页面时都不执行 JavaScript，所以对它们来说，这个邮箱等于不存在。&lt;/p&gt;
&lt;p&gt;我们没关这个设定，改的是页面。Cloudflare 会跳过 &lt;code&gt;&amp;lt;!--email_off--&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;!--/email_off--&amp;gt;&lt;/code&gt; 之间的内容，所以现在建站时每个邮箱都包在这两个注释里。直接把整个域名的这项功能关掉也行。&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 标签里和 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 里的邮箱本来就不会被改，所以我们结构化资料里的邮箱一直读得到。&lt;/p&gt;
&lt;p&gt;要查你的网站，就用爬虫的方式打开联系页，数一数 Cloudflare 的加密标记：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -s https://www.example.com/contact \
  -A &amp;quot;Mozilla/5.0 (compatible; GPTBot/1.0)&amp;quot; \
  | grep -c &amp;quot;email-protection&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只要大于 0，这一页就至少有一个邮箱是爬虫读不到的。我们的联系页现在印出来的是 0。&lt;/p&gt;
&lt;h2 id=&quot;s5&quot;&gt;爬虫还会漏掉什么&lt;/h2&gt;
&lt;p&gt;同一份研究发现，Gemini（通过 Googlebot）和 AppleBot 会执行 JavaScript；它测到的 OpenAI、Anthropic、Perplexity 的爬虫都不会。所以凡是网站在脚本跑完之后才加上去的东西，这三家都看不到：用脚本载入的价格、在浏览器里才生成的菜单、小工具带进来的评价，有时甚至是整个页面。想知道它们看到什么，就用 &lt;code&gt;curl&lt;/code&gt; 抓页面，在输出里找你在意的那几个字。&lt;/p&gt;
&lt;h2 id=&quot;s6&quot;&gt;我们每次上线后都查的清单&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;robots.txt 允许你想要的爬虫。&lt;code&gt;User-agent: *&lt;/code&gt; 底下写着 &lt;code&gt;Allow: /&lt;/code&gt; 的话，没点名的爬虫也算允许。&lt;/li&gt;&lt;li&gt;上面那段命令里每个名字都回 200。&lt;/li&gt;&lt;li&gt;用 Cloudflare 的话，AI bot policies 跟 robots.txt 说的是同一件事。&lt;/li&gt;&lt;li&gt;主要的文字、价格、联系方式，在脚本执行之前就已经在 HTML 里。&lt;/li&gt;&lt;li&gt;用 &lt;code&gt;curl&lt;/code&gt; 查得到你的邮箱。&lt;/li&gt;&lt;li&gt;sitemap 列出每一页，日期只在那一页的文字真的改了才变。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;nicasiadigital.com 每次上线后我们都跑一遍这些检查，没过的项目脚本会列出来。想让我们在你的网站上也跑一遍，&lt;a href=&quot;https://nicasiadigital.com/zh/contact&quot;&gt;私人诊断&lt;/a&gt; 就包括在内。&lt;/p&gt;
&lt;h2 id=&quot;s7&quot;&gt;资料来源&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;OpenAI，&lt;a href=&quot;https://developers.openai.com/api/docs/bots&quot;&gt;Overview of OpenAI crawlers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Anthropic，&lt;a href=&quot;https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler&quot;&gt;Does Anthropic crawl data from the web, and how can site owners block the crawler?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Perplexity，&lt;a href=&quot;https://docs.perplexity.ai/guides/bots&quot;&gt;Perplexity crawlers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Google，&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers&quot;&gt;Google&amp;#x27;s common crawlers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Cloudflare，&lt;a href=&quot;https://www.cloudflare.com/press/press-releases/2025/cloudflare-just-changed-how-ai-crawlers-scrape-the-internet-at-large/&quot;&gt;2025 年 7 月 1 日新闻稿&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Cloudflare，&lt;a href=&quot;https://developers.cloudflare.com/waf/tools/scrape-shield/email-address-obfuscation/&quot;&gt;Email Address Obfuscation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Vercel 与 MERJ，&lt;a href=&quot;https://vercel.com/blog/the-rise-of-the-ai-crawler&quot;&gt;The rise of the AI crawler&lt;/a&gt;，2024 年 12 月 17 日&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
</feed>
