Cách kiểm tra nhật ký máy chủ để tìm trình thu thập dữ liệu AI

Đăng ngày

Trả lời ngắn

Hãy tìm trong trường user agent của nhật ký truy cập các token như GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot và PerplexityBot, rồi xem các mã trạng thái mà chúng nhận được. Chỉ riêng user agent không chứng minh được gì, nên hãy đối chiếu từng IP nguồn với danh sách IP mà hãng công bố, hoặc bằng reverse và forward DNS đối với Google và Apple.

Robots.txt cho biết bạn yêu cầu trình thu thập dữ liệu làm gì. Nhật ký truy cập cho biết điều gì thực sự đã xảy ra: trình thu thập dữ liệu AI nào đã ghé qua, chúng yêu cầu những trang nào và máy chủ của bạn trả lời ra sao. Đó là bằng chứng trực tiếp nhất bạn có, và chỉ cần các tệp nhật ký cùng một cửa sổ dòng lệnh. Các ví dụ dưới đây dùng định dạng nhật ký combined mà nginx và Apache dùng theo mặc định.

Trong trang này
  1. Một lượt truy cập của trình thu thập dữ liệu AI trông như thế nào trong nhật ký truy cập?
  2. Làm sao đếm số lượt truy cập của trình thu thập dữ liệu AI?
  3. Mỗi trình thu thập dữ liệu thực sự đã nhận được gì?
  4. Làm sao xác minh một lượt truy cập thực sự đến từ OpenAI, Anthropic hay Perplexity?
  5. Làm sao xác minh Googlebot, Applebot và CCBot?
  6. Trình thu thập dữ liệu AI giả trông như thế nào?
  7. Nhật ký không cho bạn biết điều gì?

Một lượt truy cập của trình thu thập dữ liệu AI trông như thế nào trong nhật ký truy cập?

Trong định dạng combined, mỗi dòng gồm IP máy khách, thời gian, dòng yêu cầu, mã trạng thái, kích thước phản hồi, referrer và user agent. nginx định nghĩa nó là $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent", và định dạng combined của Apache có các trường tương tự. Một lượt truy cập từ trình thu thập dữ liệu huấn luyện của OpenAI trông như sau:

20.171.206.5 - - [12/Nov/2026:10:00:01 +0000] "GET /pricing HTTP/1.1" 200 5120 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot"

Các token cần tìm là những token mà các hãng công bố: GPTBot, OAI-SearchBot và ChatGPT-User (OpenAI); ClaudeBot, Claude-SearchBot và Claude-User (Anthropic); PerplexityBot và Perplexity-User (Perplexity); Googlebot, Applebot, meta-externalagent, meta-webindexer và CCBot. Bạn sẽ không bao giờ thấy Google-Extended hay Applebot-Extended. Google cho biết Google-Extended không có chuỗi user agent riêng, và Apple cho biết Applebot-Extended không thu thập dữ liệu; cả hai chỉ là token robots.txt.

Làm sao đếm số lượt truy cập của trình thu thập dữ liệu AI?

Tách mỗi dòng theo ký tự dấu nháy kép sẽ đưa user agent vào trường 6. Chỉ khớp trường này giúp tránh trùng khớp sai từ các URL tình cờ chứa tên của một bot. Lệnh này đếm số lượt truy cập của từng trình thu thập dữ liệu trong nhật ký hiện tại và các nhật ký đã xoay vòng, đã nén:

zcat -f /var/log/nginx/access.log* \
  | awk -F'"' '{print $6}' \
  | grep -Eo 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User|Googlebot|bingbot|Applebot|meta-externalagent|meta-webindexer|CCBot' \
  | sort | uniq -c | sort -rn

Hãy điều chỉnh đường dẫn cho Apache, thường là /var/log/apache2/access.log* hoặc /var/log/httpd/access_log*. zcat -f đọc được cả tệp thường lẫn tệp gzip. Nếu thiếu một trình thu thập dữ liệu mà bạn mong đợi, chỉ điều đó chưa chứng minh nó bị chặn: có thể nó đơn giản là không ghé qua trong khoảng thời gian mà nhật ký của bạn bao phủ.

