ai newsDo., 29. Okt.
EilmeldungDeepSeek and Moonshot trained new models on GPT-6 Astra, report says

Kiểm tra AI crawler có đọc được site không: robots.txt, HTML ban đầu và log server

Tuần trước một người quen nhờ mình xem vì sao ChatGPT trả lời về công ty anh ấy toàn thông tin cũ. Nội dung không sai, schema cũng có. Kiểm tra một lúc mới ra nguyên nhân rất "dev": robots.txt đang chặn một bot tìm kiếm của AI, còn trang dịch vụ thì phần mô tả chỉ hiện ra sau khi JavaScript chạy xo

dev.toDonnerstag 08:43 · 29.10.5 Min. Lesezeit
Bild: dev.to

Bài này ghi lại cách mình kiểm tra theo ba lớp: robots.txt, HTML ban đầu và log server. Toàn bộ chỉ cần terminal, curl, grep và quyền đọc access log. Mình không bàn chuyện nội dung hay thực thể ở đây, chỉ xem bot có vào được và đọc được hay không.

Không có danh sách nào đầy đủ mãi, nhưng đây là những cái mình hay gặp nhất:

Điểm quan trọng: ba bot của OpenAI là ba thiết lập độc lập. Bạn hoàn toàn có thể mở OAI-SearchBot để được tìm thấy trong ChatGPT search mà vẫn chặn GPTBot.

curl -s https://example.com/robots.txt Enter fullscreen mode Exit fullscreen mode Chỗ nhiều người đọc nhầm: một crawler chỉ theo nhóm user-agent khớp cụ thể nhất với nó. Nếu file có nhóm User-agent: GPTBot thì GPTBot bỏ qua hoàn toàn nhóm User-agent: *, kể cả các dòng Disallow bạn tưởng là áp dụng cho mọi bot. Ví dụ:

User-agent: * Disallow: /admin/ User-agent: GPTBot Disallow: / Enter fullscreen mode Exit fullscreen mode Ở đây GPTBot bị chặn toàn site, còn OAI-SearchBot, ClaudeBot, PerplexityBot rơi vào nhóm * nên chỉ bị chặn /admin/. Nếu bạn muốn cho bot tìm kiếm vào nhưng chặn bot huấn luyện, viết rõ từng nhóm:

User-agent: OAI-SearchBot Allow: / User-agent: GPTBot Disallow: / User-agent: Google-Extended Disallow: / Enter fullscreen mode Exit fullscreen mode Mình hay lọc nhanh các dòng liên quan bằng:

curl -s https://example.com/robots.txt \ | grep -inE -A3 'user-agent: *(\*|gptbot|oai-searchbot|chatgpt-user|claudebot|perplexitybot|google-extended)' Enter fullscreen mode Exit fullscreen mode Hai lỗi mình gặp nhiều nhất: plugin bảo mật hoặc CDN tự thêm nhóm chặn "AI bots" mà chủ site không biết, và robots.txt bị trả về 403 hoặc trang HTML lỗi thay vì file text. Kiểm tra luôn status và content-type:

curl -sI https://example.com/robots.txt | grep -iE '^(HTTP|content-type)' Enter fullscreen mode Exit fullscreen mode OpenAI cũng lưu ý thay đổi robots.txt có thể mất khoảng 24 giờ để hệ thống tìm kiếm của họ cập nhật, nên đừng sửa xong rồi thử ngay.

robots.txt cho phép không có nghĩa là server cho phép. WAF, Cloudflare hay rule chống bot có thể trả 403, 429 hoặc trang challenge cho đúng mấy user-agent này. Mình giả lập bằng curl:

URL = "https://example.com/dich-vu/abc" for UA in \ "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" \ "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot" \ "OAI-SearchBot/1.4" \ "ClaudeBot/1.0" \ "PerplexityBot/1.0" do printf '%-20s ' " $( echo " $UA " | grep -oE '(GPTBot|ChatGPT-User|OAI-SearchBot|ClaudeBot|PerplexityBot)' ) " curl -s -o /dev/null -A " $UA " -w '%{http_code} %{size_download} bytes\n' " $URL " done Enter fullscreen mode Exit fullscreen mode Chuỗi user-agent đầy đủ có số phiên bản thay đổi theo thời gian; với việc kiểm tra rule chặn theo tên thì chỉ cần chứa đúng tên bot là đủ. Kết quả cần nhìn: mọi dòng nên là 200 và kích thước gần bằng nhau. Một dòng 403, hoặc 200 nhưng chỉ vài KB trong khi trình duyệt nhận cả trăm KB, thường là trang challenge.

