generated at
scrapbox-api-helper
Scrapbox REST APIUserScriptから簡単に使えるようにする関数群

使い方
ESModuleから使う
js
import {fetchPages, fetchLinks, getProjectPageCount} from '/api/code/takker/scrapbox-api-helper/scrapboxAPI.js';

内容物
fetchPages
指定した数だけprojectのページ情報を取得する
api/pages/$projectに相当するが、取得したいページ情報の数を直接指定できるようにしてある
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のページ情報を取得する
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を叩いてページ情報を取得する 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.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のページ数を取得する
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の更新日時を取得する
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を取得する
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(); return json.image ?? 'https://scrapbox.io/assets/img/favicon/chrome-icon-144.png'; } catch(e) { throw e; } }

#2021-03-21 02:23:35
#2021-03-16 03:09:46
#2021-03-15 19:21:39
#2020-12-10 04:02:42