เลิก scrape pkg.go.dev: ใช้ API v1 ดึง package, symbol และช่องโหว่แบบระบุ module ชัดๆ
เครื่องมือที่ต้องรู้ metadata ของ Go package เคยมีทางเลือกที่เปราะ: scrape หน้า HTML หรือประกอบข้อมูลจาก module proxy หลายจุด ตอนนี้ pkg.go.dev มี API ทางการแบบ GET-only สำหรับ package, module, versions, symbols, imported-by และ vulnerabilities พร้อม OpenAPI specification
WHY: ข้อมูลมีโครงสร้างดีกว่า HTML
HTML ถูกออกแบบให้คนอ่านและ layout เปลี่ยนได้ ส่วน API ทำสัญญากับ client โดยตรง IDE, dependency inventory และระบบเตรียม context ให้ coding assistant จึง parse field ที่ต้องใช้ได้โดยไม่ผูกกับ CSS selector
ตัวอย่างต่อไปนี้เป็น code fragment สำหรับดู package ผ่าน endpoint v1 และตาม redirect ด้วย -L:
curl -L "https://pkg.go.dev/v1/package/golang.org/x/time/rate"
ผลลัพธ์มีข้อมูลอย่าง module path, version, สถานะ latest, build context และ synopsis ถ้าต้องการ documentation, examples, imports หรือ licenses ให้เลือกผ่าน query parameter แทนการรับทุกอย่างโดยอัตโนมัติ
HOW: ระบุ module และ version ให้ไม่กำกวม
package path หนึ่งอาจถูกจัดหาโดยหลาย module เช่น parent module กับ submodule เว็บไซต์เลือกตัวแสดงผลให้สะดวกได้ แต่ API ให้ client ระบุ module เมื่อกำกวม หลัก “precision over convenience” นี้สำคัญกับ automation: อย่าเดา dependency จาก package path อย่างเดียว
สำหรับรายงาน reproducible ให้ส่ง version ที่ล็อกไว้ใน go.mod แทน latest และเก็บ request parameters คู่กับผลลัพธ์ API รองรับ semantic version และ default branch บางชื่อ แต่ branch resolve เป็น pseudo-version ซึ่งเปลี่ยนเมื่อมี commit ใหม่
Rate limit, pagination และความไว้ใจ
เอกสารระบุ rate limit 45 queries ต่อวินาทีต่อ IP block และ route ที่คืนหลายรายการใช้ nextPageToken Client ควร cache, จำกัด concurrency, retry 429 ด้วย backoff และหยุดตาม token จนว่าง อย่าปล่อย agent เรียกค้นแบบไม่มีงบ
metadata จาก registry เป็น input ภายนอก แม้มาจากบริการทางการ synopsis และ documentation ยังมาจากผู้เผยแพร่ package หากส่งต่อเข้า LLM ให้คั่นเป็นข้อมูลที่ไม่น่าเชื่อถือ จำกัด tool permissions และอย่าให้ข้อความในเอกสารกลายเป็นคำสั่งระบบ
Recap
ใช้ API v1 แทน HTML scraping, pin version, ระบุ module เมื่อกำกวม และออกแบบ cache/backoff ตั้งแต่แรก งานลองวันนี้คือเปลี่ยน integration หนึ่งตัวให้เรียก endpoint package แล้วเก็บ fixture จริงไว้เป็น contract test ครับ