Lưu ý: cách này chỉ kiểm tra được rule chặn theo user-agent. Nếu firewall chặn theo IP hoặc ASN thì curl từ máy bạn vẫn qua, còn bot thật thì không. Vì vậy cần lớp 3.

Cách kiểm tra đơn giản: chọn một câu quan trọng (tên dịch vụ, giá, địa chỉ) và grep trong HTML thô:

curl -s -A "GPTBot/1.4" " $URL " | grep -c "Dịch vụ thiết kế website" Enter fullscreen mode Exit fullscreen mode Ra 0 thì có hai khả năng: nội dung do JS tạo ra, hoặc chuỗi bị encode thành HTML entity. Để chắc, mình bỏ thẻ và xem phần text thô:

curl -s -A "GPTBot/1.4" " $URL " \ | python3 -c "import sys,re,html; t=sys.stdin.read(); t=re.sub(r'<(script|style)[^>]*>.*?</ \1 >','',t,flags=re.S); t=html.unescape(re.sub(r'<[^>]+>',' \n ',t)); print(' \n '.join(l.strip() for l in t.splitlines() if l.strip()))" \ | head -50 Enter fullscreen mode Exit fullscreen mode Nếu 50 dòng đầu chỉ có menu, footer và "Loading...", đó là dấu hiệu nội dung chính không nằm trong HTML ban đầu. Hướng sửa thường là SSR, SSG hoặc prerender cho các trang quan trọng; tùy framework mà cách làm khác nhau.

Cũng nên kiểm tra thêm <title>, meta description và thẻ <meta name="robots"> trong HTML thô, vì có site gắn noindex bằng JS rồi quên gỡ:

curl -s " $URL " | grep -oiE '<(title|meta name="(description|robots)")[^>]*>[^<]*' Enter fullscreen mode Exit fullscreen mode Lớp 3: đọc access log Đây là nơi trả lời câu hỏi "bot có thực sự ghé không". Với log nginx hoặc Apache dạng combined:

# Đếm lượt truy cập theo từng bot (gồm cả log đã nén) zgrep -hoiE 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|PerplexityBot' /var/log/nginx/access.log * \ | sort | uniq -c | sort -rn Enter fullscreen mode Exit fullscreen mode # Xem bot gặp status nào, ở URL nào grep -iE 'GPTBot|OAI-SearchBot|ClaudeBot|PerplexityBot' /var/log/nginx/access.log \ | awk '{print $9, $7}' | sort | uniq -c | sort -rn | head -30 Enter fullscreen mode Exit fullscreen mode Nếu thấy nhiều 403 hoặc 429, quay lại xem rule WAF hoặc rate limit. Nếu hoàn toàn không có dòng nào sau vài tuần, có thể bot chưa biết tới site, hoặc bị chặn từ tầng CDN trước khi request tới server; khi đó cần xem log hoặc dashboard của CDN.

User-agent thì ai cũng giả được. OpenAI công bố dải IP cho từng bot ở các file JSON như https://openai.com/gptbot.json, searchbot.json, chatgpt-user.json. Mình kiểm tra một IP trong log như sau:

IP = "20.171.206.10" curl -s https://openai.com/gptbot.json \ | jq -r '.prefixes[] |.ipv4Prefix //.ipv6Prefix' \ | python3 -c "import sys,ipaddress; ip=ipaddress.ip_address(' $IP '); print(any(ip in ipaddress.ip_network(l.strip()) for l in sys.stdin if l.strip()))" Enter fullscreen mode Exit fullscreen mode Ra True thì đúng là bot của OpenAI. Với các bot khác, xem trang tài liệu crawler của từng bên để lấy cách xác minh tương ứng.

Ba lớp này chỉ trả lời câu hỏi bot có đọc được site hay không. Đọc được rồi mà AI vẫn tả sai công ty thì vấn đề nằm ở nội dung và nguồn bên ngoài; phần đó mình đã viết riêng trong checklist 30 phút tìm lý do ChatGPT mô tả sai doanh nghiệp.

Nếu bạn không có quyền đọc log hay không muốn tự mò rule CDN, Mạnh Digital có dịch vụ tối ưu cho AI search, trong đó phần kỹ thuật gồm đưa nội dung quan trọng vào HTML ban đầu và cấu hình robots.txt cho các bot AI. Còn nếu tự làm, chạy hết checklist trên một lần là đã loại được phần lớn lỗi mình hay gặp.

Quelle: dev.to (dev.to). Original öffnen