[🐘]今年伸びたトゥート
by
pacochi
2023-12-11 [2023/12/11 11:51:52]
JSON で出力します。
@@ -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 です。