Mỗi trình thu thập dữ liệu thực sự đã nhận được gì?

Số lượt truy cập quan trọng hơn là câu trả lời. Một trình thu thập dữ liệu nhận 403 cho mọi yêu cầu là đã ghé qua nhưng không đọc được gì. Các lệnh này cho thấy mã trạng thái, các đường dẫn được yêu cầu nhiều nhất và việc trình thu thập dữ liệu có tải robots.txt hay không:

# Status codes returned to PerplexityBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /PerplexityBot/ {split($3, s, " "); print s[1]}' | sort | uniq -c

# Most requested paths for OAI-SearchBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /OAI-SearchBot/ {split($2, r, " "); print r[2]}' | sort | uniq -c | sort -rn | head -20

# Did ClaudeBot fetch robots.txt, and what did it get?
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /ClaudeBot/ && $2 ~ /robots\.txt/ {split($3, s, " "); print s[1]}' | sort | uniq -c

Phần lớn là mã 200 là điều bạn muốn thấy. Nhiều mã 403 hoặc 429 cho thấy một quy tắc tường lửa hoặc giới hạn tốc độ. Phản hồi 5xx cho robots.txt là nghiêm trọng: theo RFC 9309, trình thu thập dữ liệu nhận lỗi máy chủ cho robots.txt phải coi như toàn bộ website bị cấm.

Nếu website của bạn nằm sau một CDN, có hai điều thay đổi. Các yêu cầu bị CDN chặn không bao giờ tới máy chủ gốc, nên chúng hoàn toàn không xuất hiện trong nhật ký của máy chủ gốc; hãy xem các sự kiện bảo mật của chính CDN. Và nếu bạn không khôi phục IP của khách truy cập, máy chủ gốc sẽ ghi địa chỉ của CDN. Chẳng hạn, Cloudflare gửi IP gốc trong header CF-Connecting-IP và theo mặc định ghi một IP của Cloudflare.

Làm sao xác minh một lượt truy cập thực sự đến từ OpenAI, Anthropic hay Perplexity?

Các hãng này công bố dải IP mà agent của họ dùng: OpenAI tại openai.com/gptbot.json, openai.com/searchbot.json và openai.com/chatgpt-user.json; Anthropic tại claude.com/crawling/bots.json; Perplexity tại perplexity.ai/perplexitybot.json và perplexity.ai/perplexity-user.json. Anthropic cho biết IP nguồn có trong danh sách của họ cho thấy trình thu thập dữ liệu đến từ Anthropic. Không tài liệu nào trong ba hãng này mô tả việc xác minh bằng reverse DNS, nên hãy dùng các danh sách.

Các tệp có cùng một cấu trúc, một danh sách prefixes gồm các mục ipv4Prefix hoặc ipv6Prefix, nên một script nhỏ có thể kiểm tra một IP với bất kỳ tệp nào trong số đó:

