{"_id":"@eduh_dev021/tiktokseach","name":"@eduh_dev021/tiktokseach","dist-tags":{"latest":"0.3.0"},"versions":{"0.3.0":{"name":"@eduh_dev021/tiktokseach","version":"0.3.0","description":"Busca resiliente no TikTok usando Puppeteer, com suporte a Termux e normalização de URLs CDN.","type":"commonjs","main":"dist/index.cjs","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.cjs","import":"./dist/index.mjs"}},"engines":{"node":">=18"},"scripts":{"build":"node scripts/build.cjs","test":"node --test"},"keywords":["tiktok","search","scraper","puppeteer","termux","android","cdn"],"license":"MIT","dependencies":{"@irithell-js/puppeteer-termux":"^1.0.3"},"_id":"@eduh_dev021/tiktokseach@0.3.0","_nodeVersion":"22.13.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-vr4vj68LFmsqmd4fYUAgo5PfyKnliloYpfGQvV8K0LdR+Ne90L3tEkr64FDi0R8ySP1Ko985xNs4f8m0ne/hkw==","shasum":"ac7e090b5b87bc982443c43c72af43c494fe1223","tarball":"https://registry.npmjs.org/@eduh_dev021/tiktokseach/-/tiktokseach-0.3.0.tgz","fileCount":6,"unpackedSize":24519,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGuvpF9UdoENE0iQssUAJXHH3DLqGut+kDYEpE7LuNLUAiEA+XC1r6eAldcUOYYoLHca+cAPIIS06JgrIjnD5OAOiow="}]},"_npmUser":{"name":"eduh_dev021","email":"kentakakura021028@gmail.com"},"directories":{},"maintainers":[{"name":"eduh_dev021","email":"kentakakura021028@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tiktokseach_0.3.0_1787972535719_0.6494499443105934"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-29T03:02:15.476Z","0.3.0":"2026-08-29T03:02:15.859Z","modified":"2026-08-29T03:02:16.132Z"},"maintainers":[{"name":"eduh_dev021","email":"kentakakura021028@gmail.com"}],"description":"Busca resiliente no TikTok usando Puppeteer, com suporte a Termux e normalização de URLs CDN.","keywords":["tiktok","search","scraper","puppeteer","termux","android","cdn"],"license":"MIT","readme":"# @eduh_dev021/tiktokseach\n\nMódulo Node.js para pesquisar vídeos no **TikTok oficial** usando Puppeteer. Ele foi pensado para funcionar com `@irithell-js/puppeteer-termux`, incluindo Termux/Android, e entrega uma API simples baseada em `new EngineTiktokseach()`.\n\n> O pacote navega em `https://www.tiktok.com/search` e não depende de APIs ou sites de terceiros. Use-o respeitando os Termos de Serviço, robots, limites de requisição e as leis aplicáveis. O módulo não contorna login, CAPTCHA ou bloqueios de acesso.\n\n## Instalação\n\n```bash\nnpm install @eduh_dev021/tiktokseach\n```\n\nNo Termux, instale o Chromium conforme a configuração do pacote Puppeteer Termux utilizado pelo projeto.\n\n## Uso CommonJS\n\n```js\nconst { EngineTiktokseach } = require('@eduh_dev021/tiktokseach');\n\n(async () => {\n  const tiktok = new EngineTiktokseach({\n    headless: true,\n    maxResults: 10,\n    retries: 2,\n  });\n\n  try {\n    const result = await tiktok.search('javascript');\n    console.log(result.items);\n  } finally {\n    await tiktok.close();\n  }\n})();\n```\n\n## Uso ESM\n\n```js\nimport EngineTiktokseach from '@eduh_dev021/tiktokseach';\n\nconst engine = new EngineTiktokseach();\nconst result = await engine.search('programação');\nconsole.log(result.items.map((item) => item.url));\nawait engine.close();\n```\n\n## Opções\n\n| Opção | Padrão | Finalidade |\n|---|---:|---|\n| `maxResults` | `12` | Limita a quantidade de resultados retornados. |\n| `timeout` | `30000` | Tempo máximo de navegação em milissegundos. |\n| `retries` | `2` | Tentativas adicionais em caso de falha temporária. |\n| `headless` | `true` | Executa o Chromium sem interface gráfica. |\n| `locale` | `pt-BR` | Idioma enviado ao TikTok. |\n| `scroll` | `false` | Faz uma rolagem após o carregamento inicial. |\n| `loadMedia` | `false` | Mantém imagens e mídia carregadas pelo navegador. |\n| `browser` | `null` | Permite reutilizar uma instância Puppeteer já aberta. |\n\n## Resultado\n\nCada item pode conter `id`, `description`, `url`, `cdnUrl`, `author`, `stats`, `media` e `music`. Os campos `url` e `cdnUrl` apontam para a mídia direta da CDN; o link da página `tiktok.com/@.../video/...` não é retornado. Os links encontrados nos estados JSON e no DOM são normalizados por `normalizeCdnUrl`, com decodificação de valores escapados e remoção apenas de parâmetros comuns de rastreamento; parâmetros de assinatura necessários para a CDN são preservados.\n\n```js\n{\n  query: 'javascript',\n  count: 1,\n  items: [{\n    id: '...',\n    description: '...',\n    url: 'https://v16.tiktokcdn.com/arquivo.mp4?...',\n    cdnUrl: 'https://v16.tiktokcdn.com/arquivo.mp4?...',\n    author: { username: 'perfil' },\n    stats: { likes: 0, comments: 0, shares: 0, views: 0 },\n    media: ['https://...'],\n    music: null\n  }]\n}\n```\n\n## Download e TinyURL\n\nDepois de obter `cdnUrl`, o módulo pode baixar a mídia para um arquivo temporário ou para um caminho definido pelo usuário:\n\n```js\nconst item = resultado.items[0];\nconst arquivo = await engine.download(item.cdnUrl, {\n  // O usuário escolhe o destino; `directory` também é aceito.\n  output: './temporarios/video.mp4',\n  range: false\n});\nconsole.log(arquivo.output, arquivo.bytes);\n```\n\nO método `download` mantém a assinatura da CDN e usa `Referer`, `User-Agent`, `Accept` e `Range`. É obrigatório informar `output` ou `directory`; o módulo não escolhe uma pasta escondida por conta própria. Para criar um TinyURL, use `await engine.shorten(publicUrl)`, mas `publicUrl` precisa estar hospedada publicamente. Um caminho local como `./video.mp4` ou `http://localhost:3000/video.mp4` não funciona para outras pessoas. TinyURL apenas redireciona e não armazena o MP4.\n\n## Observações técnicas\n\nO TikTok altera com frequência o HTML e os estados internos da página. Por isso, a implementação combina os estados `SIGI_STATE`, `__UNIVERSAL_DATA_FOR_REHYDRATION__`, `__NEXT_DATA__` e links de vídeo presentes no DOM. Caso o TikTok exiba CAPTCHA, exija login ou altere completamente a página, a busca poderá retornar erro ou poucos dados; isso é intencional e evita técnicas de evasão.\n\n## Desenvolvimento\n\n```bash\nnpm install\nnpm run build\nnpm test\nnpm pack --dry-run\n```\n\n## Licença\n\nMIT.\n","readmeFilename":"README.md","_rev":"1-3db43a3f1f6ba4cf9eeda79a857791a7"}