import fs from "fs";
import path from 'path';
import axios from "axios";
import * as cheerio from "cheerio";
import { ArgumentParser } from "argparse";
const getPaperUrls = async (year: number): Promise => {
let hasNextPage = true;
let pageIndex = 0;
const ret: string[] = [];
while (hasNextPage) {
const response = await axios.get(
"https://sousuo.www.gov.cn/search-gov/data",
{
params: {
// 不区分发布机构 `?t=zhengcelibrary_gw_bm_gb`
// 分发布机构国务 `?t=zhengcelibrary_gw` 即 gw - 国务
// 国务院部门文件 `?t=zhengcelibrary_bm` 即 bm - 部门
// 国务院公报文件 `?t=zhengcelibrary_gb` 即 gb - 公报
t: "zhengcelibrary_gw",
p: pageIndex,
n: 5,
q: `假期 ${year}`,
pcodeJiguan: "国办发明电",
puborg: "国务院办公厅",
filetype: "通知",
sort: "pubtime",
},
}
);
if (response.status !== 200) {
throw new Error(`Request failed with status code ${response.status}`);
}
const data = response.data;
if (data.code === 1001) {
return [];
}
if (data.code !== 200) {
throw new Error(`Error: ${data.code}: ${data.msg}`);
}
for (const item of data.searchVO.listVO) {
if (item.title.includes(year.toString())) {
ret.unshift(item.url);
}
}
pageIndex += 1;
hasNextPage = pageIndex < data.searchVO.totalpage;
}
return ret;
};
const getPaper = async (url: string): Promise => {
const response = await axios.get(url);
if (response.status !== 200) {
throw new Error(`Request failed with status code ${response.status}`);
}
const $ = cheerio.load(response.data);
const container = $("#UCAP-CONTENT");
if (!container.length) {
throw new Error(`Cannot get paper container from url: ${url}`);
}
const paragraphs = container.html()?.replace(/
/g, "
");
const p = cheerio.load(paragraphs || "")("p");
const ret = p
.map((_, el) => $(el).text().trim())
.get()
.join("\n");
if (!ret) {
throw new Error(`Cannot get paper content from url: ${url}`);
}
return ret;
};
const fetchHoliday = async (year: number): Promise => {
const paperUrls = await getPaperUrls(year);
const papers: string[] = [];
for (const url of paperUrls) {
const paper = await getPaper(url);
papers.push(paper);
}
return papers.join("\n");
};
const main = async () => {
const parser = new ArgumentParser();
parser.addArgument("year", { type: "int" });
const args = parser.parseArgs();
const year = args.year;
console.log(`Fetching holiday for ${year}...`);
let result = await fetchHoliday(year);
if (result && result.length > 0) {
console.log(result)
result = result.split('\n').map(line => `${line}
`).join('')
const outputPath = process.env.GITHUB_OUTPUT;
const holidaysFile = path.join(process.cwd(), 'holidays.html');
fs.writeFileSync(holidaysFile, result);
if (outputPath) {
fs.appendFileSync(outputPath, `holidays=${holidaysFile}\n`);
}
} else {
console.log('No holidays found.');
}
};
main().catch((error) => {
console.error(error);
process.exit(1);
});