generated at
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を除けるようにした

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)); } }