您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Sistema para Seguir Usuarios, tendo Notificação simples de Novos Posts
当前为
// ==UserScript== // @name Tab News - Sistema de Seguir Usuarios // @namespace cedroca-scripts // @version 2.0 // @description Sistema para Seguir Usuarios, tendo Notificação simples de Novos Posts // @author Diegiwg (Diego Queiroz) // @run-at document-start // @match https://www.tabnews.com.br/* // @icon https://www.google.com/s2/favicons?sz=64&domain=tabnews.com.br // ==/UserScript== const TEMPO_DE_ATUALIZACAO_DOS_POSTS = 60_000; const TEMPO_DE_ATUALIZACAO_DA_GUI = 200; class BancoDeDados { constructor() { this.instancia = window.localStorage; } set(nome_usuario, valor) { const usuario = `tabnews-sistema-seguir-usuarios-${nome_usuario}`; this.instancia.setItem(usuario, JSON.stringify(valor)); } get(nome_usuario) { const usuario = `tabnews-sistema-seguir-usuarios-${nome_usuario}`; return JSON.parse(this.instancia.getItem(usuario)); } remove(nome_usuario) { const usuario = `tabnews-sistema-seguir-usuarios-${nome_usuario}`; this.instancia.removeItem(usuario); } usuarios_seguidos() { const usuarios = []; Object.keys(this.instancia).forEach((item) => { if (item.indexOf("tabnews-sistema-seguir-usuarios-") !== -1) usuarios.push( item.replace("tabnews-sistema-seguir-usuarios-", "") ); }); return usuarios; } } async function fazer_requisicao_para_api(nome_usuario, pagina) { return await ( await fetch( `https://www.tabnews.com.br/api/v1/contents/${nome_usuario}?strategy=new&page=${pagina}` ) ).json(); } async function buscar_posts_por_usuario(nome_usuario, pagina) { const resposta_da_api = await fazer_requisicao_para_api( nome_usuario, pagina ); return resposta_da_api.filter((item) => { return item.title !== null; }); } async function atualizar_dados_de_usuario(banco_de_dados, nome_usuario) { let dados_do_usuario = banco_de_dados.get(nome_usuario) || { existe: false, posts: {}, }; const posts = dados_do_usuario.posts; let pagina = 1; let continuar_loop = true; while (continuar_loop) { const resultado = await buscar_posts_por_usuario(nome_usuario, pagina); if (resultado.length === 0) continuar_loop = false; resultado.forEach((post) => { if (posts[post.id] !== undefined) return (continuar_loop = false); post.novo = dados_do_usuario.existe; posts[post.id] = post; }); pagina++; } dados_do_usuario.existe = true; banco_de_dados.set(nome_usuario, dados_do_usuario); } function buscar_novos_posts_dos_usuarios_seguidos(banco_de_dados) { banco_de_dados .usuarios_seguidos() .forEach((nome_usuario) => atualizar_dados_de_usuario(banco_de_dados, nome_usuario) ); } function gerar_html_menu_seguidos(banco_de_dados) { const node_menu = document.querySelector('[role="menu"] li:nth-child(3)'); const node_seguidos = document.querySelector("#menu-seguidos"); if (node_menu === null) return; const html = (novos_posts) => { return `<li items="0" id="menu-seguidos" class="Item__LiBox-sc-yeql7o-0 ipvwXw"><a class="Link-sc-hrxz1n-0 bnQotb Link-sc-hrxz1n-0 bnQotb" href="/seguidos"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-1gh2r6s-0 hwTILH"><span id="react-aria-20" class="Box-sc-1gh2r6s-0 kfLORv">Usuarios seguidos: novos conteúdos (${novos_posts})</span></div></a></li>`; }; let novos_posts = 0; const usuarios = banco_de_dados.usuarios_seguidos(); usuarios.forEach((nome_usuario) => { const dados = banco_de_dados.get(nome_usuario); const posts = Object.keys(dados.posts); posts.forEach((post) => { if (dados.posts[post].novo) novos_posts++; }); }); if (node_menu != null && node_seguidos == null) return (node_menu.outerHTML += html(novos_posts)); if (node_seguidos.attributes.items !== novos_posts) { node_seguidos.attributes.items = novos_posts; node_seguidos.querySelector( "span" ).textContent = `Usuarios seguidos: novos conteúdos (${novos_posts})`; } } function gerar_html_botao_seguir(banco_de_dados) { const node_nome_usuario = document.querySelector(".Pagehead-sc-17d52hr-0"); if (node_nome_usuario === null) return; const nome_usuario = node_nome_usuario.textContent.trim(); const dados_usuario = banco_de_dados.get(nome_usuario); const node_botao_seguir = document.querySelector("#node-seguir"); if (node_botao_seguir === null) return (node_nome_usuario.outerHTML += `<div id="node-seguir"></div>`); if (node_botao_seguir.className !== "node-seguir-style") { node_botao_seguir.style = ` width: 100px; height: 30px; border: 1px solid rgb(20, 21, 22); border-radius: 20px; background-color: rgb(36, 41, 47); color: rgb(255, 255, 255); text-align: center; `; node_botao_seguir.className = "node-seguir-style"; node_botao_seguir.onclick = () => { if (node_botao_seguir.textContent === "Seguir") { atualizar_dados_de_usuario(banco_de_dados, nome_usuario); } else { banco_de_dados.remove(nome_usuario); } }; } if (dados_usuario === null) node_botao_seguir.textContent = "Seguir"; else node_botao_seguir.textContent = "Seguindo"; } function gerar_html_pagina_seguidos(banco_de_dados) { if (document.URL !== "https://www.tabnews.com.br/seguidos") return; const node_principal = document.querySelector(".kraPei"); if (node_principal.id === "page-load") return; document.title = "Usuarios Seguidos"; node_principal.innerHTML = "<ul></ul>"; const node_lista_posts = node_principal.querySelector("ul"); const usuarios = banco_de_dados.usuarios_seguidos(); usuarios.forEach((nome_usuario) => { const dados = banco_de_dados.get(nome_usuario); const posts = Object.keys(dados.posts); posts.forEach((post_id) => { const post = dados.posts[post_id]; let background = "#989898"; if (post.novo) { background = "#d0d0d0"; post.novo = false; } node_lista_posts.innerHTML += ` <li style=" background: ${background}; color: #fff; text-transform: capitalize; padding: 10px; border-radius: 10px; margin-bottom: 10px; "> <a href="https://www.tabnews.com.br/${post.owner_username}/${post.slug}">"${post.title}"</a>, postado por <a href="https://www.tabnews.com.br/${post.owner_username}">${post.owner_username}</a></li> `; }); banco_de_dados.set(nome_usuario, dados); }); node_principal.id = "page-load"; } const banco_de_dados = new BancoDeDados(); setInterval(() => { gerar_html_menu_seguidos(banco_de_dados); gerar_html_botao_seguir(banco_de_dados); gerar_html_pagina_seguidos(banco_de_dados); }, TEMPO_DE_ATUALIZACAO_DA_GUI); setInterval(() => { buscar_novos_posts_dos_usuarios_seguidos(banco_de_dados); }, TEMPO_DE_ATUALIZACAO_DOS_POSTS);
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址