Agente de conhecimento do X
Transforma os posts que você salvou no X em receitas curtas de conhecimento.
Uso pessoal: lê a sua própria conta, pela sua própria sessão, só em modo leitura.
O que é
Transforma os posts que você salvou (bookmarks) no X em receitas curtas de conhecimento. Uso pessoal: lê a sua própria conta, pela sua própria sessão, em modo somente leitura.
Sem senha e sem API paga: o agente nunca faz login, usa a sessão que você já tem aberta no navegador. Cada passo é idempotente: salvo já visto não é coletado de novo e receita já gravada não chama o LLM outra vez.
Como funciona
Fluxo do agente de conhecimento do X
- Salvos do X: os bookmarks da sua conta.
- Coleta (
coletar): navegador sem tela, cookies da sua sessão, uma coleta por dia, somente leitura. Grava<saida>/AAAA-MM-DD.jsonlevistos.json(ids já coletados); gravaERROse a sessão cair. - Extração (
extrair): o post vira dado dentro de um bloco com delimitador aleatório; o LLM (claude -p) roda sem ferramentas, sem servidores MCP e sem configurações de usuário. - Receita: validada (frontmatter, tamanho, sem URL fora dos links do post, sem comando perigoso). Com
destino = "biblioteca"vai para<saida>/receitas/<tema>/<id>-<titulo>.md(statuscurta); com"issue", para<saida>/issues/<id>-<titulo>.md. - Uso: a receita entra na biblioteca de referências, ou vira texto de issue, e é aplicada em trabalho real.
Instalar
Pegue o pacote: ele é o módulo hub/x_salvos/ do repositório do Krohnos (https://github.com/BRK13/krohnos). Clone e rode todos os comandos desta página na raiz do clone:
git clone https://github.com/BRK13/krohnos.git
cd krohnos- Python 3.11 ou mais novo e um Chrome ou Chromium instalado.
- Só o
playwright; o navegador é o do sistema, apontado pela chavechrome: - Para
extrair: o CLIclaudeinstalado e autenticado (ele roda comoclaude -p --tools "" --strict-mcp-config --setting-sources "": só texto, sem ferramentas, sem servidores MCP e sem configurações nem hooks de usuário e projeto), ou a sua própria funçãoexecutar_llm(prompt)se você chama o módulo pelo Python.
pip install playwrightExporte os cookies (próxima seção) e crie o x_salvos.toml (seção Configuração). Teste à mão, primeiro a coleta e depois a extração:
python3 -m hub.x_salvos coletar --config x_salvos.toml
python3 -m hub.x_salvos extrair --config x_salvos.tomlPara rodar todo dia, agende isto no cron do sistema (--jitter espera de 0 a jitter_max_s antes de começar; à mão, rode sem ele):
python3 -m hub.x_salvos coletar --jitter --config x_salvos.tomlOs comandos são os do README do módulo, hub/x_salvos/README.md.
Como exportar os cookies
O agente nunca faz login: usa a sessão que você já tem aberta no navegador. A sessão é sua, a senha não entra, e não há API paga.
- Entre no X no navegador, com a sua conta.
- Com uma extensão que exporta cookies, ou pelo DevTools (Application, Cookies,
https://x.com), copie só o valor deauth_token,ct0etwid. - Grave um JSON com apenas essas três chaves:
{"auth_token": "...", "ct0": "...", "twid": "..."}chmod 600no arquivo. Um arquivo mais aberto é corrigido e avisado, e o valor nunca aparece no log.- Arquivo com senha, usuário ou qualquer credencial de login é recusado.
chmod 600 ~/.config/x-salvos/cookies.jsonQuando a sessão expira, a coleta grava ERRO na pasta de saída e para (código 2): exporte cookies novos.
Configuração
Arquivo x_salvos.toml. Precedência: padrões, depois arquivo, depois variáveis de ambiente. Chave desconhecida é erro. Todas as chaves:
cookies = "~/.config/x-salvos/cookies.json" # JSON com auth_token, ct0, twid (chmod 600)
cookies_origem = "" # opcional: arquivo ou pasta onde os cookies chegam de outra máquina
saida = "~/x-salvos" # jsonl, vistos.json, ERRO e receitas
temas = ["seo", "automacao"] # opcional: receita fora dos temas vai marcada, nunca é descartada
destino = "biblioteca" # "biblioteca" ou "issue"
max_itens = 150 # itens por rodada (máximo 500)
max_paginas = 40 # rolagens por rodada
limite_taxa_s = 1.5 # intervalo mínimo entre navegações, em segundos
jitter_max_s = 1200 # com --jitter: espera de 0 a este valor antes de começar
chrome = "/usr/bin/google-chrome"
trava = "~/x-salvos/.trava" # arquivo do flock contra duas coletas; padrão <saida>/.trava| Chave | O que faz |
|---|---|
cookies | JSON com auth_token, ct0, twid (chmod 600) |
cookies_origem | Opcional: arquivo ou pasta onde os cookies chegam de outra máquina (em pasta: o mesmo nome do arquivo de cookies ou x-cookies.json) |
saida | Pasta de saída: jsonl, vistos.json, ERRO e receitas |
temas | Opcional: receita fora dos temas vai marcada, nunca é descartada |
destino | "biblioteca" grava em <saida>/receitas/<tema>/<id>-<titulo>.md (status curta); "issue" grava em <saida>/issues/<id>-<titulo>.md |
max_itens | Limite: itens por rodada, máximo 500 |
max_paginas | Limite: rolagens por rodada |
limite_taxa_s | Limite: intervalo mínimo entre navegações, em segundos |
jitter_max_s | Com --jitter: espera de 0 a este valor antes de começar |
chrome | Caminho do Chrome ou Chromium do sistema |
trava | Arquivo do flock contra duas coletas ao mesmo tempo; padrão <saida>/.trava |
Variáveis de ambiente:
KROHNOS_X_SALVOS_CONFIG, KROHNOS_X_SALVOS_COOKIES, KROHNOS_X_SALVOS_COOKIES_ORIGEM, KROHNOS_X_SALVOS_SAIDA, KROHNOS_X_SALVOS_TEMAS, KROHNOS_X_SALVOS_DESTINO, X_MAX_ITENS, KROHNOS_X_SALVOS_MAX_PAGINAS, KROHNOS_X_SALVOS_LIMITE_TAXA_S, KROHNOS_X_SALVOS_JITTER_MAX_S, KROHNOS_X_SALVOS_CHROME, KROHNOS_X_SALVOS_TRAVAOs 6 guardrails e o teste que prova cada um
Todos estão em código (guardrails.py) e cada um falha se o código for removido. Os testes ficam em tests/test_x_salvos_guardrails.py, tests/test_x_salvos_extrair.py e tests/test_x_salvos_config.py.
| Guardrail | O que garante | Teste que prova |
|---|---|---|
| 1. Somente leitura | Método de escrita e endpoint de escrita (inclusive em GET) são abortados e registrados sem corpo. O único clique permitido é expandir respostas; curtir, repostar e seguir são recusados. URL ilegível, codificação ou subdomínio não abrem brecha: a falha fecha. A trava fica no contexto do navegador, inclusive em --refazer-fio. Service Workers são bloqueados, então nada escapa da trava. | tests/test_x_salvos_guardrails.py: TestSomenteLeitura.test_metodos_de_escrita_bloqueados, test_endpoints_de_escrita_bloqueados_mesmo_em_get, test_instalar_aborta_escrita_e_registra_sem_corpo, test_clique_de_acao_recusado, test_url_ilegivel_aborta_fail_closed, test_brechas_de_codificacao_e_subdominio, test_abrir_instala_a_trava_no_contexto, test_refazer_fio_abre_pelo_abrir |
| 2. A sessão é sua | Só auth_token, ct0 e twid; credencial de login é recusada. Não existe fluxo de login e a coleta não navega para a tela de login. Cookies vindos de outra máquina (cookies_origem) são copiados só se mais novos, com chmod 600, sem valor no log. | tests/test_x_salvos_guardrails.py: TestSessaoDoUsuario.test_cookies_so_os_tres, test_rejeita_credencial_de_login, test_fonte_sem_fluxo_de_login, test_nao_navega_para_login, TestCookiesOrigem |
| 3. Limite de taxa, teto e parada se a sessão cair | Intervalo mínimo entre navegações (limite_taxa_s) e teto de rolagens e de itens por rodada. Se a sessão cair, a coleta detecta pela URL, grava ERRO na pasta de saída e para sem insistir (código 2). | tests/test_x_salvos_guardrails.py: TestLimiteETeto.test_intervalo_minimo_entre_navegacoes, test_ir_respeita_a_taxa, test_teto_de_rolagens, test_teto_de_itens, test_sessao_caiu_por_url, TestParada |
| 4. O conteúdo do post é dado, não instrução | O texto do post fica dentro de um bloco com delimitador aleatório; delimitador forjado é neutralizado. A extração roda claude -p só de texto: sem ferramentas, sem servidores MCP, sem configurações de usuário e projeto, e sem pular permissões. A resposta é validada: comando perigoso, URL fora dos links do post, formato ou tamanho inválido rejeitam a receita e o resto segue. | tests/test_x_salvos_extrair.py: TestPrompt, TestValidacao, TestDestino.test_resposta_perigosa_nao_grava_e_pipeline_segue, TestDestino.test_padrao_nao_usa_bypass |
| 5. Segredos | Valor de cookie é mascarado em qualquer log e no arquivo ERRO. Os cookies são gravados com chmod 600, de forma atômica; permissão mais aberta é corrigida e avisada, sem mostrar o valor. | tests/test_x_salvos_guardrails.py: TestSegredos.test_mascarar, test_log_nunca_mostra_valor, test_erro_gravado_vai_mascarado, test_gravar_cookies_600_atomico, test_permissao_mais_aberta_e_corrigida_sem_valor, test_ler_cookies_corrige_permissao |
| 6. Termos de uso: uso pessoal | Lê só os seus próprios salvos; a busca pública fica fora deste agente. Sem scraping em massa e sem escrever nada no X. No máximo 500 itens por coleta (também com --forcar, que serve para a carga inicial ou uma correção), uma coleta por dia e uma por vez. O aviso sai em --help e na primeira rodada. Cumprir os termos de uso do X é responsabilidade de quem usa. | tests/test_x_salvos_guardrails.py: TestTermos.test_aviso_tem_o_essencial, test_ajuda_e_primeira_rodada_imprimem_aviso, test_teto_500, test_uma_coleta_por_dia, TestColetorPuro.test_trava_impede_segunda_coleta |
Destino e teto inválidos são recusados antes de coletar (tests/test_x_salvos_config.py). Rodar a prova:
python3 -m unittest tests.test_x_salvos_config tests.test_x_salvos_guardrails tests.test_x_salvos_extrairAviso de termos
Atenção: Esta ferramenta lê só os salvos da sua própria conta, em modo somente leitura; a busca pública fica fora deste agente. Sem scraping em massa: no máximo 500 itens por coleta e uma coleta por dia (--forcar serve para a carga inicial ou uma correção e também respeita o teto). Uso pessoal. Você é responsável por cumprir os termos de uso do X.