@stone-wpp/ofc 1.0.6 → 1.0.7
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.
- package/README.md +40 -96
- package/lib/Signal/lid-mapping.js +9 -1
- package/lib/Socket/index.d.ts +1 -1
- package/lib/Socket/index.js +2 -1
- package/lib/Socket/messages-recv.js +16 -26
- package/lib/Socket/messages-send.js +10 -5
- package/lib/Socket/socket.js +7 -1
- package/lib/Socket/stone-call-audio.js +118 -0
- package/lib/Socket/stone-call-keys.js +96 -0
- package/lib/Socket/stone-call-signaling.js +127 -0
- package/lib/Socket/stone-calls.d.ts +76 -0
- package/lib/Socket/stone-calls.js +311 -0
- package/lib/Socket/stone-features.d.ts +11 -0
- package/lib/Socket/stone-features.js +61 -0
- package/lib/Socket/stone-pairing-state.js +7 -0
- package/lib/Socket/stone-voip-bridge.js +263 -0
- package/lib/Socket/stone-voip-codec.js +33 -0
- package/lib/Socket/stone-voip-group.js +112 -0
- package/lib/Socket/stone-voip-identity.js +26 -0
- package/lib/Socket/stone-voip-offer-audit.js +49 -0
- package/lib/Socket/stone-voip-transport.js +44 -0
- package/lib/Utils/messages-media.js +15 -1
- package/lib/Utils/validate-connection.js +2 -0
- package/package.json +15 -5
- package/docs/group-protection.md +0 -203
- package/lib/Socket/chats.js.bak +0 -1198
package/docs/group-protection.md
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
# groupProtection — proteção de grupos na Stone WPP
|
|
2
|
-
|
|
3
|
-
A API nativa `sock.groupProtection(jid, options)` usa a recepção da própria Stone e
|
|
4
|
-
não modifica o protocolo de criptografia. Detecta rajadas de mensagens de pagamento
|
|
5
|
-
e flood, observa falhas de descriptografia, recibos de retry e solicitações PDO de
|
|
6
|
-
recuperação. **Nenhuma dessas observações é garantia de ataque ou de mensagem recuperada.**
|
|
7
|
-
|
|
8
|
-
## 1. Ativar sem risco
|
|
9
|
-
|
|
10
|
-
```js
|
|
11
|
-
await sock.groupProtection(grupoJid, {
|
|
12
|
-
enabled: true,
|
|
13
|
-
mode: 'alert',
|
|
14
|
-
observeInvisible: true,
|
|
15
|
-
observeReceipts: true
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
sock.ev.on('group-protection.alert', alerta => {
|
|
19
|
-
console.log(alerta.jid, alerta.reason, alerta.severity, alerta.verified)
|
|
20
|
-
})
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
O modo `alert` não apaga conteúdo e não remove pessoas. Use-o em um grupo próprio
|
|
24
|
-
para calibrar os limites antes de optar por moderação automática.
|
|
25
|
-
|
|
26
|
-
## 2. Moderação automática e imunidade
|
|
27
|
-
|
|
28
|
-
```js
|
|
29
|
-
await sock.groupProtection(grupoJid, {
|
|
30
|
-
enabled: true,
|
|
31
|
-
mode: 'protect',
|
|
32
|
-
paymentBurst: 3,
|
|
33
|
-
messageBurst: 14,
|
|
34
|
-
windowMs: 8000,
|
|
35
|
-
lockMs: 12000,
|
|
36
|
-
editNotice: true,
|
|
37
|
-
immunity: [donoJid, moderadorJid]
|
|
38
|
-
})
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
| Opção | Significado |
|
|
42
|
-
| --- | --- |
|
|
43
|
-
| `mode: 'alert'` | Só registra alertas (padrão) |
|
|
44
|
-
| `mode: 'delete'` | Tenta excluir a mensagem de rajada verificada |
|
|
45
|
-
| `mode: 'remove'` | Tenta excluir e remover participante |
|
|
46
|
-
| `mode: 'protect'` | Tenta fechar temporariamente, excluir e remover |
|
|
47
|
-
| `paymentBurst` | Número de mensagens de pagamento por remetente na janela (2–30) |
|
|
48
|
-
| `messageBurst` | Número de mensagens por remetente na janela (3–100) |
|
|
49
|
-
| `windowMs` | Janela de observação em milissegundos (1.000–60.000) |
|
|
50
|
-
| `lockMs` | Intervalo de fechamento do grupo (3.000–120.000 ms) |
|
|
51
|
-
| `immunity` | Até 200 JIDs que jamais serão removidos automaticamente |
|
|
52
|
-
| `editNotice` | Edita **somente avisos enviados pelo bot**, nunca mensagens de terceiros |
|
|
53
|
-
| `observeReceipts` | Observa recibos de retry (padrão: true) |
|
|
54
|
-
| `receiptBurst` | Volume que gera alerta leve de recibos (3–50) |
|
|
55
|
-
| `historyLimit` | Registros recentes mantidos por grupo (20–500) |
|
|
56
|
-
|
|
57
|
-
O bot precisa ser administrador. Pessoas sem identidade confirmada, administradores
|
|
58
|
-
e JIDs imunes não são expulsos. **PN e LID são tipos diferentes de identificador**:
|
|
59
|
-
inclua as formas conhecidas na imunidade se aplicável. Rajadas de mensagens legítimas
|
|
60
|
-
podem parecer ataques; ajuste os limites conforme o grupo.
|
|
61
|
-
|
|
62
|
-
## 3. Recibos ocultos e PDO já existente
|
|
63
|
-
|
|
64
|
-
A Stone já possui `requestPlaceholderResend`, retry e PDO. A proteção acrescenta
|
|
65
|
-
**telemetria passiva** ao caminho nativo, sem duplicar solicitações:
|
|
66
|
-
|
|
67
|
-
```js
|
|
68
|
-
sock.ev.on('group-protection.pdo-observed', ({ jid, messageId, status }) => {
|
|
69
|
-
console.log('PDO do grupo:', jid, messageId, status)
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
sock.ev.on('group-protection.alert', alerta => {
|
|
73
|
-
if (alerta.reason === 'receipt-suspected') {
|
|
74
|
-
console.log('Rajada de retry observada — sem expulsão automática')
|
|
75
|
-
}
|
|
76
|
-
})
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
`group-protection.receipt` é o evento bruto com `remoteJid`, `participant`,
|
|
80
|
-
`messageId` e `type: 'retry'`. `group-protection.pdo` informa eventos nativos
|
|
81
|
-
`requested`, `resolved` ou `timeout`; `group-protection.pdo-observed`
|
|
82
|
-
exibe apenas os PDO dos grupos ativados. Recebimentos de retry e falhas de
|
|
83
|
-
descriptografia são **sinais técnicos**, não prova de intenção maliciosa.
|
|
84
|
-
Um pedido PDO pode falhar, expirar ou retornar sem recuperar o conteúdo.
|
|
85
|
-
|
|
86
|
-
## 4. Salvar configurações e consultar histórico
|
|
87
|
-
|
|
88
|
-
Use `createStoneStore` com JSON ou SQLite. O armazenamento é **opcional** e
|
|
89
|
-
precisa ser informado explicitamente. Exemplo:
|
|
90
|
-
|
|
91
|
-
```js
|
|
92
|
-
import { createStoneStore } from '@stone-wpp/ofc'
|
|
93
|
-
|
|
94
|
-
const store = await createStoneStore({ type: 'json', path: './dados/protecao.json' })
|
|
95
|
-
await sock.groupProtection(grupoJid, {
|
|
96
|
-
enabled: true,
|
|
97
|
-
mode: 'alert',
|
|
98
|
-
store,
|
|
99
|
-
immunity: [donoJid],
|
|
100
|
-
historyLimit: 100
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
// Após reiniciar o bot, com o mesmo store:
|
|
104
|
-
await sock.groupProtection(grupoJid, { restore: true, store })
|
|
105
|
-
|
|
106
|
-
// Consultar últimos 30 registros, sem dados de mensagens:
|
|
107
|
-
const status = await sock.groupProtection(grupoJid, { getHistory: true, limit: 30 })
|
|
108
|
-
console.log(status.history)
|
|
109
|
-
|
|
110
|
-
// Desativar e salvar o estado desligado:
|
|
111
|
-
await sock.groupProtection(grupoJid, { enabled: false, store })
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
O histórico salva somente grupo, participante, tipo de alerta/ação, situação de
|
|
115
|
-
moderação e horário. Não armazena automaticamente texto de mensagens, ciphertext
|
|
116
|
-
ou chaves da sessão. A proteção só restaura grupos que o seu aplicativo indicar;
|
|
117
|
-
o store **não inicia sessões nem descobre todos os grupos sozinho**.
|
|
118
|
-
|
|
119
|
-
## 5. Até três monitores complementares com reconexão
|
|
120
|
-
|
|
121
|
-
`monitors` aceita sockets Stone já criados. Para **recriação automática**
|
|
122
|
-
de um monitor após queda temporária use `monitorFactories`: a função factory
|
|
123
|
-
deve criar o socket autenticado e carregar/persistir sua própria sessão.
|
|
124
|
-
|
|
125
|
-
```js
|
|
126
|
-
await sock.groupProtection(grupoJid, {
|
|
127
|
-
enabled: true,
|
|
128
|
-
mode: 'alert',
|
|
129
|
-
monitorFactories: [
|
|
130
|
-
async ({ attempt }) => criarMonitorComSessaoSalva('auxiliar1', attempt),
|
|
131
|
-
async ({ attempt }) => criarMonitorComSessaoSalva('auxiliar2', attempt)
|
|
132
|
-
],
|
|
133
|
-
monitorReconnectMs: 3000
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
sock.ev.on('group-protection.monitor', ({ index, status, error }) => {
|
|
137
|
-
console.log('Monitor:', index, status, error || '')
|
|
138
|
-
})
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Pareamento autorizado de um monitor novo
|
|
142
|
-
|
|
143
|
-
Se a sessão auxiliar ainda não foi vinculada, é possível solicitar um código
|
|
144
|
-
**somente quando o titular configurar explicitamente** o número e callback.
|
|
145
|
-
A Stone informa o código; o proprietário confirma no aplicativo WhatsApp.
|
|
146
|
-
|
|
147
|
-
```js
|
|
148
|
-
import makeStone, { useMultiFileAuthState } from '@stone-wpp/ofc'
|
|
149
|
-
|
|
150
|
-
async function criarMonitor() {
|
|
151
|
-
const { state, saveCreds } = await useMultiFileAuthState('./sessao-monitor-1')
|
|
152
|
-
const monitor = makeStone({ auth: state })
|
|
153
|
-
monitor.ev.on('creds.update', saveCreds)
|
|
154
|
-
return monitor
|
|
155
|
-
}
|
|
156
|
-
await sock.groupProtection(grupoJid, {
|
|
157
|
-
enabled: true,
|
|
158
|
-
mode: 'alert',
|
|
159
|
-
monitorFactories: [{
|
|
160
|
-
create: criarMonitor,
|
|
161
|
-
phoneNumber: '5511999999999', // use seu número com DDI
|
|
162
|
-
onPairingCode({ code }) {
|
|
163
|
-
console.log('Vincule no WhatsApp do titular:', code)
|
|
164
|
-
}
|
|
165
|
-
}]
|
|
166
|
-
})
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
Não há pareamento sem o usuário confirmar o código no telefone.
|
|
170
|
-
Cada monitor precisa de pasta de credenciais distinta. Se houver logout,
|
|
171
|
-
a reconexão para, evitando tentativas silenciosas.
|
|
172
|
-
|
|
173
|
-
A função `criarMonitorComSessaoSalva` é criada **pela sua aplicação**;
|
|
174
|
-
ela não é uma exportação da Stone. Ela deve utilizar suas próprias credenciais
|
|
175
|
-
de WhatsApp, do mesmo modo que você cria a sessão principal. Cada número
|
|
176
|
-
auxiliar precisa ser autenticado **com autorização do proprietário** e
|
|
177
|
-
participar do grupo. Não há pareamento silencioso: em caso de logout (401),
|
|
178
|
-
a proteção não tenta conectar novamente sem novo vínculo.
|
|
179
|
-
|
|
180
|
-
`monitors` e `monitorFactories` juntos aceitam **até três** sessões adicionais.
|
|
181
|
-
A Stone deduplica IDs recebidos de mais de uma sessão e observa apenas os
|
|
182
|
-
grupos em que o monitor foi configurado. Uma mensagem omitida pelo WhatsApp
|
|
183
|
-
para todas as sessões continua invisível.
|
|
184
|
-
|
|
185
|
-
## 6. Status, erros e testes
|
|
186
|
-
|
|
187
|
-
```js
|
|
188
|
-
const state = await sock.groupProtection(grupoJid)
|
|
189
|
-
console.log(state.enabled, state.mode, state.monitorCount)
|
|
190
|
-
console.log(state.alerts, state.actions)
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
Eventos de acompanhamento:
|
|
194
|
-
- `group-protection.alert` — motivo, gravidade, evidência limitada e origem.
|
|
195
|
-
- `group-protection.action` — tentativa e resultado da moderação.
|
|
196
|
-
- `group-protection.monitor` — monitor conectado, erro ou logout.
|
|
197
|
-
- `group-protection.pdo-observed` — telemetria de recuperação de placeholder.
|
|
198
|
-
|
|
199
|
-
Testes locais: `npm test`. Ative inicialmente `mode: 'alert'` em grupos controlados,
|
|
200
|
-
verifique casos normais (pagamento legítimo, perda de conexão, um participante
|
|
201
|
-
muito ativo) e só depois considere `delete`, `remove` ou `protect`.
|
|
202
|
-
A proteção não falsifica mensagens atribuídas a terceiros, não garante
|
|
203
|
-
detectar todos os bypasses e não substitui as regras oficiais do WhatsApp.
|