ScrapboxのAPI取得支援関数を作る
作った
/icons/hr.icon
何度も何度もおんなじコード書くのめんどくさので支援関数を作っておこうtakker.icon 特徴
自動的に全ての情報をfetchするように働く
parametersはoptionから渡す
sort順とか
対象のAPI
fetchPages
fetchLinks
もしかしたら作るかもしれない
出来たら別ページに貼り付ける
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;
}
}
js-script-button.iconテスト用コード
code:script.js
import {fetchLinks} from '/api/code/takker/ScrapboxのAPI取得支援関数を作る/scrapboxAPI.js';
export function execute() {
fetchLinks({project: 'villagepump'}).then(pages => console.log(pages));
}