python3 - 20.171.206.5 https://openai.com/gptbot.json <<'EOF'
import ipaddress, json, sys, urllib.request
ip = ipaddress.ip_address(sys.argv[1])
req = urllib.request.Request(sys.argv[2], headers={"User-Agent": "log-check"})
prefixes = json.load(urllib.request.urlopen(req))["prefixes"]
nets = [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix")) for p in prefixes]
print(ip, "listed" if any(ip in n for n in nets) else "NOT listed")
EOF

Để liệt kê các IP đã tự xưng là một trình thu thập dữ liệu nào đó, hãy chạy awk -F'"' '$6 ~ /GPTBot/ {split($1, a, " "); print a[1]}' trên nhật ký và chuyển kết quả qua sort | uniq -c | sort -rn. Đối chiếu từng IP với danh sách tương ứng. Các danh sách thay đổi, nên hãy tải mới thay vì giữ một bản cũ.

Làm sao xác minh Googlebot, Applebot và CCBot?

Google, Apple và Common Crawl có tài liệu về cách kiểm tra reverse và forward DNS. Tra tên máy của IP, kiểm tra tên miền của nó, rồi tra tên máy đó và xác nhận nó trỏ ngược về cùng IP:

host 66.249.66.1
# 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.
host crawl-66-249-66-1.googlebot.com
# crawl-66-249-66-1.googlebot.com has address 66.249.66.1

Với Google, tên máy phải kết thúc bằng googlebot.com, google.com hoặc googleusercontent.com, tùy trình thu thập dữ liệu; Google cũng công bố các dải IP của mình, với Googlebot trong common-crawlers.json. Với Apple, nó phải thuộc applebot.apple.com, với các dải IP trong applebot.json. Với Common Crawl, nó phải nằm dưới crawl.commoncrawl.org, và Common Crawl cảnh báo rằng các trình thu thập dữ liệu khác mạo danh tên CCBot.

Trình thu thập dữ liệu AI giả trông như thế nào?

Các công cụ cào dữ liệu thường mượn user agent của một trình thu thập dữ liệu nổi tiếng để vượt qua bộ lọc. Những dấu hiệu điển hình:

Vấn đề ngược lại cũng tồn tại: một trình thu thập dữ liệu dùng user agent của trình duyệt thông thường thì hoàn toàn không thể nhận diện từ dòng nhật ký. Năm 2025, Cloudflare cho biết họ đã quan sát thấy Perplexity thu thập dữ liệu bằng các user agent giống trình duyệt, không khai báo, từ các IP nằm ngoài dải đã công bố; Perplexity phản bác cách mô tả này và quy một phần lưu lượng cho một dịch vụ bên thứ ba. Chỉ riêng nhật ký không giải quyết được những trường hợp như vậy, và đó là lý do việc xác minh theo dải IP đã công bố quan trọng theo cả hai chiều.

Nhật ký không cho bạn biết điều gì?

Nhật ký cho thấy những gì đã tới máy chủ của bạn. Chúng không cho thấy CDN đã chặn gì trước khi tới máy chủ gốc, một trang trả về 200 có chứa văn bản hay chỉ là lớp vỏ script, hay một trình thu thập dữ liệu có được phép nếu nó đến hôm nay hay không. Chúng cũng chỉ bao phủ khoảng thời gian bạn lưu giữ, và các website ít truy cập có thể hiếm khi thấy trình thu thập dữ liệu AI.

Trong tài khoản AISeeWhy, bạn có thể tải lên một nhật ký truy cập định dạng combined (thường hoặc .gz, tối đa 50 MB); nhật ký được phân tích rồi bị loại bỏ, và các yêu cầu của từng trình thu thập dữ liệu AI được đếm cùng mã trạng thái và đối chiếu với các dải IP mà các hãng công bố.

Câu hỏi thường gặp

Vì sao tôi không thấy Google-Extended trong nhật ký?

Google cho biết Google-Extended không có chuỗi user agent riêng. Việc thu thập dữ liệu do các trình thu thập dữ liệu hiện có của Google thực hiện, và token chỉ kiểm soát cách nội dung có thể được dùng. Điều này cũng đúng với Applebot-Extended, mà Apple cho biết không thu thập dữ liệu.

Tôi có thể tin user agent trong nhật ký không?

Không. Ai cũng có thể gửi bất kỳ user agent nào. Hãy xem nó là một lời tự xưng và xác nhận bằng các dải IP mà hãng công bố, hoặc với Google, Apple và Common Crawl thì bằng tra cứu reverse và forward DNS.

Nhật ký của tôi không có lượt truy cập nào của trình thu thập dữ liệu AI. Tôi có bị chặn không?

Không nhất thiết. Có thể trình thu thập dữ liệu chưa ghé qua, CDN của bạn có thể đã chặn nó trước máy chủ gốc, hoặc nhật ký của bạn chỉ ghi các địa chỉ IP của CDN. Hãy xem các sự kiện bảo mật của CDN và kiểm tra trang bằng user agent của từng trình thu thập dữ liệu.

Lưu lượng ChatGPT-User có phải là trình thu thập dữ liệu không?

OpenAI cho biết ChatGPT-User được dùng cho một số thao tác của người dùng và không được dùng để thu thập dữ liệu web một cách tự động. Các lượt truy cập của nó thường xảy ra sau khi một người hỏi ChatGPT về một trang, nên số lượng nhỏ.

Nguồn tham khảo

Bài viết khác