scrapboxのproject情報を一括して取得するUserScript
/scrapboxlab/api/projectsを使えばScrapbox projectの情報を一括取得できるが、おそらく100個以上のprojectを一度に取得しようとすると431 Request Header Fields Too Largeが発生してしまうので、分割して取得するためのUserScriptを書いた
2021-06-19
21:57:07 includeJoinedがfalseのときに重複を除けていなかった
15:55:57 データを取得できなかったproject(=存在しないか閲覧できないproject)は除くようにした
15:46:15 参加しているprojectのうちprojectIdsにないprojectを除けるようにした
cf. scrapbox-link-database@0.2.0#60cd91d31280f0000075c13e
code:script.js
export async function getProjectInfo(projectIds, {includeJoined = true} = {}) {
const chunkNum = Math.floor(projectIds.length / 100) + 1;
const result = await Promise.all(...Array(chunkNum).keys()
.map(async index => {
const params = new URLSearchParams();
projectIds.slice(index * 100, 100 + index * 100).forEach(id => params.append('ids', id));
const res = await fetch(/api/projects?${params.toString()});
const {projects} = await res.json();
return projects;
}));
const projects = result.flat();
if (includeJoined) {
// 重複を取り除く
const ids = ...new Set(projects.map(({id}) => id));
return ids.map(id => projects.find(project => project.id === id));
} else {
// projectIdsにあるprojectのみ返す
return ...new Set(projects.map(({id}) => id))
.filter(id => projectIds.some(_id => _id === id))
.map(id => projects.find(project => project.id === id));
}
}