"heavyRequest triggered"
"subscribe 1" "first"
"subscribe 2" "first"
"heavyRequest triggered"
"subscribe 3" "first"
"subscribe 1" "second"
"subscribe 2" "second"
"subscribe 3" "second"
Название класса всегда одинаковое при перезагрузке страницы
[class^="items_"]
.// всякое
const EMPTY_NODE_LIST = Object.freeze(document.createElement('button').labels);
function getConstructorName(value) {
return Object.prototype.toString.call(value).replace(/^\[object (.*)\]$/, '$1');
}
function isPlainObject(value) {
return !!value && getConstructorName(value) === 'Object';
}
function isElement(value) {
return !!value && value.nodeType === 1 && getConstructorName(value).endsWith('Element');
}
// наблюдатель - важно что он отписывает себя на время колбэка, чтоб не поучилось вечного цикла
function tm_observe(callback, root, immediate = true) {
if(isPlainObject(root)) {
var options;
({root = document.body || document.documentElement, immediate = true, ...options} = root);
} else if (!isElement(root)) {
immediate = root === undefined ? true : root;
root = document.body || document.documentElement;
}
let stop = false;
const observer = new MutationObserver((mutationsList, observer) => {
disconnect();
stop = callback(mutationsList, observer) === true;
observe();
})
if(immediate) {
stop = callback([Object.setPrototypeOf({
type: 'childList',
target: root,
addedNodes: root.querySelectorAll(':scope > *'),
removedNodes: EMPTY_NODE_LIST,
previousSibling: null,
nextSibling: null,
attributeName: null,
attributeNamespace: null,
oldValue: null,
}, MutationRecord.prototype)], observer) === true;
}
const observe = () => !stop && observer.observe(root, {
childList: true,
subtree: true,
...options
});
const disconnect = () => observer.disconnect();
observe();
};
// ожидание по селектору с помощью наблюдателя
function waitSelector(root, selector) {
if (!selector) [selector, root] = [root, document];
return new Promise(resolve => tm_observe(() => {
const node = root.querySelector(selector);
if (!node) return;
resolve(node);
return true;
}));
}
await waitSelector('[class^="items_"]')
const {set, ...rest} = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked');
Object.defineProperty(HTMLInputElement.prototype, 'checked', {
set(value) {
value = !!value;
if(!this.dispatchEvent(new CustomEvent('before-checked', {
cancellable: true,
detail: value
}))) return false;
const res = set.call(this, value);
this.dispatchEvent(new CustomEvent('after-checked', {
detail: value
}));
return res;
},
...rest
})
input.addEventListener('after-checked', (event) => {
console.log('after-checked', event.target.checked, event.detail)
});
Object.defineProperty(HTMLInputElement.prototype, 'checked', { ...
->
Object.defineProperty(input, 'checked', { ...
next-auth/src
, вместо самого next-auth
, чего делать нельзя: src там чисто для справки. Это тянет за собой всё муть. Сделай поиск по проекту и исправь импорты."@next-auth/prisma-adapter": "^1.0.7",
"@prisma/client": "^5.18.0",
"prisma": "*",
import bcrypt from 'bcrypt';
import NextAuth, { NextAuthOptions } from 'next-auth'
import CredentialsProvider from 'next-auth/providers/credentials';
import GoogleProvider from 'next-auth/providers/google';
import { PrismaAdapter } from '@next-auth/prisma-adapter';
import { PrismaClient } from "@prisma/client"
const prisma = new PrismaClient()
export const authOptions: NextAuthOptions = {
adapter: PrismaAdapter(prisma),
providers: [
GoogleProvider({
clientId: '',
clientSecret: ''
})
]
};
"postin \"@next-auth/prisma-adapter\": \"^1.0.7\",\n \"@prisma/client\": \"^5.18.0\",stall": "prisma"
Переключи всё на vpn отключи всё левое, запусти сниффер и открой нетфликс. После чего проверь все ip\адреса куда он лез.
По поводу ручного мучительно добавления:
1. Если есть возможность - поставь себе https://www.asuswrt-merlin.net/ , это не убогий openwrt, так что с основной задачей роутера проблем не добавит, зато возожностей больше.
2. Иначе - постав себе autohotkey и\или tampermonkey и заскирптуй заполнение.:)