[🐘]ログ全部保存 Fork

    @@ -1,9 +1,10 @@ /* - * @title [🐘]ログ 500件くらい保存 - * @description マストドンの自分のログを JSON で保存します。/web/* で実行してください。 + * @title [🐘]ログ全部保存 + * @description マストドンの自分のログを 2000件ずつ JSON で保存します。/web/* で実行してください。 * @include * * @license MIT License * @javascript_url + * @private */ // @include https://*/web/* だけどユーザスクリプトとして実行するようなやつでもないのでそのまま
    @@ -23,11 +24,12 @@ a = t ? { headers: { Authorization: 'Bearer ' + t } } : {}, */ l = [], - p = prompt('取得の目安', '500'), + q = 0, + p = document.body.appendChild(Object.assign(document.createElement('p'), { style: 'position:absolute;z-index:99999;top:0px;right:0px;background:black;' })), h ) => { - while (n && l.length < p) { + while (n) { await fetch(n, a).then(r => (( n = (r.headers.has('Link') && (h = r.headers.get('Link').match(/<(.+?)>; rel="next"/))) ? h[1] : 0
    @@ -35,12 +37,23 @@ // 自分のアカウントデータ削ってる l = l.concat(j.map ? j.map(i => (delete i.account, i)) : []) )); - console.log(l.length, n); + console.log(q + l.length, n); + + if (l.length >= 2000 || !n) { + + q += l.length; + p.appendChild(Object.assign(document.createElement('a'), { + href: URL.createObjectURL(new Blob([JSON.stringify(l)], { type: 'application/octet-stream' })), + download: q + '.json', + innerText: '[' + q + ']', + style: 'display:block;' + })); + l = []; + + } + await s(); } - // リンクにするとファイル名指定できるけど今回やってない + })();- location.href = URL.createObjectURL(new Blob([JSON.stringify(l)], { type: 'application/octet-stream' })); - - })();
  • /*
     * @title [🐘]ログ全部保存
     * @description マストドンの自分のログを 2000件ずつ JSON で保存します。/web/* で実行してください。
     * @include *
     * @license MIT License
     * @javascript_url
     * @private
     */
     
    // @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 = [],
     q = 0,
     p = document.body.appendChild(Object.assign(document.createElement('p'), { style: 'position:absolute;z-index:99999;top:0px;right:0px;background:black;' })),
     h
    ) => {
    
    	while (n) {
    
    		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(q + l.length, n);
    		
    		if (l.length >= 2000 || !n) {
    		
    			q += l.length;
    			p.appendChild(Object.assign(document.createElement('a'), {
    			href: URL.createObjectURL(new Blob([JSON.stringify(l)], { type: 'application/octet-stream' })),
    			download: q + '.json',
    			innerText: '[' + q + ']',
    			style: 'display:block;'
    			}));
    			l = [];
    		
    		}
    		
    		await s();
    
    	}
    
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。