const { execSync } = require("child_process"); const cheerio = require("cheerio"); const fs = require("fs"); const path = require("path"); const BASE = "https://ladsawai.go.th"; const OUT = path.join(process.cwd(), "พระราชบัญญัติ และ พระราชกฤษฎีกา"); fs.mkdirSync(OUT, { recursive: true }); function curlHtml(url) { return execSync( `curl -L -s "${url}" -H "User-Agent: Mozilla/5.0" -H "Accept-Language: th-TH,th;q=0.9"`, { encoding: "utf8", maxBuffer: 30 * 1024 * 1024 } ); } function absUrl(href) { if (!href) return null; if (href.startsWith("http")) return href; // ลิงก์นอกโดเมน if (href.startsWith("/")) return BASE + href; // /public/... return BASE + "/" + href; // public/... } function scrapeLawMenu(menuId) { const url = `${BASE}/rss/data/law/menu/${menuId}`; const html = curlHtml(url); // debug fs.writeFileSync(path.join(OUT, `debug-menu-${menuId}.html`), html, "utf8"); const $ = cheerio.load(html); const items = []; // ในรูปอยู่ใน table > tbody > tr และข้อมูลอยู่ที่ td.law-topic $("table tbody tr").each((_, tr) => { const tds = $(tr).find("td.law-topic"); if (tds.length < 2) return; // ✅ ช่องที่ 2 คือข้อมูลจริง const td = tds.eq(1); // title ที่ถูกต้องมักอยู่ใน ตัวที่เป็นข้อความยาว (มักเป็นตัวสุดท้าย) const title = td.find("a[href]").last().text().replace(/\s+/g, " ").trim(); if (!title || title === "-") return; // เก็บ link ทุกตัวใน td (มีทั้ง read + download) const links = []; td.find("a[href]").each((_, a) => { const href = $(a).attr("href"); const text = $(a).text().replace(/\s+/g, " ").trim(); links.push({ text: text || null, href: absUrl(href), }); }); const detail = td .clone() .find("a") // ตัด a ออก เหลือ text ล้วน .remove() .end() .text() .replace(/\s+/g, " ") .trim() || null; items.push({ title, detail, links, sourceUrl: url, }); }); return { url, items }; } (function main() { const menuId = 1220; const { url, items } = scrapeLawMenu(menuId); const out = { menuId, source: url, scrapedAt: new Date().toISOString(), totalItems: items.length, items, }; const outJson = path.join(OUT, `menu-${menuId}-all.json`); fs.writeFileSync(outJson, JSON.stringify(out, null, 2), "utf8"); console.log("✅ Saved:", outJson); console.log("✅ Items:", items.length); })();