長いページランキング作成スクリプト
もっともこっちは文字数を返さないな〜
Summer498.icon
1. fetch 回数の削減
変数 pageLimit を追加。
→ 100ページ毎に fetch していたのを可変になるように変更。
pageLimit を 1000 にして 1000 ページずつ fetch するように変更。
これにより送信リクエスト数を 1/10 にする。
2. 出力個数の制限解除
元の処理:記録を吐き出す際に全部 fetch して全部 sort した後で slice している
シンプルにデータを捨てているだけで勿体ない。
marked.slice(0, 500) を marked に変更。
code:createRank.ts
interface ScrapboxPagesJson {
count: number;
pages: { title: string; charsCount: number }[];
}
const pageLimit = 1000;
const getList = (projectName: string, offset: number) => {
return fetch(
projectName +
/?limit=${pageLimit}&skip= +
encodeURIComponent(offset),
).then((pageRes) => {
if (pageRes.ok) {
return pageRes.json();
} else {
return { pages: [] };
}
}).then((pageJson: ScrapboxPagesJson) => {
return pageJson.pages;
});
};
const allpagelist = (pjname: string) => {
const spinner = Spinner.getInstance();
spinner.start("Fetching All Page List...");
const projectName: string = pjname;
const marked: { title: string; charsCount: number }[] = [];
(pageRes) => {
if (!pageRes.ok) {
throw Error;
}
return pageRes.json();
},
).then((pageJson: Readonly<ScrapboxPagesJson>) => {
const arrayRange = (start: number, stop: number, step: number) =>
Array.from(
{ length: (stop - start) / step + 1 },
(_, index) => start + index * step,
);
const getiter = arrayRange(0, pageJson.count, pageLimit);
function getitertick():Promise<void>|void {
const element = getiter.shift();
if (typeof element == "undefined") {
return;
}
spinner.setText(
"Fetching All Page List...[" +
element.toString().padStart(pageJson.count.toString().length) +
"/" +
pageJson.count +
"]",
);
return getList(projectName, element).then((pages) => {
marked.push(...pages);
return getitertick();
});
}
return getitertick();
}).then(() => {
spinner.succeed("Fetched All Page List");
spinner.stop();
marked.sort((a, b) => b.charsCount - a.charsCount);
let scrapchar = "";
for (const element2 of marked) {
scrapchar += " + element2.title + " (" + element2.charsCount +
"文字)\n";
}
return scrapchar;
});
};
allpagelist("villagepump").then((a) => {
return Deno.writeTextFile(
"villagepumpsoko.txt",
a,
);
});