/*
* @title [?]ログ 500件くらい保存
* @description マストドンの自分のログを JSON で保存します。/web/* で実行してください。
* @include *
* @license MIT License
* @javascript_url
*/
// @include https://*/web/* だけどユーザスクリプトとして実行するようなやつでもないのでそのまま
void (async (
d = document,
// 40件ごとに二秒挟んでる
s = _ => new Promise(r => setTimeout(r, 2000)),
m = JSON.parse(d.querySelector('#initial-state').textContent).meta,
n = m ? 'https://' + location.host + '/api/v1/accounts/' + m.me + '/statuses?limit=40' : 0,
// アクセストークン要らなかったかも、為念で
a = m ? { headers: { Authorization: 'Bearer ' + m.access_token } } : {},
/*
u = location.href.match(/^(.+\/)web(\/accounts\/\d+)/),
n = u ? (u[1] + 'api/v1' + u[2] + '/statuses?limit=40') : 0,
t = JSON.parse(d.querySelector('#initial-state').textContent).meta.access_token,
a = t ? { headers: { Authorization: 'Bearer ' + t } } : {},
*/
l = [],
p = prompt('取得の目安', '500'),
h
) => {
while (n && l.length < p) {
await fetch(n, a).then(r => ((
n = (r.headers.has('Link') && (h = r.headers.get('Link').match(/<(.+?)>; rel="next"/))) ? h[1] : 0
), r.json())).then(j => (
// 自分のアカウントデータ削ってる
l = l.concat(j.map ? j.map(i => (delete i.account, i)) : [])
));
console.log(l.length, n);
await s();
}
// リンクにするとファイル名指定できるけど今回やってない
location.href = URL.createObjectURL(new Blob([JSON.stringify(l)], { type: 'application/octet-stream' }));
})();