scrapbox-api-helper
使い方
ESModuleから使う
code:js
import {fetchPages, fetchLinks, getProjectPageCount} from '/api/code/takker/scrapbox-api-helper/scrapboxAPI.js';
内容物
fetchPages
指定した数だけprojectのページ情報を取得する
code:script.d.ts
export 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のページ情報を取得する
code:scrapboxAPI.js
const 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を叩いてページ情報を取得する
.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の全リンク情報を取得する
code:scrapboxAPI.js
export 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のページ数を取得する
code:scrapboxAPI.js
export 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の更新日時を取得する
code:scrapboxAPI.js
export 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を取得する
code:scrapboxAPI.js
export 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();
} catch(e) {
throw e;
}
}