@kaikybrofc/omnizap-system 2.2.10 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +13 -13
  2. package/app/config/adminIdentity.js +1 -3
  3. package/app/connection/socketController.js +10 -20
  4. package/app/controllers/messageController.js +7 -28
  5. package/app/modules/aiModule/catCommand.js +29 -192
  6. package/app/modules/broadcastModule/noticeCommand.js +28 -97
  7. package/app/modules/gameModule/diceCommand.js +6 -32
  8. package/app/modules/playModule/playCommand.js +57 -258
  9. package/app/modules/quoteModule/quoteCommand.js +2 -4
  10. package/app/modules/rpgPokemonModule/rpgPokemonRepository.js +1 -13
  11. package/app/modules/statsModule/noMessageCommand.js +16 -84
  12. package/app/modules/statsModule/rankingCommand.js +5 -25
  13. package/app/modules/statsModule/rankingCommon.js +1 -9
  14. package/app/modules/stickerModule/convertToWebp.js +4 -27
  15. package/app/modules/stickerModule/stickerCommand.js +13 -24
  16. package/app/modules/stickerModule/stickerTextCommand.js +13 -25
  17. package/app/modules/stickerPackModule/autoPackCollectorService.js +16 -7
  18. package/app/modules/stickerPackModule/domainEventOutboxRepository.js +20 -36
  19. package/app/modules/stickerPackModule/domainEvents.js +2 -11
  20. package/app/modules/stickerPackModule/semanticReclassificationEngine.js +13 -50
  21. package/app/modules/stickerPackModule/semanticReclassificationEngine.test.js +2 -15
  22. package/app/modules/stickerPackModule/semanticThemeClusterService.js +14 -41
  23. package/app/modules/stickerPackModule/stickerAssetClassificationRepository.js +25 -95
  24. package/app/modules/stickerPackModule/stickerAssetRepository.js +12 -31
  25. package/app/modules/stickerPackModule/stickerAssetReprocessQueueRepository.js +13 -18
  26. package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +284 -709
  27. package/app/modules/stickerPackModule/stickerClassificationBackgroundRuntime.js +27 -106
  28. package/app/modules/stickerPackModule/stickerClassificationService.js +46 -77
  29. package/app/modules/stickerPackModule/stickerDedicatedTaskWorkerRuntime.js +13 -53
  30. package/app/modules/stickerPackModule/stickerDomainEventBus.js +10 -16
  31. package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +40 -39
  32. package/app/modules/stickerPackModule/stickerMarketplaceDriftService.js +1 -4
  33. package/app/modules/stickerPackModule/stickerObjectStorageService.js +26 -26
  34. package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +32 -187
  35. package/app/modules/stickerPackModule/stickerPackInteractionEventRepository.js +6 -15
  36. package/app/modules/stickerPackModule/stickerPackItemRepository.js +6 -32
  37. package/app/modules/stickerPackModule/stickerPackMarketplaceService.js +12 -36
  38. package/app/modules/stickerPackModule/stickerPackMessageService.js +12 -40
  39. package/app/modules/stickerPackModule/stickerPackRepository.js +23 -66
  40. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRepository.js +9 -21
  41. package/app/modules/stickerPackModule/stickerPackScoreSnapshotRuntime.js +10 -40
  42. package/app/modules/stickerPackModule/stickerPackService.js +50 -115
  43. package/app/modules/stickerPackModule/stickerPackServiceRuntime.js +2 -21
  44. package/app/modules/stickerPackModule/stickerPackUtils.js +13 -3
  45. package/app/modules/stickerPackModule/stickerStorageService.js +16 -65
  46. package/app/modules/stickerPackModule/stickerWorkerPipelineRuntime.js +4 -22
  47. package/app/modules/stickerPackModule/stickerWorkerTaskQueueRepository.js +14 -29
  48. package/app/modules/systemMetricsModule/pingCommand.js +9 -39
  49. package/app/modules/tiktokModule/tiktokCommand.js +17 -109
  50. package/app/modules/userModule/userCommand.js +2 -88
  51. package/app/observability/metrics.js +5 -16
  52. package/app/services/captchaService.js +1 -6
  53. package/app/services/dbWriteQueue.js +3 -18
  54. package/app/services/featureFlagService.js +2 -8
  55. package/app/services/newsBroadcastService.js +0 -1
  56. package/app/services/queueUtils.js +2 -4
  57. package/app/services/whatsappLoginLinkService.js +7 -9
  58. package/app/store/premiumUserStore.js +1 -2
  59. package/app/utils/antiLink/antiLinkModule.js +3 -233
  60. package/app/utils/logger/loggerModule.js +9 -34
  61. package/app/utils/systemMetrics/systemMetricsModule.js +1 -4
  62. package/database/index.js +1 -0
  63. package/database/init.js +1 -8
  64. package/database/migrations/20260228_0027_web_visit_event.sql +15 -0
  65. package/docker-compose.yml +27 -27
  66. package/docs/seo/omnizap-seo-playbook-br-2026-02-28.md +26 -0
  67. package/docs/seo/satellite-page-template.md +2 -0
  68. package/docs/seo/satellite-pages-phase1.json +40 -177
  69. package/eslint.config.js +2 -15
  70. package/index.js +8 -36
  71. package/ml/clip_classifier/README.md +4 -6
  72. package/observability/alert-rules.yml +12 -12
  73. package/observability/grafana/provisioning/dashboards/dashboards.yml +1 -1
  74. package/package.json +6 -3
  75. package/public/api-docs/index.html +220 -193
  76. package/public/bot-whatsapp-para-grupo/index.html +291 -261
  77. package/public/bot-whatsapp-sem-programar/index.html +291 -261
  78. package/public/comandos/index.html +421 -406
  79. package/public/como-automatizar-avisos-no-whatsapp/index.html +291 -261
  80. package/public/como-criar-comandos-whatsapp/index.html +291 -261
  81. package/public/como-evitar-spam-no-whatsapp/index.html +291 -261
  82. package/public/como-moderar-grupo-whatsapp/index.html +291 -261
  83. package/public/como-organizar-comunidade-whatsapp/index.html +291 -261
  84. package/public/css/github-project-panel.css +13 -8
  85. package/public/css/stickers-admin.css +25 -9
  86. package/public/css/styles.css +23 -16
  87. package/public/index.html +1106 -993
  88. package/public/js/apps/apiDocsApp.js +17 -167
  89. package/public/js/apps/createPackApp.js +69 -332
  90. package/public/js/apps/homeApp.js +274 -101
  91. package/public/js/apps/loginApp.js +3 -12
  92. package/public/js/apps/stickersAdminApp.js +190 -181
  93. package/public/js/apps/stickersApp.js +482 -1411
  94. package/public/js/apps/userApp.js +217 -1
  95. package/public/js/catalog.js +11 -74
  96. package/public/js/github-panel/components/ErrorState.js +1 -8
  97. package/public/js/github-panel/components/GithubProjectPanel.js +2 -9
  98. package/public/js/github-panel/components/SkeletonPanel.js +1 -11
  99. package/public/js/github-panel/components/StatCard.js +1 -7
  100. package/public/js/github-panel/vendor/react.js +1 -9
  101. package/public/js/runtime/react-runtime.js +1 -9
  102. package/public/licenca/index.html +200 -86
  103. package/public/login/index.html +315 -325
  104. package/public/melhor-bot-whatsapp-para-grupos/index.html +291 -261
  105. package/public/stickers/admin/index.html +14 -19
  106. package/public/stickers/create/index.html +39 -44
  107. package/public/stickers/index.html +96 -107
  108. package/public/termos-de-uso/index.html +369 -122
  109. package/public/user/index.html +527 -350
  110. package/scripts/cache-bust.mjs +5 -24
  111. package/scripts/generate-seo-satellite-pages.mjs +10 -13
  112. package/scripts/run-prettier-all.mjs +25 -0
  113. package/scripts/sticker-catalog-loadtest.mjs +13 -11
  114. package/scripts/sticker-worker-task.mjs +1 -4
  115. package/scripts/sync-readme-snapshot.mjs +3 -2
  116. package/server/auth/googleWebAuth/googleWebAuthService.js +614 -0
  117. package/server/controllers/stickerCatalogController.js +297 -632
  118. package/server/http/httpServer.js +2 -10
  119. package/server/routes/stickerCatalog/catalogHandlers/catalogAdminHttp.js +1 -8
  120. package/server/routes/stickerCatalog/catalogHandlers/catalogAuthHttp.js +1 -9
  121. package/server/routes/stickerCatalog/catalogHandlers/catalogPublicHttp.js +10 -11
  122. package/server/routes/stickerCatalog/catalogHandlers/catalogUploadHttp.js +1 -10
  123. package/server/routes/stickerCatalog/catalogRouter.js +11 -13
