非公開 [🐘]今年伸びたトゥート

    @@ -4,45 +4,54 @@ * @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 } } : {}, + m = JSON.parse(document.querySelector('#initial-state').textContent).meta, + n = `https://${m.domain}/api/v1/accounts/${m.me}/statuses?limit=40`, + a = { headers: { Authorization: 'Bearer ' + m.access_token } }, l = {}, c = [], p = BigInt(new Date(new Date().getFullYear(), 0, 0, 24, 0, 0).getTime()), o = BigInt(Date.now()), - h, f + t = 0, + h, f, j ) => { while (n && o > 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 => (j.map ? j.map(i => (delete i.account, i)) : []).forEach(i => { - f = i.favourites_count; - o = BigInt(i.id) >> 16n; - if (c.length < 10 || c[0] <= f) { - c = [...new Set([f, ...c])]; - c.sort((a, b) => a > b ? 1 : a < b ? -1 : 0); - if (c.length > 10) delete(l[c.shift()]); - l[f] ||= []; - l[f].push(i); - } - })); - console.log(new Date(Number(o)).toLocaleString()); + j = await fetch(n, a).then(r => r.ok && (h = r).json()).catch(console.error); + if (j) { + t = 0; + n = h.headers.get('Link')?.match(/<(.+?)>; rel="next"/)?.[1]; + j.forEach(i => { + f = i.favourites_count; + o = BigInt(i.id) >> 16n; + if (c.length < 10 || c[0] <= f) { + c = [...new Set([f, ...c])]; + c.sort((a, b) => a - b); + if (c.length > 10) delete(l[c.shift()]); + delete i.account; + l[f] ||= []; + l[f].push(i); + } + }); + console.log(new Date(Number(o)).toLocaleString(),c,l); + } else { + console.error('failed', n, h); + if (++t > 4) n = 0; + } await s(); } // リンクにするとファイル名指定できるけど今回やってない - location.href = URL.createObjectURL(new Blob([JSON.stringify(l)], { type: 'application/octet-stream' })); + open(URL.createObjectURL(new Blob([JSON.stringify(l)], { type: 'application/octet-stream' }))); -})(); +})();
  • /*
     * @title [🐘]今年伸びたトゥート
     * @description JSON で出力します。
     * @include *
     * @license MIT License
     * @javascript_url
     * @private
     */
     
    // @include https://*/web/* だけどユーザスクリプトとして実行するようなやつでもないのでそのまま
    
    
    void (async (
     // 40件ごとに二秒挟んでる
     s = _ => new Promise(r => setTimeout(r, 2000)),
     m = JSON.parse(document.querySelector('#initial-state').textContent).meta,
     n = `https://${m.domain}/api/v1/accounts/${m.me}/statuses?limit=40`,
     a = { headers: { Authorization: 'Bearer ' + m.access_token } },
     l = {},
     c = [],
     p = BigInt(new Date(new Date().getFullYear(), 0, 0, 24, 0, 0).getTime()),
     o = BigInt(Date.now()),
     t = 0,
     h, f, j
    ) => {
    
    	while (n && o > p) {
    
    		j = await fetch(n, a).then(r => r.ok && (h = r).json()).catch(console.error);
    		if (j) {
    			t = 0;
    			n = h.headers.get('Link')?.match(/<(.+?)>; rel="next"/)?.[1];
    			j.forEach(i => {
    				f = i.favourites_count;
    				o = BigInt(i.id) >> 16n;
    				if (c.length < 10 || c[0] <= f) {
    					c = [...new Set([f, ...c])];
    					c.sort((a, b) => a - b);
    					if (c.length > 10) delete(l[c.shift()]);
    					delete i.account;
    					l[f] ||= [];
    					l[f].push(i);
    				}
    			});
    			console.log(new Date(Number(o)).toLocaleString(),c,l);
    		} else {
    			console.error('failed', n, h);
    			if (++t > 4) n = 0;
    		}
    		await s();
    
    	}
    
    	// リンクにするとファイル名指定できるけど今回やってない
    	open(URL.createObjectURL(new Blob([JSON.stringify(l)], { type: 'application/octet-stream' })));
    
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2023/12/11 11:51:53 - 2023-12-11
  2. 2022/12/08 15:40:59 - 2022-12-08
  3. 2022/12/08 15:38:42 - 2022-12-08