[{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/automacao/","section":"Tags","summary":"","title":"Automacao","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/series/ghost-profile/","section":"Series","summary":"","title":"Ghost Profile","type":"series"},{"content":"Linhares, domingo, 11 de outubro de 2026 — 16h10 Por Douglas Buzatto Vago\nMinha conta do Instagram é de 2012. Quatorze anos de comentários espalhados por posts de amigos, páginas que nem existem mais, discussões que eu não lembro de ter entrado e piadas que só faziam sentido naquela época.\nUm dia bateu a vontade de higienizar o perfil. E aí veio a primeira descoberta: o Instagram não tem botão de \u0026ldquo;apagar todos os meus comentários\u0026rdquo;. Tem uma tela, Sua atividade → Interações → Comentários, onde você vai marcando de um em um.\nCom milhares de comentários, isso não é tarefa, é castigo.\nA ideia é velha, a execução é nova # A primeira vez que pensei nisso foi em dezembro de 2024. Achava que dava para achar meus comentários com busca avançada no Google e apagar uns 50 por dia. A ideia ficou na gaveta.\nEm setembro de 2026 eu tirei da gaveta, com uma regra que não abri mão:\nSó a interface oficial. Nada de API privada, nada de endpoint interno, nada de interceptar tráfego.\nA API oficial da Meta só atende contas comerciais e não foi feita pra isso. O GraphQL interno e o mitmproxy até funcionariam, mas o risco de banimento é real, e eu não ia arriscar uma conta de 2012 por pressa. Então a ferramenta faz exatamente o que eu faria com o mouse, numa sessão de navegador já logada. Só que com paciência infinita.\nNasceu o ghost profile.\nColetar, curar, excluir # A arquitetura ficou em três etapas, e uma só libera quando a anterior termina:\nColeta: o navegador percorre a tela de comentários e grava tudo num banco SQLite, um por conta. Curadoria: uma página HTML local, servida na minha própria máquina, mostra tudo o que foi coletado. Eu marco o que apagar e o que manter, filtrando por período. Exclusão: em lotes pequenos, com ritmo de gente. A stack é simples de propósito: Python + Playwright com o Chromium gerenciado pelo próprio Playwright, SQLite, e o servidor HTTP da biblioteca padrão do Python para o painel. Nada sai da máquina: senha, cookie e dados da conta ficam no meu disco.\nAs pedras no caminho # O 2FA a cada execução # A primeira versão salvava a sessão em cookies. Toda vez que eu rodava, o Instagram desconfiava e pedia o código de novo. A solução foi usar um perfil persistente do Chromium (launch_persistent_context): o navegador guarda o perfil inteiro como se fosse o meu Chrome de sempre. Logou uma vez, ficou logado.\nBotões que não querem ser clicados # A interface do Instagram é montada por um framework próprio, e muitos botões ficam com uma camada por cima que \u0026ldquo;rouba\u0026rdquo; o clique. O Playwright reclamava que outro elemento intercepts pointer events e a execução morria no meio.\nA saída foi clicar via JavaScript, direto no elemento:\nelemento.evaluate(\u0026#34;el =\u0026gt; el.click()\u0026#34;) Troquei todos os cliques por esse padrão e o problema sumiu.\nSeletores que não quebram # Classes CSS do Instagram mudam o tempo todo, porque são geradas automaticamente. Então a ferramenta nunca usa classe: só role e aria-label, os atributos de acessibilidade. Eles existem para leitores de tela, e por isso mudam muito menos. Ficaram estáveis do começo ao fim.\nRolar até o fim do mundo # A primeira coleta era rolagem infinita: descer, descer, descer. Lento e frágil. A virada foi usar o filtro de data do próprio Instagram e varrer a conta em janelas trimestrais, de três em três meses. A coleta ficou muito mais rápida e previsível.\nDatas que envelhecem # O Instagram mostra datas relativas: \u0026ldquo;3 sem\u0026rdquo;, \u0026ldquo;2 a\u0026rdquo;. Se eu guardasse isso, o mesmo comentário pareceria outro na coleta seguinte, porque \u0026ldquo;3 sem\u0026rdquo; vira \u0026ldquo;4 sem\u0026rdquo;. Duas decisões resolveram:\na chave de deduplicação usa autor, texto e miniatura do post, nunca a data; a data estimada é calculada no momento da coleta (agora menos \u0026ldquo;3 sem\u0026rdquo;) e gravada fixa. Onde está # No último registro, o banco tinha 2.589 comentários coletados, e as primeiras dezenas já foram apagadas. O ritmo é conservador de propósito: a Meta não publica limites para exclusão de comentários, e ação rápida demais em sequência pode render um bloqueio temporário. Entre os lotes, a ferramenta faz pausas aleatórias e agrupa os alvos por período para não rolar a lista inteira toda vez.\nAinda tem um bug sendo domado: a miniatura do post às vezes vem vazia de um lado e não do outro, e a exclusão não acha o alvo. A correção foi usar o texto como chave principal e a miniatura só como desempate.\nPróximos passos # Curtidas e reposts: o mesmo esquema de coleta, curadoria e exclusão, como novos módulos do ghost profile. Talvez um serviço: muita gente tem o mesmo problema que eu. Higienizar perfil antes de uma entrevista de emprego, de um concurso ou só para virar a página. Cobrar pelo volume ou pelo recorte (\u0026ldquo;só o último ano\u0026rdquo;, \u0026ldquo;só esses 100\u0026rdquo;) faz sentido. Uma observação honesta: automatizar a interface de qualquer rede social é uma área cinzenta nos termos de uso. Por isso a ferramenta só mexe na minha própria conta, imita o ritmo de uma pessoa e não toca em nada que eu não pudesse fazer com o dedo.\nO objetivo, no fim, é simples: decidir o que da minha história online fica de pé.\ndouglas@undersystem:~/projetos/instagram-cleanup$ python3 server.py [ ghost profile ] painel em http://127.0.0.1:8777 [ coleta ] 2589 comentários no banco [ exclusão ] modo fantasma: lento, paciente, invisível ","date":"11 outubro 2026","externalUrl":null,"permalink":"/posts/ghost-profile-parte-1/","section":"Posts","summary":"Minha conta do Instagram é de 2012. O app não tem botão de ‘apagar tudo’, a API oficial não serve pra isso e eu não queria arriscar a conta. Então construí uma ferramenta que faz o que eu faria na mão, só que com paciência infinita.","title":"Ghost profile: limpando 14 anos de comentários do Instagram sem API","type":"posts"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/ghost-profile/","section":"Tags","summary":"","title":"Ghost-Profile","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/","section":"home-lab-vago","summary":"","title":"home-lab-vago","type":"page"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/instagram/","section":"Tags","summary":"","title":"Instagram","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/playwright/","section":"Tags","summary":"","title":"Playwright","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/privacidade/","section":"Tags","summary":"","title":"Privacidade","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/categories/projetos/","section":"Categories","summary":"","title":"Projetos","type":"categories"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/sqlite/","section":"Tags","summary":"","title":"Sqlite","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/home-lab/","section":"Tags","summary":"","title":"Home-Lab","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/linhares/","section":"Tags","summary":"","title":"Linhares","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/lora/","section":"Tags","summary":"","title":"Lora","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/meshtastic/","section":"Tags","summary":"","title":"Meshtastic","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/radio/","section":"Tags","summary":"","title":"Radio","type":"tags"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/categories/r%C3%A1dio/","section":"Categories","summary":"","title":"Rádio","type":"categories"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/series/reator-4/","section":"Series","summary":"","title":"Reator 4","type":"series"},{"content":"Linhares, domingo, 11 de outubro de 2026 — 13h15 Por Douglas Buzatto Vago\nAcordei cedo. Umas 7h40, talvez 8h, não lembro direito. Domingo, casa quieta, café, e aquela vontade de mexer em alguma coisa que não fosse trabalho.\nA coisa da vez foi LoRa.\n\u0026ldquo;Quero um LoRa. Potente. Nada de iniciante.\u0026rdquo; # Foi assim que começou. E a primeira resposta que recebi foi uma pergunta: LoRa, o rádio, ou LoRA, o fine-tuning de IA? Justo. Em 2026 as duas palavras disputam o mesmo espaço na cabeça de quem mexe com tecnologia. Era o rádio.\nE aí veio a primeira lição do dia: em LoRa, \u0026ldquo;potente\u0026rdquo; não é potência de transmissão. O TX é limitado por regulação. O que dá alcance de verdade é antena boa, bem posicionada, RF limpo e altura. Muita altura.\nMesh, não LoRaWAN # A segunda lição foi separar as duas coisas que todo mundo mistura:\nLoRaWAN é estrela: sensor → gateway → servidor. Serve pra telemetria, medidor, nível de caixa d\u0026rsquo;água. Não é pra gente conversar. Mesh (Meshtastic) não tem centro. Cada rádio é um nó que recebe e repete. Você manda texto e posição do celular, via Bluetooth, e a mensagem pula de nó em nó sem internet e sem operadora. O que eu queria era o segundo. Mensagem por rádio, pura, do jeito raiz.\nO mapa vazio # Abri o mapa do Meshtastic e olhei o Espírito Santo. Tem gente em Vitória. Do norte do estado pra cima: nada.\nFoi aí que a ideia virou missão: ser o primeiro nó do norte do ES.\nClaro que tem um detalhe. Sozinho em Linhares, meu nó não tem com quem falar por rádio. Vitória fica a uns 130 km, sem visada. Um salto direto disso é fantasia. Mas alguém tem que ser o primeiro, e mesh é exatamente isso: começa com um, depois aparece outro, e a malha cresce em volta. O plano é manter o nó isolado até a rede chegar até ele.\nTentando reaproveitar o que tenho em casa # Antes de gastar, olhei a gaveta:\nUm Banana Pi: viável. O Meshtastic roda em Linux (meshtasticd) com um módulo SX1262 no SPI. Dá trabalho de pinagem, mas funciona. Um NanoStation M900 da Ubiquiti: aqui doeu. É 900 MHz, a faixa certa, mas o rádio é Wi-Fi airMAX, chip Atheros, outra modulação. Não fala LoRa. A antena é integrada, então nem ela dá pra aproveitar direito. Ainda tô com a ideia teimosa de transformar isso num device Meshtastic próprio, nem que eu tenha que escrever o software. Fica anotado. Duas antenas de 2,4 GHz: descartadas. Antena é cortada pro comprimento de onda: em 2,4 GHz a onda tem uns 12,5 cm, em 915 MHz quase 33 cm. Ligar uma de 2,4 num rádio de 915 é ROE nas alturas e PA sofrendo. Nasce o Reator 4 # Todo projeto sério precisa de nome. O nó fixo se chama Reator 4.\nA especificação ficou assim:\nNúcleo: decidi pela Station G da B\u0026amp;Q. Achei a G3, sucessora da G2, na loja deles. Placa com PA forte e LNA bom, feita pra nó fixo. Antena: colinear de fibra de vidro para 915 MHz, de 5,8 a 8 dBi, conector N, no alto. Tenho umas omnis longas de 900 MHz encostadas que posso testar também. Cadeia de RF: G3 (SMA) → jumper curto SMA–N → filtro de cavidade → protetor de surto → antena. Regra de ouro: rádio colado na antena, sem cabo coaxial longo descendo o mastro. Meta: cobrir no mínimo 15 km. O cenário real: a casa fica a uns 30 m acima do nível do mar e a antena vai ficar a uns 12 m de altura. Não é torre, mas Linhares é plano, e cada metro conta.\nOnde parei # Às 13h, o placar do Reator 4 era este:\nB\u0026amp;Q (Station G3): mandei mensagem perguntando se enviam pro Brasil. Sem resposta. Vendedor do Mercado Livre: perguntei sobre uma antena 915 MHz (faixa, conector, tamanho). Sem resposta. Sem a G3, o reator nem liga. Então o projeto está oficialmente aguardando os vendedores.\nE o blog? # No meio da espera, fui mexer no home lab. Arrumei o DDNS do roteador, recuperei o acesso ao servidor de casa e, papo vai, papo vem, resolvi subir um blog pra registrar essas coisas. Hugo, tema Blowfish, grafite e âmbar, rodando num OptiPlex aqui em casa.\nEste é o primeiro post dele, escrito no mesmo domingo em que ele nasceu.\nContinua? # Depende dos vendedores.\nSe alguém responder, tem Parte 2: compra, chegada, flash do firmware, configuração e o primeiro teste de alcance pelas ruas de Linhares.\nSe ninguém responder, este post nasce e morre aqui, como registro de um domingo em que eu quis ser o primeiro do norte.\nDe qualquer forma, o mapa continua vazio. Por enquanto.\ndouglas@home-lab-vago:~$ ./reator4 --status [ AGUARDANDO HARDWARE ] ","date":"11 outubro 2026","externalUrl":null,"permalink":"/posts/reator-4-parte-1/","section":"Posts","summary":"Acordei num domingo querendo montar um rádio LoRa e terminei com um nome de projeto, uma lista de compras, duas mensagens sem resposta e este blog no ar.","title":"Reator 4 — Parte 1: um domingo, um rádio e um mapa vazio","type":"posts"},{"content":"","date":"11 outubro 2026","externalUrl":null,"permalink":"/tags/reator-4/","section":"Tags","summary":"","title":"Reator-4","type":"tags"},{"content":"","externalUrl":null,"permalink":"/now/","section":"home-lab-vago","summary":"","title":"","type":"page"},{"content":"","externalUrl":null,"permalink":"/sobre/","section":"home-lab-vago","summary":"","title":"","type":"page"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"}]