@@ -1,230 +1,260 @@
1
1
  <!doctype html>
2
2
  <html lang="pt-BR">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Como evitar spam no WhatsApp com bot pronto</title>
7
- <meta name="description" content="Guia rapido para reduzir spam em grupos de WhatsApp com bot pronto. Veja regras essenciais e praticas para manter o grupo limpo e produtivo." />
8
- <meta name="keywords" content="como evitar spam whatsapp, bot anti spam whatsapp, moderacao whatsapp" />
9
- <meta name="robots" content="index, follow" />
10
- <link rel="canonical" href="https://omnizap.shop/como-evitar-spam-no-whatsapp/" />
11
- <link rel="icon" type="image/png" href="/assets/images/brand-icon-192.png" />
12
-
13
- <meta property="og:type" content="article" />
14
- <meta property="og:locale" content="pt_BR" />
15
- <meta property="og:site_name" content="OmniZap System" />
16
- <meta property="og:title" content="Como evitar spam no WhatsApp com bot pronto" />
17
- <meta property="og:description" content="Guia rapido para reduzir spam em grupos de WhatsApp com bot pronto. Veja regras essenciais e praticas para manter o grupo limpo e produtivo." />
18
- <meta property="og:url" content="https://omnizap.shop/como-evitar-spam-no-whatsapp/" />
19
- <meta property="og:image" content="https://omnizap.shop/assets/images/hero-banner-1280.jpg" />
20
-
21
- <meta name="twitter:card" content="summary_large_image" />
22
- <meta name="twitter:title" content="Como evitar spam no WhatsApp com bot pronto" />
23
- <meta name="twitter:description" content="Guia rapido para reduzir spam em grupos de WhatsApp com bot pronto. Veja regras essenciais e praticas para manter o grupo limpo e produtivo." />
24
- <meta name="twitter:image" content="https://omnizap.shop/assets/images/hero-banner-1280.jpg" />
25
-
26
- <script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Como evitar spam no WhatsApp com bot pronto","description":"Guia rapido para reduzir spam em grupos de WhatsApp com bot pronto. Veja regras essenciais e praticas para manter o grupo limpo e produtivo.","inLanguage":"pt-BR","url":"https://omnizap.shop/como-evitar-spam-no-whatsapp/","isPartOf":{"@type":"WebSite","name":"OmniZap System","url":"https://omnizap.shop"}}</script>
27
- <script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"O bot bloqueia todo tipo de spam automaticamente?","acceptedAnswer":{"@type":"Answer","text":"Ele cobre os casos mais comuns e pode ser ajustado conforme o perfil do grupo."}},{"@type":"Question","name":"Spam reduz quando o bot entra?","acceptedAnswer":{"@type":"Answer","text":"Na pratica, a queda costuma ser imediata apos ativar regras basicas."}},{"@type":"Question","name":"Posso manter recursos de engajamento junto com anti-spam?","acceptedAnswer":{"@type":"Answer","text":"Sim. Voce pode usar moderacao e stickers no mesmo fluxo de grupo."}}]}</script>
28
-
29
- <style>
30
- :root {
31
- --bg: #0f172a;
32
- --bg-2: #111827;
33
- --line: rgba(255, 255, 255, 0.05);
34
- --text: #f8fafc;
35
- --muted: #94a3b8;
36
- --card: #1e293bd9;
37
- --accent: #2563eb;
38
- --accent-2: #7c3aed;
39
- --cta: #22c55e;
40
- --cta-hover: #16a34a;
41
- }
42
-
43
- * { box-sizing: border-box; }
44
- body {
45
- margin: 0;
46
- font-family: "Manrope", system-ui, -apple-system, sans-serif;
47
- color: var(--text);
48
- background:
49
- radial-gradient(58rem 22rem at -10% -8%, #2563eb24, transparent 60%),
50
- radial-gradient(62rem 26rem at 112% -12%, #7c3aed22, transparent 58%),
51
- linear-gradient(165deg, var(--bg), var(--bg-2));
52
- }
53
-
54
- .wrap { width: min(980px, 92vw); margin: 0 auto; padding: 22px 0 42px; }
55
-
56
- .top {
57
- display: flex;
58
- flex-wrap: wrap;
59
- gap: 8px;
60
- margin-bottom: 14px;
61
- }
62
-
63
- .top a {
64
- color: var(--text);
65
- text-decoration: none;
66
- border: 1px solid var(--line);
67
- border-radius: 10px;
68
- padding: 8px 11px;
69
- background: #111827;
70
- font-size: 14px;
71
- font-weight: 700;
72
- }
73
-
74
- .hero,
75
- .card {
76
- border: 1px solid rgba(255, 255, 255, 0.05);
77
- border-radius: 16px;
78
- background: var(--card);
79
- padding: 16px;
80
- margin-bottom: 12px;
81
- }
82
-
83
- .pill {
84
- display: inline-flex;
85
- border: 1px solid #45689f;
86
- border-radius: 999px;
87
- padding: 5px 10px;
88
- font-size: 12px;
89
- font-weight: 800;
90
- text-transform: uppercase;
91
- letter-spacing: .3px;
92
- color: #cde4ff;
93
- background: #16274a96;
94
- margin-bottom: 10px;
95
- }
96
-
97
- h1, h2 {
98
- margin: 0 0 8px;
99
- font-family: "Sora", "Manrope", sans-serif;
100
- letter-spacing: -0.02em;
101
- }
102
-
103
- h1 {
104
- font-size: clamp(29px, 4vw, 42px);
105
- line-height: 1.08;
106
- background: linear-gradient(92deg, #f3f8ff 0%, #60a5fa 45%, #a78bfa 100%);
107
- -webkit-background-clip: text;
108
- background-clip: text;
109
- color: transparent;
110
- }
111
-
112
- h2 { font-size: clamp(22px, 2.8vw, 30px); }
113
-
114
- p, li {
115
- margin: 0 0 10px;
116
- color: var(--muted);
117
- line-height: 1.65;
118
- font-size: 16px;
119
- }
120
-
121
- ul { margin: 0; padding-left: 18px; }
122
-
123
- .cta {
124
- display: flex;
125
- flex-wrap: wrap;
126
- gap: 8px;
127
- margin-top: 12px;
128
- }
129
-
130
- .btn {
131
- text-decoration: none;
132
- border: 1px solid rgba(255, 255, 255, 0.05);
133
- border-radius: 11px;
134
- padding: 10px 13px;
135
- color: var(--text);
136
- background: #111827;
137
- font-weight: 800;
138
- font-size: 14px;
139
- }
140
-
141
- .btn.primary {
142
- border-color: transparent;
143
- color: #0f172a;
144
- background: var(--cta);
145
- }
146
-
147
- .btn.primary:hover { background: var(--cta-hover); }
148
-
149
- .faq-list {
150
- display: grid;
151
- gap: 9px;
152
- }
153
-
154
- .faq-item {
155
- border: 1px solid rgba(255, 255, 255, 0.05);
156
- border-radius: 12px;
157
- background: #1e293bb8;
158
- padding: 0 12px;
159
- }
160
-
161
- .faq-item summary {
162
- cursor: pointer;
163
- list-style: none;
164
- font-weight: 800;
165
- color: #ebf4ff;
166
- padding: 12px 0;
167
- }
168
-
169
- .faq-item summary::-webkit-details-marker { display: none; }
170
-
171
- .faq-item p {
172
- margin: 0;
173
- padding: 0 0 12px;
174
- font-size: 15px;
175
- }
176
-
177
- .links-grid {
178
- display: grid;
179
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
180
- gap: 8px;
181
- }
182
-
183
- .links-grid a {
184
- text-decoration: none;
185
- color: #dbecff;
186
- border: 1px solid #365686;
187
- border-radius: 10px;
188
- padding: 9px 10px;
189
- background: #10203d;
190
- font-weight: 700;
191
- }
192
-
193
- .meta {
194
- margin-top: 8px;
195
- font-size: 13px;
196
- color: #95b2d8;
197
- }
198
- </style>
199
- </head>
200
- <body>
201
- <main class="wrap">
202
- <nav class="top" aria-label="Navegação interna">
203
- <a href="/">Início</a>
204
- <a href="/stickers/">Stickers</a>
205
- <a href="/api-docs/">API Docs</a>
206
- <a href="/login/">Adicionar Bot</a>
207
- </nav>
208
-
209
- <header class="hero">
210
- <span class="pill">Guia anti-spam</span>
211
- <h1>Como evitar spam no WhatsApp sem travar seu grupo</h1>
212
- <p>Spam derruba a qualidade das conversas e afasta membros importantes. Com um bot pronto, voce cria barreiras simples para proteger o grupo sem burocracia.</p>
213
- <div class="cta">
214
- <a class="btn primary" href="/login/">Adicionar ao meu grupo</a>
215
- <a class="btn" href="/">Conhecer OmniZap</a>
216
- </div>
217
- <p class="meta">Página atualizada em 2026-02-28</p>
218
- </header>
219
-
220
- <section class="card">
221
- <h2>Por que spam cresce tao rapido</h2>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Como evitar spam no WhatsApp com bot pronto</title>
7
+ <meta name="description" content="Guia rapido para reduzir spam em grupos de WhatsApp com bot pronto. Veja regras essenciais e praticas para manter o grupo limpo e produtivo." />
8
+ <meta name="keywords" content="como evitar spam whatsapp, bot anti spam whatsapp, moderacao whatsapp" />
9
+ <meta name="robots" content="index, follow" />
10
+ <link rel="canonical" href="https://omnizap.shop/como-evitar-spam-no-whatsapp/" />
11
+ <link rel="icon" type="image/png" href="/assets/images/brand-icon-192.png" />
12
+
13
+ <meta property="og:type" content="article" />
14
+ <meta property="og:locale" content="pt_BR" />
15
+ <meta property="og:site_name" content="OmniZap System" />
16
+ <meta property="og:title" content="Como evitar spam no WhatsApp com bot pronto" />
17
+ <meta property="og:description" content="Guia rapido para reduzir spam em grupos de WhatsApp com bot pronto. Veja regras essenciais e praticas para manter o grupo limpo e produtivo." />
18
+ <meta property="og:url" content="https://omnizap.shop/como-evitar-spam-no-whatsapp/" />
19
+ <meta property="og:image" content="https://omnizap.shop/assets/images/hero-banner-1280.jpg" />
20
+
21
+ <meta name="twitter:card" content="summary_large_image" />
22
+ <meta name="twitter:title" content="Como evitar spam no WhatsApp com bot pronto" />
23
+ <meta name="twitter:description" content="Guia rapido para reduzir spam em grupos de WhatsApp com bot pronto. Veja regras essenciais e praticas para manter o grupo limpo e produtivo." />
24
+ <meta name="twitter:image" content="https://omnizap.shop/assets/images/hero-banner-1280.jpg" />
25
+
26
+ <script type="application/ld+json">
27
+ { "@context": "https://schema.org", "@type": "WebPage", "name": "Como evitar spam no WhatsApp com bot pronto", "description": "Guia rapido para reduzir spam em grupos de WhatsApp com bot pronto. Veja regras essenciais e praticas para manter o grupo limpo e produtivo.", "inLanguage": "pt-BR", "url": "https://omnizap.shop/como-evitar-spam-no-whatsapp/", "isPartOf": { "@type": "WebSite", "name": "OmniZap System", "url": "https://omnizap.shop" } }
28
+ </script>
29
+ <script type="application/ld+json">
30
+ {
31
+ "@context": "https://schema.org",
32
+ "@type": "FAQPage",
33
+ "mainEntity": [
34
+ { "@type": "Question", "name": "O bot bloqueia todo tipo de spam automaticamente?", "acceptedAnswer": { "@type": "Answer", "text": "Ele cobre os casos mais comuns e pode ser ajustado conforme o perfil do grupo." } },
35
+ { "@type": "Question", "name": "Spam reduz quando o bot entra?", "acceptedAnswer": { "@type": "Answer", "text": "Na pratica, a queda costuma ser imediata apos ativar regras basicas." } },
36
+ { "@type": "Question", "name": "Posso manter recursos de engajamento junto com anti-spam?", "acceptedAnswer": { "@type": "Answer", "text": "Sim. Voce pode usar moderacao e stickers no mesmo fluxo de grupo." } }
37
+ ]
38
+ }
39
+ </script>
40
+
41
+ <style>
42
+ :root {
43
+ --bg: #0f172a;
44
+ --bg-2: #111827;
45
+ --line: rgba(255, 255, 255, 0.05);
46
+ --text: #f8fafc;
47
+ --muted: #94a3b8;
48
+ --card: #1e293bd9;
49
+ --accent: #2563eb;
50
+ --accent-2: #7c3aed;
51
+ --cta: #22c55e;
52
+ --cta-hover: #16a34a;
53
+ }
54
+
55
+ * {
56
+ box-sizing: border-box;
57
+ }
58
+ body {
59
+ margin: 0;
60
+ font-family:
61
+ 'Manrope',
62
+ system-ui,
63
+ -apple-system,
64
+ sans-serif;
65
+ color: var(--text);
66
+ background: radial-gradient(58rem 22rem at -10% -8%, #2563eb24, transparent 60%), radial-gradient(62rem 26rem at 112% -12%, #7c3aed22, transparent 58%), linear-gradient(165deg, var(--bg), var(--bg-2));
67
+ }
68
+
69
+ .wrap {
70
+ width: min(980px, 92vw);
71
+ margin: 0 auto;
72
+ padding: 22px 0 42px;
73
+ }
74
+
75
+ .top {
76
+ display: flex;
77
+ flex-wrap: wrap;
78
+ gap: 8px;
79
+ margin-bottom: 14px;
80
+ }
81
+
82
+ .top a {
83
+ color: var(--text);
84
+ text-decoration: none;
85
+ border: 1px solid var(--line);
86
+ border-radius: 10px;
87
+ padding: 8px 11px;
88
+ background: #111827;
89
+ font-size: 14px;
90
+ font-weight: 700;
91
+ }
92
+
93
+ .hero,
94
+ .card {
95
+ border: 1px solid rgba(255, 255, 255, 0.05);
96
+ border-radius: 16px;
97
+ background: var(--card);
98
+ padding: 16px;
99
+ margin-bottom: 12px;
100
+ }
101
+
102
+ .pill {
103
+ display: inline-flex;
104
+ border: 1px solid #45689f;
105
+ border-radius: 999px;
106
+ padding: 5px 10px;
107
+ font-size: 12px;
108
+ font-weight: 800;
109
+ text-transform: uppercase;
110
+ letter-spacing: 0.3px;
111
+ color: #cde4ff;
112
+ background: #16274a96;
113
+ margin-bottom: 10px;
114
+ }
115
+
116
+ h1,
117
+ h2 {
118
+ margin: 0 0 8px;
119
+ font-family: 'Sora', 'Manrope', sans-serif;
120
+ letter-spacing: -0.02em;
121
+ }
122
+
123
+ h1 {
124
+ font-size: clamp(29px, 4vw, 42px);
125
+ line-height: 1.08;
126
+ background: linear-gradient(92deg, #f3f8ff 0%, #60a5fa 45%, #a78bfa 100%);
127
+ -webkit-background-clip: text;
128
+ background-clip: text;
129
+ color: transparent;
130
+ }
131
+
132
+ h2 {
133
+ font-size: clamp(22px, 2.8vw, 30px);
134
+ }
135
+
136
+ p,
137
+ li {
138
+ margin: 0 0 10px;
139
+ color: var(--muted);
140
+ line-height: 1.65;
141
+ font-size: 16px;
142
+ }
143
+
144
+ ul {
145
+ margin: 0;
146
+ padding-left: 18px;
147
+ }
148
+
149
+ .cta {
150
+ display: flex;
151
+ flex-wrap: wrap;
152
+ gap: 8px;
153
+ margin-top: 12px;
154
+ }
155
+
156
+ .btn {
157
+ text-decoration: none;
158
+ border: 1px solid rgba(255, 255, 255, 0.05);
159
+ border-radius: 11px;
160
+ padding: 10px 13px;
161
+ color: var(--text);
162
+ background: #111827;
163
+ font-weight: 800;
164
+ font-size: 14px;
165
+ }
166
+
167
+ .btn.primary {
168
+ border-color: transparent;
169
+ color: #0f172a;
170
+ background: var(--cta);
171
+ }
172
+
173
+ .btn.primary:hover {
174
+ background: var(--cta-hover);
175
+ }
176
+
177
+ .faq-list {
178
+ display: grid;
179
+ gap: 9px;
180
+ }
181
+
182
+ .faq-item {
183
+ border: 1px solid rgba(255, 255, 255, 0.05);
184
+ border-radius: 12px;
185
+ background: #1e293bb8;
186
+ padding: 0 12px;
187
+ }
188
+
189
+ .faq-item summary {
190
+ cursor: pointer;
191
+ list-style: none;
192
+ font-weight: 800;
193
+ color: #ebf4ff;
194
+ padding: 12px 0;
195
+ }
196
+
197
+ .faq-item summary::-webkit-details-marker {
198
+ display: none;
199
+ }
200
+
201
+ .faq-item p {
202
+ margin: 0;
203
+ padding: 0 0 12px;
204
+ font-size: 15px;
205
+ }
206
+
207
+ .links-grid {
208
+ display: grid;
209
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
210
+ gap: 8px;
211
+ }
212
+
213
+ .links-grid a {
214
+ text-decoration: none;
215
+ color: #dbecff;
216
+ border: 1px solid #365686;
217
+ border-radius: 10px;
218
+ padding: 9px 10px;
219
+ background: #10203d;
220
+ font-weight: 700;
221
+ }
222
+
223
+ .meta {
224
+ margin-top: 8px;
225
+ font-size: 13px;
226
+ color: #95b2d8;
227
+ }
228
+ </style>
229
+ </head>
230
+ <body>
231
+ <main class="wrap">
232
+ <nav class="top" aria-label="Navegação interna">
233
+ <a href="/">Início</a>
234
+ <a href="/stickers/">Stickers</a>
235
+ <a href="/api-docs/">API Docs</a>
236
+ <a href="/login/">Adicionar Bot</a>
237
+ </nav>
238
+
239
+ <header class="hero">
240
+ <span class="pill">Guia anti-spam</span>
241
+ <h1>Como evitar spam no WhatsApp sem travar seu grupo</h1>
242
+ <p>Spam derruba a qualidade das conversas e afasta membros importantes. Com um bot pronto, voce cria barreiras simples para proteger o grupo sem burocracia.</p>
243
+ <div class="cta">
244
+ <a class="btn primary" href="/login/">Adicionar ao meu grupo</a>
245
+ <a class="btn" href="/">Conhecer OmniZap</a>
246
+ </div>
247
+ <p class="meta">Página atualizada em 2026-02-28</p>
248
+ </header>
249
+
250
+ <section class="card">
251
+ <h2>Por que spam cresce tao rapido</h2>
222
252
  <p>Grupos ativos atraem divulgacoes, correntes e mensagens repetidas.</p>
223
253
  <p>Sem automacao, o admin entra em modo reativo e sempre chega tarde.</p>
224
- </section>
254
+ </section>
225
255
 
226
- <section class="card">
227
- <h2>Regras que resolvem no curto prazo</h2>
256
+ <section class="card">
257
+ <h2>Regras que resolvem no curto prazo</h2>
228
258
  <p>Defina filtros para links suspeitos e mensagens de repeticao em massa.</p>
229
259
  <p>Ative respostas automaticas para orientar novos membros sobre comportamento esperado.</p>
230
260
  <ul>
@@ -232,45 +262,45 @@
232
262
  <li>Aviso automatico de regras</li>
233
263
  <li>Acompanhamento continuo sem intervencao manual</li>
234
264
  </ul>
235
- </section>
265
+ </section>
236
266
 
237
- <section class="card">
238
- <h2>Resultado esperado</h2>
267
+ <section class="card">
268
+ <h2>Resultado esperado</h2>
239
269
  <p>Com menos spam, o grupo ganha ritmo e relevancia.</p>
240
270
  <p>Isso aumenta retenção da comunidade e melhora a confianca no canal.</p>
241
- </section>
242
-
243
- <section class="card">
244
- <h2>Perguntas frequentes</h2>
245
- <div class="faq-list">
246
- <details class="faq-item">
247
- <summary>O bot bloqueia todo tipo de spam automaticamente?</summary>
248
- <p>Ele cobre os casos mais comuns e pode ser ajustado conforme o perfil do grupo.</p>
249
- </details>
250
- <details class="faq-item">
251
- <summary>Spam reduz quando o bot entra?</summary>
252
- <p>Na pratica, a queda costuma ser imediata apos ativar regras basicas.</p>
253
- </details>
254
- <details class="faq-item">
255
- <summary>Posso manter recursos de engajamento junto com anti-spam?</summary>
256
- <p>Sim. Voce pode usar moderacao e stickers no mesmo fluxo de grupo.</p>
257
- </details>
258
- </div>
259
- </section>
260
-
261
- <section class="card">
262
- <h2>Links úteis</h2>
263
- <div class="links-grid">
264
- <a href="/">OmniZap Home</a>
265
- <a href="/stickers/">Catálogo de Stickers</a>
266
- <a href="/comandos/">Biblioteca de Comandos</a>
267
- <a href="/api-docs/">Área de Desenvolvedor</a>
268
- <a href="/login/">Adicionar bot agora</a>
269
- <a href="/como-moderar-grupo-whatsapp/">Como moderar grupo no WhatsApp</a>
270
- <a href="/como-automatizar-avisos-no-whatsapp/">Como automatizar avisos no WhatsApp</a>
271
- <a href="/bot-whatsapp-sem-programar/">Bot sem programar</a>
272
- </div>
273
- </section>
274
- </main>
275
- </body>
276
- </html>
271
+ </section>
272
+
273
+ <section class="card">
274
+ <h2>Perguntas frequentes</h2>
275
+ <div class="faq-list">
276
+ <details class="faq-item">
277
+ <summary>O bot bloqueia todo tipo de spam automaticamente?</summary>
278
+ <p>Ele cobre os casos mais comuns e pode ser ajustado conforme o perfil do grupo.</p>
279
+ </details>
280
+ <details class="faq-item">
281
+ <summary>Spam reduz quando o bot entra?</summary>
282
+ <p>Na pratica, a queda costuma ser imediata apos ativar regras basicas.</p>
283
+ </details>
284
+ <details class="faq-item">
285
+ <summary>Posso manter recursos de engajamento junto com anti-spam?</summary>
286
+ <p>Sim. Voce pode usar moderacao e stickers no mesmo fluxo de grupo.</p>
287
+ </details>
288
+ </div>
289
+ </section>
290
+
291
+ <section class="card">
292
+ <h2>Links úteis</h2>
293
+ <div class="links-grid">
294
+ <a href="/">OmniZap Home</a>
295
+ <a href="/stickers/">Catálogo de Stickers</a>
296
+ <a href="/comandos/">Biblioteca de Comandos</a>
297
+ <a href="/api-docs/">Área de Desenvolvedor</a>
298
+ <a href="/login/">Adicionar bot agora</a>
299
+ <a href="/como-moderar-grupo-whatsapp/">Como moderar grupo no WhatsApp</a>
300
+ <a href="/como-automatizar-avisos-no-whatsapp/">Como automatizar avisos no WhatsApp</a>
301
+ <a href="/bot-whatsapp-sem-programar/">Bot sem programar</a>
302
+ </div>
303
+ </section>
304
+ </main>
305
+ </body>
306
+ </html>