scrapbox-api-helper
使い方
ESModuleから使う
jsimport {fetchPages, fetchLinks, getProjectPageCount} from '/api/code/takker/scrapbox-api-helper/scrapboxAPI.js';
内容物
fetchPages
指定した数だけprojectのページ情報を取得する
script.d.tsexport function fetchPages(props: {project: string; limit?: number; sort?: number}): Promise<{/* 略 */}>;
引数
project
: 取得先のproject名
(optional) limit
: 取得したいページ情報の上限
未指定 or undefined
だとprojectに存在する全てのページ情報を取得する
(optional) sort
: ページ情報の並び替え方法
updated
, created
, accessed
, linked
, views
, title
のどれかを指定する
defaultは updated
返り値
取得できたページ情報の配列
fetchLinks
projectの全リンク情報を取得する
引数
project
: 取得先のproject名
getProjectPageCount
projectのページ数を取得する
空ページを除いた数
引数
project
: 取得先のproject名
返り値
projectのページ数
projectのページ情報を取得する
scrapboxAPI.jsconst SORTS = [
'updated',
'created',
'accessed',
'linked',
'views',
'title',
];
export async function fetchPages({
project,
limit = undefined, // undefinedで全てのページ情報を取得する
sort = 'updated',
}={}) {
const pageNum = limit ?? await getProjectPageCount({project}); //取得するページ数
const limitParam = pageNum > 1000 ? 1000 : pageNum; // APIで一度に取得するページ数
const maxIndex = pageNum > 1000 ? Math.floor(pageNum / 1000) + 1 : 1; // APIを叩く回数
const pages = []; // ページ情報を格納する配列
if(!SORTS.includes(sort)) throw Error(`Invalid sort parameter: ${sort}`);
// 一気にAPIを叩いてページ情報を取得する
const promises = [...Array(maxIndex)]
.map(async (_, index) => {
const json = await fetch(`/api/pages/${project}/?limit=${limitParam}&skip=${index*1000}&sort=${sort}`)
.then(res => res.json());
pages.push(...json.pages);
});
// 全部取得できたら返却する
await Promise.all(promises);
return pages;
}
projectの全リンク情報を取得する
scrapboxAPI.jsexport async function fetchLinks({project}) {
let followingId = null;
const linksData = [];
const promises = []; //処理待ち用
do {
const response = await (!followingId ?
fetch(`/api/pages/${project}/search/titles`) :
fetch(`/api/pages/${project}/search/titles?followingId=${followingId}`)
)
followingId = response.headers.get('X-Following-Id');
promises.push(response.json().then(links => linksData.push(...links)));
} while(followingId);
// 全てのリンク情報を配列に格納し終わったら返す
await Promise.all(promises);
return linksData;
}
projectのページ数を取得する
scrapboxAPI.jsexport async function getProjectPageCount({project}) {
try {
const response = await fetch(`/api/pages/${project}/?limit=1`);
if(!response.ok) throw Error(`Invalid response. status code: ${response.status}`);
const json = await response.json();
return parseInt(json.count);
} catch(e) {
throw e;
}
}
projectの更新日時を取得する
scrapboxAPI.jsexport async function getProjectUpdated(project) {
try {
const response = await fetch(`/api/projects/${project}`);
if(!response.ok) throw Error(`Invalid response. status code: ${response.status}`);
const {updated} = await response.json();
return updated;
} catch(e) {
throw e;
}
}
projectのfaviconを取得する
scrapboxAPI.jsexport async function getFavicon(project) {
try {
const response = await fetch(`/api/projects/${project}`);
if(!response.ok) throw Error(`Invalid response. status code: ${response.status}`);
const json = await response.json();
return json.image ?? 'https://scrapbox.io/assets/img/favicon/chrome-icon-144.png';
} catch(e) {
throw e;
}
}