Add initial files for election coordination and integrity assessment, including .gitignore and multiple JavaScript files for scraping data. Also, include JSON files for menu data and HTML debug pages.
This commit is contained in:
parent
fe60294656
commit
a5b7c145e9
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
||||||
@ -0,0 +1,217 @@
|
|||||||
|
// หน้าแรก > งานบริการ > ศูนย์ประสานงานการเลือกตั้งสมาชิกสภาเทศบาลและนายกเทศมนตรี
|
||||||
|
|
||||||
|
const { execSync } = require("child_process");
|
||||||
|
const cheerio = require("cheerio");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const axios = require("axios").default;
|
||||||
|
|
||||||
|
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;
|
||||||
|
return BASE + "/" + href;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildUrl(menuId, page) {
|
||||||
|
return `${BASE}/public/list/data/index/menu/${menuId}/page/${page}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function detectTotalPages($) {
|
||||||
|
let maxPage = 1;
|
||||||
|
$("a").each((_, a) => {
|
||||||
|
const t = $(a).text().trim();
|
||||||
|
if (/^\d+$/.test(t)) maxPage = Math.max(maxPage, Number(t));
|
||||||
|
});
|
||||||
|
return maxPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractFileLinksFromDetail(detailUrl) {
|
||||||
|
const html = curlHtml(detailUrl);
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
|
||||||
|
const files = [];
|
||||||
|
|
||||||
|
$("a.uploadconfig_link").each((_, a) => {
|
||||||
|
const el = $(a);
|
||||||
|
const href = el.attr("href");
|
||||||
|
const dataHref = el.attr("data-href");
|
||||||
|
const fileUrl = absUrl(dataHref || href);
|
||||||
|
if (!fileUrl) return;
|
||||||
|
|
||||||
|
files.push({
|
||||||
|
text: el.text().replace(/\s+/g, " ").trim() || null,
|
||||||
|
url: fileUrl,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// fallback: ลิงก์ไฟล์แบบตรง ๆ
|
||||||
|
$("a[href]").each((_, a) => {
|
||||||
|
const href = $(a).attr("href");
|
||||||
|
const u = absUrl(href);
|
||||||
|
if (!u) return;
|
||||||
|
|
||||||
|
if (/\.(pdf|doc|docx|xls|xlsx|ppt|pptx|zip|rar)(\?|$)/i.test(u)) {
|
||||||
|
if (!files.some((f) => f.url === u)) {
|
||||||
|
files.push({ text: $(a).text().trim() || null, url: u });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ ยิง api /status/1/ เพื่อเอา path จริง
|
||||||
|
async function resolveRealFilePath(fileUrl) {
|
||||||
|
try {
|
||||||
|
// กันกรณีมี / ท้ายอยู่แล้ว
|
||||||
|
const statusUrl = fileUrl.replace(/\/$/, "") + "/status/1/";
|
||||||
|
const res = await axios.get(statusUrl, { timeout: 30000 });
|
||||||
|
return res?.data?.path || null;
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ limit concurrency แบบง่าย (กันยิงหนักเกิน)
|
||||||
|
async function mapLimit(arr, limit, mapper) {
|
||||||
|
const ret = [];
|
||||||
|
let i = 0;
|
||||||
|
|
||||||
|
async function worker() {
|
||||||
|
while (i < arr.length) {
|
||||||
|
const idx = i++;
|
||||||
|
ret[idx] = await mapper(arr[idx], idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const workers = Array.from({ length: Math.min(limit, arr.length) }, worker);
|
||||||
|
await Promise.all(workers);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function scrapeOnePage(menuId, page, saveHtml = false) {
|
||||||
|
const url = buildUrl(menuId, page);
|
||||||
|
const html = curlHtml(url);
|
||||||
|
|
||||||
|
if (saveHtml) {
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(OUT, `debug-menu-${menuId}-page-${page}.html`),
|
||||||
|
html,
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
|
||||||
|
// ✅ แปลง rows เป็น array ก่อน
|
||||||
|
const rows = $(".row.data-row").toArray();
|
||||||
|
|
||||||
|
// ✅ ประมวลผลแบบมี limit (เช่น 5 concurrent)
|
||||||
|
const items = (await mapLimit(rows, 5, async (row) => {
|
||||||
|
const el = $(row);
|
||||||
|
const a = el.find("a.listdataconfig_link[href]").first();
|
||||||
|
if (!a.length) return null;
|
||||||
|
|
||||||
|
const title =
|
||||||
|
a.find("label.font-weight").text().replace(/\s+/g, " ").trim() ||
|
||||||
|
a.text().replace(/\s+/g, " ").trim();
|
||||||
|
|
||||||
|
if (!title) return null;
|
||||||
|
|
||||||
|
const detailUrl = absUrl(a.attr("href"));
|
||||||
|
let files = [];
|
||||||
|
let realPath = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (detailUrl) files = extractFileLinksFromDetail(detailUrl);
|
||||||
|
const firstFileUrl = files?.[0]?.url ? absUrl(files[0].url) : null;
|
||||||
|
if (firstFileUrl) {
|
||||||
|
realPath = await resolveRealFilePath(firstFileUrl);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
files = [];
|
||||||
|
realPath = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
title,
|
||||||
|
detailUrl: detailUrl || null,
|
||||||
|
fileUrl: files?.[0]?.url ? absUrl(files[0].url) : null, // ไฟล์จากหน้า detail
|
||||||
|
filePath: `https://ladsawai.go.th/public/` + realPath, // ✅ ของจริงจาก api /status/1/
|
||||||
|
sourcePage: page,
|
||||||
|
sourceUrl: url,
|
||||||
|
};
|
||||||
|
}))
|
||||||
|
.filter(Boolean); // ตัด null ออก
|
||||||
|
|
||||||
|
const output = {
|
||||||
|
source: url,
|
||||||
|
scrapedAt: new Date().toISOString(),
|
||||||
|
menuId,
|
||||||
|
page,
|
||||||
|
count: items.length,
|
||||||
|
items,
|
||||||
|
};
|
||||||
|
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(OUT, `menu-${menuId}-page-${page}.json`),
|
||||||
|
JSON.stringify(output, null, 2),
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log(`✅ page ${page} -> items ${items.length}`);
|
||||||
|
return { $, items };
|
||||||
|
}
|
||||||
|
|
||||||
|
(async function main() {
|
||||||
|
const menuId = 1543;
|
||||||
|
|
||||||
|
const first = await scrapeOnePage(menuId, 1, true);
|
||||||
|
const totalPages = detectTotalPages(first.$);
|
||||||
|
console.log("✅ totalPages =", totalPages);
|
||||||
|
|
||||||
|
const all = [];
|
||||||
|
const seen = new Set();
|
||||||
|
|
||||||
|
function addItems(items) {
|
||||||
|
for (const it of items) {
|
||||||
|
const key = `${it.title}|${it.detailUrl || ""}|${it.filePath || ""}`;
|
||||||
|
if (seen.has(key)) continue;
|
||||||
|
seen.add(key);
|
||||||
|
all.push(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addItems(first.items);
|
||||||
|
|
||||||
|
for (let p = 2; p <= totalPages; p++) {
|
||||||
|
const { items } = await scrapeOnePage(menuId, p, false);
|
||||||
|
addItems(items);
|
||||||
|
}
|
||||||
|
|
||||||
|
const merged = {
|
||||||
|
menuId,
|
||||||
|
totalPages,
|
||||||
|
scrapedAt: new Date().toISOString(),
|
||||||
|
totalItems: all.length,
|
||||||
|
items: all,
|
||||||
|
};
|
||||||
|
|
||||||
|
const outAll = path.join(OUT, `menu-${menuId}-all.json`);
|
||||||
|
fs.writeFileSync(outAll, JSON.stringify(merged, null, 2), "utf8");
|
||||||
|
|
||||||
|
console.log("🎉 Saved all:", outAll);
|
||||||
|
console.log("🎉 Total unique:", all.length);
|
||||||
|
})();
|
||||||
249
integrity-and-transparency-assessment.js
Normal file
249
integrity-and-transparency-assessment.js
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
// หน้าแรก > งานบริการ > การประเมินคุณธรรม และความโปร่งใส (ITA)
|
||||||
|
|
||||||
|
const { execSync } = require("child_process");
|
||||||
|
const cheerio = require("cheerio");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const axios = require("axios").default;
|
||||||
|
|
||||||
|
const BASE = "https://ladsawai.go.th";
|
||||||
|
const OUT = path.join(process.cwd(), "การประเมินคุณธรรม และความโปร่งใส (ITA)");
|
||||||
|
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;
|
||||||
|
return BASE + "/" + href;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildUrl(menuId, page) {
|
||||||
|
return `${BASE}/public/list/data/index/menu/${menuId}/page/${page}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function detectTotalPages($) {
|
||||||
|
let maxPage = 1;
|
||||||
|
$("a").each((_, a) => {
|
||||||
|
const t = $(a).text().trim();
|
||||||
|
if (/^\d+$/.test(t)) maxPage = Math.max(maxPage, Number(t));
|
||||||
|
});
|
||||||
|
return maxPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractFileLinksFromDetail(detailUrl) {
|
||||||
|
const html = curlHtml(detailUrl);
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
|
||||||
|
const files = [];
|
||||||
|
|
||||||
|
$("a.uploadconfig_link").each((_, a) => {
|
||||||
|
const el = $(a);
|
||||||
|
const href = el.attr("href");
|
||||||
|
const dataHref = el.attr("data-href");
|
||||||
|
const fileUrl = absUrl(dataHref || href);
|
||||||
|
if (!fileUrl) return;
|
||||||
|
|
||||||
|
files.push({
|
||||||
|
text: el.text().replace(/\s+/g, " ").trim() || null,
|
||||||
|
url: fileUrl,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// fallback: ลิงก์ไฟล์แบบตรง ๆ
|
||||||
|
$("a[href]").each((_, a) => {
|
||||||
|
const href = $(a).attr("href");
|
||||||
|
const u = absUrl(href);
|
||||||
|
if (!u) return;
|
||||||
|
|
||||||
|
if (/\.(pdf|doc|docx|xls|xlsx|ppt|pptx|zip|rar)(\?|$)/i.test(u)) {
|
||||||
|
if (!files.some((f) => f.url === u)) {
|
||||||
|
files.push({ text: $(a).text().trim() || null, url: u });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ ยิง api /status/1/ เพื่อเอา path จริง
|
||||||
|
async function resolveRealFilePath(fileUrl) {
|
||||||
|
try {
|
||||||
|
// กันกรณีมี / ท้ายอยู่แล้ว
|
||||||
|
const statusUrl = fileUrl.replace(/\/$/, "") + "/status/1/";
|
||||||
|
const res = await axios.get(statusUrl, { timeout: 30000 });
|
||||||
|
return res?.data?.path || null;
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ limit concurrency แบบง่าย (กันยิงหนักเกิน)
|
||||||
|
async function mapLimit(arr, limit, mapper) {
|
||||||
|
const ret = [];
|
||||||
|
let i = 0;
|
||||||
|
|
||||||
|
async function worker() {
|
||||||
|
while (i < arr.length) {
|
||||||
|
const idx = i++;
|
||||||
|
ret[idx] = await mapper(arr[idx], idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const workers = Array.from({ length: Math.min(limit, arr.length) }, worker);
|
||||||
|
await Promise.all(workers);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function scrapeOnePage(menuId, page, saveHtml = false) {
|
||||||
|
const url = buildUrl(menuId, page);
|
||||||
|
const html = curlHtml(url);
|
||||||
|
|
||||||
|
if (saveHtml) {
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(OUT, `debug-menu-${menuId}-page-${page}.html`),
|
||||||
|
html,
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
|
||||||
|
// ✅ แปลง rows เป็น array ก่อน
|
||||||
|
const rows = $(".row.data-row").toArray();
|
||||||
|
|
||||||
|
// ✅ ประมวลผลแบบมี limit (เช่น 5 concurrent)
|
||||||
|
const items = (await mapLimit(rows, 5, async (row) => {
|
||||||
|
const el = $(row);
|
||||||
|
const a = el.find("a.listdataconfig_link[href]").first();
|
||||||
|
if (!a.length) return null;
|
||||||
|
|
||||||
|
const title =
|
||||||
|
a.find("label.font-weight").text().replace(/\s+/g, " ").trim() ||
|
||||||
|
a.text().replace(/\s+/g, " ").trim();
|
||||||
|
|
||||||
|
if (!title) return null;
|
||||||
|
|
||||||
|
const detailUrl = absUrl(a.attr("href"));
|
||||||
|
let files = [];
|
||||||
|
let realPath = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (detailUrl) files = extractFileLinksFromDetail(detailUrl);
|
||||||
|
const firstFileUrl = files?.[0]?.url ? absUrl(files[0].url) : null;
|
||||||
|
if (firstFileUrl) {
|
||||||
|
realPath = await resolveRealFilePath(firstFileUrl);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
files = [];
|
||||||
|
realPath = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let detailHtmlPath = ''
|
||||||
|
try {
|
||||||
|
// Extract id and menu from URL: /public/list/data/detail/id/{id}/menu/{menu}/page/{page}
|
||||||
|
const urlMatch = detailUrl.match(/\/id\/(\d+)\/menu\/(\d+)/);
|
||||||
|
const id = urlMatch ? urlMatch[1] : null;
|
||||||
|
// const menu = urlMatch ? urlMatch[2] : null;
|
||||||
|
|
||||||
|
const detailPageHtml = curlHtml(detailUrl);
|
||||||
|
|
||||||
|
detailHtmlPath = `debug-menu-${menuId}-detail-${id}.html`
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(OUT, detailHtmlPath),
|
||||||
|
detailPageHtml,
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
if(realPath == null){
|
||||||
|
return {
|
||||||
|
title,
|
||||||
|
detailUrl: detailUrl || null,
|
||||||
|
detailPageHtml: detailHtmlPath, // ไฟล์จากหน้า detail
|
||||||
|
sourcePage: page,
|
||||||
|
sourceUrl: url,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('error :', error)
|
||||||
|
detailHtmlPath = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
title,
|
||||||
|
detailUrl: detailUrl || null,
|
||||||
|
fileUrl: files?.[0]?.url ? absUrl(files[0].url) : null, // ไฟล์จากหน้า detail
|
||||||
|
filePath: `https://ladsawai.go.th/public/` + realPath, // ✅ ของจริงจาก api /status/1/
|
||||||
|
detailPageHtml: detailHtmlPath ?? undefined, // ไฟล์จากหน้า detail
|
||||||
|
sourcePage: page,
|
||||||
|
sourceUrl: url,
|
||||||
|
};
|
||||||
|
}))
|
||||||
|
.filter(Boolean); // ตัด null ออก
|
||||||
|
|
||||||
|
const output = {
|
||||||
|
source: url,
|
||||||
|
scrapedAt: new Date().toISOString(),
|
||||||
|
menuId,
|
||||||
|
page,
|
||||||
|
count: items.length,
|
||||||
|
items,
|
||||||
|
};
|
||||||
|
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(OUT, `menu-${menuId}-page-${page}.json`),
|
||||||
|
JSON.stringify(output, null, 2),
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log(`✅ page ${page} -> items ${items.length}`);
|
||||||
|
return { $, items };
|
||||||
|
}
|
||||||
|
|
||||||
|
(async function main() {
|
||||||
|
const menuId = 1262;
|
||||||
|
|
||||||
|
const first = await scrapeOnePage(menuId, 1, true);
|
||||||
|
const totalPages = detectTotalPages(first.$);
|
||||||
|
console.log("✅ totalPages =", totalPages);
|
||||||
|
|
||||||
|
const all = [];
|
||||||
|
const seen = new Set();
|
||||||
|
|
||||||
|
function addItems(items) {
|
||||||
|
for (const it of items) {
|
||||||
|
const key = `${it.title}|${it.detailUrl || ""}|${it.filePath || ""}`;
|
||||||
|
if (seen.has(key)) continue;
|
||||||
|
seen.add(key);
|
||||||
|
all.push(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addItems(first.items);
|
||||||
|
|
||||||
|
for (let p = 2; p <= totalPages; p++) {
|
||||||
|
const { items } = await scrapeOnePage(menuId, p, false);
|
||||||
|
addItems(items);
|
||||||
|
}
|
||||||
|
|
||||||
|
const merged = {
|
||||||
|
menuId,
|
||||||
|
totalPages,
|
||||||
|
scrapedAt: new Date().toISOString(),
|
||||||
|
totalItems: all.length,
|
||||||
|
items: all,
|
||||||
|
};
|
||||||
|
|
||||||
|
const outAll = path.join(OUT, `menu-${menuId}-all.json`);
|
||||||
|
fs.writeFileSync(outAll, JSON.stringify(merged, null, 2), "utf8");
|
||||||
|
|
||||||
|
console.log("🎉 Saved all:", outAll);
|
||||||
|
console.log("🎉 Total unique:", all.length);
|
||||||
|
})();
|
||||||
43
manual/ประมวลจริยธรรม/manual.json
Normal file
43
manual/ประมวลจริยธรรม/manual.json
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"breadcrumb": "หน้าแรก > งานบริการ > ประมวลจริยธรรม",
|
||||||
|
"menuUrl": "https://ladsawai.go.th/public/list/data/index/menu/1287",
|
||||||
|
"scrapedAt": "2026-01-13T03:07:30.792Z",
|
||||||
|
"totalItems": 5,
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"title": "การจัดประชุมมอบนโยบายและชี้แจงแนวทางการปฏิบัติราชการให้แก่พนักงานเทศบาลและพนักงานจ้าง เทศบาลเมืองลาดสวาย ประจำปีงบประมาณ พ.ศ. 2568",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/3790/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_1550/files_3790_2.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"downloadCount": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "ประมวลจริยธรรมผู้บริหารท้องถิ่นและประมวลจริยธรรมสมาชิกสภาท้องถิ่น",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/3790/seq/2",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_1550/files_3790_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"downloadCount": 11
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "ประมวลจริยธรรมข้าราชการ พนักงานจ้าง ปี 67-69",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/9201/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_1550/files_9201_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"downloadCount": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "ข้อกำหนดจริยธรรมของข้าราชการ พนักงานจ้าง",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/9202/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_1550/files_9202_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"downloadCount": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "เจตนารมณ์ร่วมกันของหน่วยงาน",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/9203/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_1550/files_9203_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"downloadCount": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2259
การประเมินคุณธรรม และความโปร่งใส (ITA)/debug-menu-1262-page-1.html
Normal file
2259
การประเมินคุณธรรม และความโปร่งใส (ITA)/debug-menu-1262-page-1.html
Normal file
File diff suppressed because one or more lines are too long
63
การประเมินคุณธรรม และความโปร่งใส (ITA)/menu-1262-all.json
Normal file
63
การประเมินคุณธรรม และความโปร่งใส (ITA)/menu-1262-all.json
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"menuId": 1262,
|
||||||
|
"totalPages": 1,
|
||||||
|
"scrapedAt": "2026-01-13T07:08:01.360Z",
|
||||||
|
"totalItems": 7,
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"title": "การประเมินคุณธรรม และความโปร่งใส (ITA) พ.ศ.2568",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3404/menu/1262/page/1",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-3404.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "การประเมินคุณธรรมและความโปร่งใส (ITA) พ.ศ.2567",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/2990/menu/1262/page/1",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-2990.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "การประเมินคุณธรรมและความโปร่งใส (ITA) พ.ศ.2566",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/1988/menu/1262/page/1",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-1988.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "การประเมินคุณธรรมและความโปร่งใส (ITA) พ.ศ.2565",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/1373/menu/1262/page/1",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-1373.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "ขั้นตอนการดำเนินงานการกรอกข้อมูล (Integrity and Transparency Assessment : ITA)",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/830/menu/1262/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/2137/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_830/files_2137_1.pdf",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-830.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "รายงานผลการประชุมการประเมินคุณธรรมและความโปร่งใสในการดำเนินงานของหน่วยงานภาครัฐ (ITA)",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/829/menu/1262/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/2135/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_829/files_2135_1.pdf",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-829.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "การประเมินความเสี่ยงการทุจริต (ITA) ประจำปีงบประมาณ พ.ศ. 2562",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/821/menu/1262/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/2119/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_821/files_2119_1.pdf",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-821.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
64
การประเมินคุณธรรม และความโปร่งใส (ITA)/menu-1262-page-1.json
Normal file
64
การประเมินคุณธรรม และความโปร่งใส (ITA)/menu-1262-page-1.json
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"source": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1",
|
||||||
|
"scrapedAt": "2026-01-13T07:08:01.347Z",
|
||||||
|
"menuId": 1262,
|
||||||
|
"page": 1,
|
||||||
|
"count": 7,
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"title": "การประเมินคุณธรรม และความโปร่งใส (ITA) พ.ศ.2568",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3404/menu/1262/page/1",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-3404.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "การประเมินคุณธรรมและความโปร่งใส (ITA) พ.ศ.2567",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/2990/menu/1262/page/1",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-2990.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "การประเมินคุณธรรมและความโปร่งใส (ITA) พ.ศ.2566",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/1988/menu/1262/page/1",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-1988.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "การประเมินคุณธรรมและความโปร่งใส (ITA) พ.ศ.2565",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/1373/menu/1262/page/1",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-1373.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "ขั้นตอนการดำเนินงานการกรอกข้อมูล (Integrity and Transparency Assessment : ITA)",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/830/menu/1262/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/2137/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_830/files_2137_1.pdf",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-830.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "รายงานผลการประชุมการประเมินคุณธรรมและความโปร่งใสในการดำเนินงานของหน่วยงานภาครัฐ (ITA)",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/829/menu/1262/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/2135/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_829/files_2135_1.pdf",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-829.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "การประเมินความเสี่ยงการทุจริต (ITA) ประจำปีงบประมาณ พ.ศ. 2562",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/821/menu/1262/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/2119/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_821/files_2119_1.pdf",
|
||||||
|
"detailPageHtml": "debug-menu-1262-detail-821.html",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1262/page/1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"menuId": 1543,
|
||||||
|
"totalPages": 1,
|
||||||
|
"scrapedAt": "2026-01-13T06:34:29.997Z",
|
||||||
|
"totalItems": 4,
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"title": "บัญชีรายชื่อผู้สมัครรับเลือกตั้งสมาชิกสภาเมืองลาดสวาย ที่ได้รับสมัครรับเลือกตั้งและไม่ได้รับสมัครรับเลือกตั้ง เขต 3",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3555/menu/1543/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/8641/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_3555/files_8641_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "บัญชีรายชื่อผู้สมัครรับเลือกตั้งสมาชิกสภาเมืองลาดสวาย ที่ได้รับสมัครรับเลือกตั้งและไม่ได้รับสมัครรับเลือกตั้ง เขต 2",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3554/menu/1543/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/8639/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_3554/files_8639_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "บัญชีรายชื่อผู้สมัครรับเลือกตั้งสมาชิกสภาเมืองลาดสวาย ที่ได้รับสมัครรับเลือกตั้งและไม่ได้รับสมัครรับเลือกตั้ง เขต 1",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3553/menu/1543/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/8637/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_3553/files_8637_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "บัญชีรายชื่อผู้สมัครรับเลือกตั้งนายกเทศมนตรีเมืองลาดสวาย ที่ได้รับสมัครรับเลือกตั้งและไม่ได้รับสมัครรับเลือกตั้ง",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3552/menu/1543/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/8635/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_3552/files_8635_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"source": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1",
|
||||||
|
"scrapedAt": "2026-01-13T06:34:29.979Z",
|
||||||
|
"menuId": 1543,
|
||||||
|
"page": 1,
|
||||||
|
"count": 4,
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"title": "บัญชีรายชื่อผู้สมัครรับเลือกตั้งสมาชิกสภาเมืองลาดสวาย ที่ได้รับสมัครรับเลือกตั้งและไม่ได้รับสมัครรับเลือกตั้ง เขต 3",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3555/menu/1543/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/8641/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_3555/files_8641_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "บัญชีรายชื่อผู้สมัครรับเลือกตั้งสมาชิกสภาเมืองลาดสวาย ที่ได้รับสมัครรับเลือกตั้งและไม่ได้รับสมัครรับเลือกตั้ง เขต 2",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3554/menu/1543/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/8639/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_3554/files_8639_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "บัญชีรายชื่อผู้สมัครรับเลือกตั้งสมาชิกสภาเมืองลาดสวาย ที่ได้รับสมัครรับเลือกตั้งและไม่ได้รับสมัครรับเลือกตั้ง เขต 1",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3553/menu/1543/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/8637/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_3553/files_8637_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "บัญชีรายชื่อผู้สมัครรับเลือกตั้งนายกเทศมนตรีเมืองลาดสวาย ที่ได้รับสมัครรับเลือกตั้งและไม่ได้รับสมัครรับเลือกตั้ง",
|
||||||
|
"detailUrl": "https://ladsawai.go.th/public/list/data/detail/id/3552/menu/1543/page/1",
|
||||||
|
"fileUrl": "https://ladsawai.go.th/public/centermodules/data/loadattach/id/8635/seq/1",
|
||||||
|
"filePath": "https://ladsawai.go.th/public/list_upload/backend/list_3552/files_8635_1.pdf",
|
||||||
|
"sourcePage": 1,
|
||||||
|
"sourceUrl": "https://ladsawai.go.th/public/list/data/index/menu/1543/page/1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user