baileys-joss 1.0.1 → 1.0.2
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 +1983 -79
- package/lib/Socket/business.d.ts +4 -0
- package/lib/Socket/business.d.ts.map +1 -1
- package/lib/Socket/chats.d.ts +4 -0
- package/lib/Socket/chats.d.ts.map +1 -1
- package/lib/Socket/chats.js +44 -1
- package/lib/Socket/chats.js.map +1 -1
- package/lib/Socket/communities.d.ts +4 -0
- package/lib/Socket/communities.d.ts.map +1 -1
- package/lib/Socket/groups.d.ts +4 -0
- package/lib/Socket/groups.d.ts.map +1 -1
- package/lib/Socket/index.d.ts +4 -0
- package/lib/Socket/index.d.ts.map +1 -1
- package/lib/Socket/messages-recv.d.ts +4 -0
- package/lib/Socket/messages-recv.d.ts.map +1 -1
- package/lib/Socket/messages-send.d.ts +4 -0
- package/lib/Socket/messages-send.d.ts.map +1 -1
- package/lib/Socket/newsletter.d.ts +4 -0
- package/lib/Socket/newsletter.d.ts.map +1 -1
- package/lib/Types/Message.d.ts +4 -0
- package/lib/Types/Message.d.ts.map +1 -1
- package/lib/Utils/activity-logger.d.ts +189 -0
- package/lib/Utils/activity-logger.d.ts.map +1 -0
- package/lib/Utils/activity-logger.js +418 -0
- package/lib/Utils/activity-logger.js.map +1 -0
- package/lib/Utils/anti-spam.d.ts +145 -0
- package/lib/Utils/anti-spam.d.ts.map +1 -0
- package/lib/Utils/anti-spam.js +398 -0
- package/lib/Utils/anti-spam.js.map +1 -0
- package/lib/Utils/auto-reply.d.ts +123 -0
- package/lib/Utils/auto-reply.d.ts.map +1 -0
- package/lib/Utils/auto-reply.js +234 -0
- package/lib/Utils/auto-reply.js.map +1 -0
- package/lib/Utils/broadcast.d.ts +121 -0
- package/lib/Utils/broadcast.d.ts.map +1 -0
- package/lib/Utils/broadcast.js +223 -0
- package/lib/Utils/broadcast.js.map +1 -0
- package/lib/Utils/bulk-messaging.d.ts +79 -0
- package/lib/Utils/bulk-messaging.d.ts.map +1 -0
- package/lib/Utils/bulk-messaging.js +148 -0
- package/lib/Utils/bulk-messaging.js.map +1 -0
- package/lib/Utils/chat-analytics.d.ts +92 -0
- package/lib/Utils/chat-analytics.d.ts.map +1 -0
- package/lib/Utils/chat-analytics.js +337 -0
- package/lib/Utils/chat-analytics.js.map +1 -0
- package/lib/Utils/chat-control.d.ts +156 -0
- package/lib/Utils/chat-control.d.ts.map +1 -0
- package/lib/Utils/chat-control.js +224 -0
- package/lib/Utils/chat-control.js.map +1 -0
- package/lib/Utils/chat-export.d.ts +75 -0
- package/lib/Utils/chat-export.d.ts.map +1 -0
- package/lib/Utils/chat-export.js +309 -0
- package/lib/Utils/chat-export.js.map +1 -0
- package/lib/Utils/content-detector.d.ts +199 -0
- package/lib/Utils/content-detector.d.ts.map +1 -0
- package/lib/Utils/content-detector.js +442 -0
- package/lib/Utils/content-detector.js.map +1 -0
- package/lib/Utils/index.d.ts +23 -0
- package/lib/Utils/index.d.ts.map +1 -1
- package/lib/Utils/index.js +52 -0
- package/lib/Utils/index.js.map +1 -1
- package/lib/Utils/link-scanner.d.ts +112 -0
- package/lib/Utils/link-scanner.d.ts.map +1 -0
- package/lib/Utils/link-scanner.js +433 -0
- package/lib/Utils/link-scanner.js.map +1 -0
- package/lib/Utils/media-downloader.d.ts +86 -0
- package/lib/Utils/media-downloader.d.ts.map +1 -0
- package/lib/Utils/media-downloader.js +269 -0
- package/lib/Utils/media-downloader.js.map +1 -0
- package/lib/Utils/meme-generator.d.ts +96 -0
- package/lib/Utils/meme-generator.d.ts.map +1 -0
- package/lib/Utils/meme-generator.js +368 -0
- package/lib/Utils/meme-generator.js.map +1 -0
- package/lib/Utils/message-search.d.ts +96 -0
- package/lib/Utils/message-search.d.ts.map +1 -0
- package/lib/Utils/message-search.js +261 -0
- package/lib/Utils/message-search.js.map +1 -0
- package/lib/Utils/messages-media.d.ts +20 -1
- package/lib/Utils/messages-media.d.ts.map +1 -1
- package/lib/Utils/messages-media.js +100 -5
- package/lib/Utils/messages-media.js.map +1 -1
- package/lib/Utils/messages.d.ts.map +1 -1
- package/lib/Utils/messages.js +9 -2
- package/lib/Utils/messages.js.map +1 -1
- package/lib/Utils/mini-games.d.ts +155 -0
- package/lib/Utils/mini-games.d.ts.map +1 -0
- package/lib/Utils/mini-games.js +445 -0
- package/lib/Utils/mini-games.js.map +1 -0
- package/lib/Utils/pomodoro.d.ts +139 -0
- package/lib/Utils/pomodoro.d.ts.map +1 -0
- package/lib/Utils/pomodoro.js +434 -0
- package/lib/Utils/pomodoro.js.map +1 -0
- package/lib/Utils/qr-generator.d.ts +95 -0
- package/lib/Utils/qr-generator.d.ts.map +1 -0
- package/lib/Utils/qr-generator.js +226 -0
- package/lib/Utils/qr-generator.js.map +1 -0
- package/lib/Utils/quotes.d.ts +110 -0
- package/lib/Utils/quotes.d.ts.map +1 -0
- package/lib/Utils/quotes.js +325 -0
- package/lib/Utils/quotes.js.map +1 -0
- package/lib/Utils/scheduling.d.ts +88 -0
- package/lib/Utils/scheduling.d.ts.map +1 -0
- package/lib/Utils/scheduling.js +163 -0
- package/lib/Utils/scheduling.js.map +1 -0
- package/lib/Utils/status-posting.d.ts +151 -0
- package/lib/Utils/status-posting.d.ts.map +1 -0
- package/lib/Utils/status-posting.js +162 -0
- package/lib/Utils/status-posting.js.map +1 -0
- package/lib/Utils/templates.d.ts +154 -0
- package/lib/Utils/templates.d.ts.map +1 -0
- package/lib/Utils/templates.js +368 -0
- package/lib/Utils/templates.js.map +1 -0
- package/lib/Utils/vcard.d.ts +86 -0
- package/lib/Utils/vcard.d.ts.map +1 -0
- package/lib/Utils/vcard.js +195 -0
- package/lib/Utils/vcard.js.map +1 -0
- package/lib/Utils/voice-note.d.ts +115 -0
- package/lib/Utils/voice-note.d.ts.map +1 -0
- package/lib/Utils/voice-note.js +212 -0
- package/lib/Utils/voice-note.js.map +1 -0
- package/lib/Utils/weather.d.ts +118 -0
- package/lib/Utils/weather.d.ts.map +1 -0
- package/lib/Utils/weather.js +362 -0
- package/lib/Utils/weather.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baileys-Joss: Link Scanner
|
|
3
|
+
*
|
|
4
|
+
* Scan dan validasi URL untuk keamanan:
|
|
5
|
+
* - Check domain reputation
|
|
6
|
+
* - Detect phishing patterns
|
|
7
|
+
* - URL shortener expansion
|
|
8
|
+
* - Safe browsing check
|
|
9
|
+
*/
|
|
10
|
+
import https from 'https';
|
|
11
|
+
import http from 'http';
|
|
12
|
+
// =====================================================
|
|
13
|
+
// KNOWN DATA
|
|
14
|
+
// =====================================================
|
|
15
|
+
const URL_SHORTENERS = new Set([
|
|
16
|
+
'bit.ly', 'bitly.com', 'tinyurl.com', 'goo.gl', 't.co',
|
|
17
|
+
'ow.ly', 'is.gd', 'buff.ly', 'j.mp', 'rb.gy',
|
|
18
|
+
'cutt.ly', 'short.link', 'tiny.cc', 'v.gd', 'clck.ru',
|
|
19
|
+
's.id', 'shorturl.at', 'rebrand.ly', 'bl.ink', 'soo.gd'
|
|
20
|
+
]);
|
|
21
|
+
const SUSPICIOUS_TLDS = new Set([
|
|
22
|
+
'.tk', '.ml', '.ga', '.cf', '.gq', '.xyz', '.top',
|
|
23
|
+
'.work', '.click', '.link', '.info', '.biz', '.cc'
|
|
24
|
+
]);
|
|
25
|
+
const KNOWN_MALICIOUS_PATTERNS = [
|
|
26
|
+
/phish/i,
|
|
27
|
+
/scam/i,
|
|
28
|
+
/fake.*login/i,
|
|
29
|
+
/secure.*update/i,
|
|
30
|
+
/account.*verify/i,
|
|
31
|
+
/password.*reset.*urgent/i,
|
|
32
|
+
/suspended.*account/i,
|
|
33
|
+
/banking.*security/i
|
|
34
|
+
];
|
|
35
|
+
const TRUSTED_DOMAINS = new Set([
|
|
36
|
+
'google.com', 'facebook.com', 'instagram.com', 'twitter.com',
|
|
37
|
+
'youtube.com', 'linkedin.com', 'github.com', 'microsoft.com',
|
|
38
|
+
'apple.com', 'amazon.com', 'whatsapp.com', 'telegram.org',
|
|
39
|
+
'wikipedia.org', 'reddit.com', 'stackoverflow.com'
|
|
40
|
+
]);
|
|
41
|
+
const PHISHING_KEYWORDS = [
|
|
42
|
+
'login', 'signin', 'verify', 'secure', 'account', 'update',
|
|
43
|
+
'confirm', 'password', 'credential', 'bank', 'paypal',
|
|
44
|
+
'apple', 'google', 'microsoft', 'facebook', 'instagram'
|
|
45
|
+
];
|
|
46
|
+
// =====================================================
|
|
47
|
+
// LINK SCANNER CLASS
|
|
48
|
+
// =====================================================
|
|
49
|
+
export class LinkScanner {
|
|
50
|
+
constructor(options = {}) {
|
|
51
|
+
this.options = {
|
|
52
|
+
followRedirects: options.followRedirects ?? true,
|
|
53
|
+
maxRedirects: options.maxRedirects ?? 5,
|
|
54
|
+
timeout: options.timeout ?? 5000,
|
|
55
|
+
maliciousDomains: options.maliciousDomains ?? [],
|
|
56
|
+
safeDomains: options.safeDomains ?? [],
|
|
57
|
+
enablePhishingDetection: options.enablePhishingDetection ?? true
|
|
58
|
+
};
|
|
59
|
+
this.maliciousDomains = new Set(this.options.maliciousDomains);
|
|
60
|
+
this.safeDomains = new Set([...TRUSTED_DOMAINS, ...this.options.safeDomains]);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Scan a URL for security threats
|
|
64
|
+
*/
|
|
65
|
+
async scan(url) {
|
|
66
|
+
const threats = [];
|
|
67
|
+
let riskScore = 0;
|
|
68
|
+
// Parse URL
|
|
69
|
+
let parsedUrl;
|
|
70
|
+
try {
|
|
71
|
+
parsedUrl = new URL(url);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return {
|
|
75
|
+
url,
|
|
76
|
+
safe: false,
|
|
77
|
+
riskLevel: 'critical',
|
|
78
|
+
riskScore: 100,
|
|
79
|
+
threats: ['Invalid URL format'],
|
|
80
|
+
details: {
|
|
81
|
+
isShortener: false,
|
|
82
|
+
domain: '',
|
|
83
|
+
isHttps: false,
|
|
84
|
+
hasIPAddress: false,
|
|
85
|
+
hasSuspiciousPath: false,
|
|
86
|
+
isKnownMalicious: false,
|
|
87
|
+
phishingScore: 0
|
|
88
|
+
},
|
|
89
|
+
scannedAt: new Date()
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const domain = parsedUrl.hostname.toLowerCase();
|
|
93
|
+
const isHttps = parsedUrl.protocol === 'https:';
|
|
94
|
+
const isShortener = URL_SHORTENERS.has(domain);
|
|
95
|
+
const hasIPAddress = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(domain);
|
|
96
|
+
// Check if it's a known safe domain
|
|
97
|
+
if (this.safeDomains.has(domain) || this.isDomainSafe(domain)) {
|
|
98
|
+
return {
|
|
99
|
+
url,
|
|
100
|
+
safe: true,
|
|
101
|
+
riskLevel: 'safe',
|
|
102
|
+
riskScore: 0,
|
|
103
|
+
threats: [],
|
|
104
|
+
details: {
|
|
105
|
+
isShortener,
|
|
106
|
+
domain,
|
|
107
|
+
isHttps,
|
|
108
|
+
hasIPAddress: false,
|
|
109
|
+
hasSuspiciousPath: false,
|
|
110
|
+
isKnownMalicious: false,
|
|
111
|
+
phishingScore: 0
|
|
112
|
+
},
|
|
113
|
+
scannedAt: new Date()
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Check HTTPS
|
|
117
|
+
if (!isHttps) {
|
|
118
|
+
threats.push('No HTTPS encryption');
|
|
119
|
+
riskScore += 15;
|
|
120
|
+
}
|
|
121
|
+
// Check IP address instead of domain
|
|
122
|
+
if (hasIPAddress) {
|
|
123
|
+
threats.push('Uses IP address instead of domain name');
|
|
124
|
+
riskScore += 25;
|
|
125
|
+
}
|
|
126
|
+
// Check for URL shortener
|
|
127
|
+
if (isShortener) {
|
|
128
|
+
threats.push('URL shortener (may hide malicious destination)');
|
|
129
|
+
riskScore += 15;
|
|
130
|
+
}
|
|
131
|
+
// Check suspicious TLD
|
|
132
|
+
if (this.hasSuspiciousTLD(domain)) {
|
|
133
|
+
threats.push('Suspicious top-level domain');
|
|
134
|
+
riskScore += 20;
|
|
135
|
+
}
|
|
136
|
+
// Check known malicious domains
|
|
137
|
+
if (this.maliciousDomains.has(domain)) {
|
|
138
|
+
threats.push('Known malicious domain');
|
|
139
|
+
riskScore += 50;
|
|
140
|
+
}
|
|
141
|
+
// Check suspicious path patterns
|
|
142
|
+
const hasSuspiciousPath = this.checkSuspiciousPath(parsedUrl.pathname + parsedUrl.search);
|
|
143
|
+
if (hasSuspiciousPath) {
|
|
144
|
+
threats.push('Suspicious URL path pattern');
|
|
145
|
+
riskScore += 20;
|
|
146
|
+
}
|
|
147
|
+
// Phishing detection
|
|
148
|
+
let phishingScore = 0;
|
|
149
|
+
if (this.options.enablePhishingDetection) {
|
|
150
|
+
phishingScore = this.calculatePhishingScore(url, domain);
|
|
151
|
+
if (phishingScore >= 50) {
|
|
152
|
+
threats.push(`Phishing indicators detected (score: ${phishingScore})`);
|
|
153
|
+
riskScore += Math.min(phishingScore / 2, 30);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Check for known malicious patterns
|
|
157
|
+
const isKnownMalicious = KNOWN_MALICIOUS_PATTERNS.some(pattern => pattern.test(url));
|
|
158
|
+
if (isKnownMalicious) {
|
|
159
|
+
threats.push('Matches known malicious pattern');
|
|
160
|
+
riskScore += 40;
|
|
161
|
+
}
|
|
162
|
+
// Follow redirects if enabled
|
|
163
|
+
let finalUrl;
|
|
164
|
+
if (this.options.followRedirects && isShortener) {
|
|
165
|
+
try {
|
|
166
|
+
finalUrl = await this.resolveRedirects(url);
|
|
167
|
+
if (finalUrl && finalUrl !== url) {
|
|
168
|
+
// Recursively scan the final URL
|
|
169
|
+
const finalResult = await this.scan(finalUrl);
|
|
170
|
+
if (!finalResult.safe) {
|
|
171
|
+
threats.push(...finalResult.threats.map(t => `[Final URL] ${t}`));
|
|
172
|
+
riskScore = Math.max(riskScore, finalResult.riskScore);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
threats.push('Failed to resolve URL shortener');
|
|
178
|
+
riskScore += 10;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Determine risk level
|
|
182
|
+
const riskLevel = this.getRiskLevel(riskScore);
|
|
183
|
+
return {
|
|
184
|
+
url,
|
|
185
|
+
safe: riskScore < 30,
|
|
186
|
+
riskLevel,
|
|
187
|
+
riskScore: Math.min(riskScore, 100),
|
|
188
|
+
threats,
|
|
189
|
+
details: {
|
|
190
|
+
isShortener,
|
|
191
|
+
finalUrl,
|
|
192
|
+
domain,
|
|
193
|
+
isHttps,
|
|
194
|
+
hasIPAddress,
|
|
195
|
+
hasSuspiciousPath,
|
|
196
|
+
isKnownMalicious,
|
|
197
|
+
phishingScore
|
|
198
|
+
},
|
|
199
|
+
scannedAt: new Date()
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Batch scan multiple URLs
|
|
204
|
+
*/
|
|
205
|
+
async scanMultiple(urls) {
|
|
206
|
+
return Promise.all(urls.map(url => this.scan(url)));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Quick check if URL is suspicious
|
|
210
|
+
*/
|
|
211
|
+
quickCheck(url) {
|
|
212
|
+
const reasons = [];
|
|
213
|
+
try {
|
|
214
|
+
const parsedUrl = new URL(url);
|
|
215
|
+
const domain = parsedUrl.hostname.toLowerCase();
|
|
216
|
+
if (!parsedUrl.protocol.startsWith('https')) {
|
|
217
|
+
reasons.push('No HTTPS');
|
|
218
|
+
}
|
|
219
|
+
if (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(domain)) {
|
|
220
|
+
reasons.push('IP address');
|
|
221
|
+
}
|
|
222
|
+
if (URL_SHORTENERS.has(domain)) {
|
|
223
|
+
reasons.push('URL shortener');
|
|
224
|
+
}
|
|
225
|
+
if (this.hasSuspiciousTLD(domain)) {
|
|
226
|
+
reasons.push('Suspicious TLD');
|
|
227
|
+
}
|
|
228
|
+
if (this.maliciousDomains.has(domain)) {
|
|
229
|
+
reasons.push('Known malicious');
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
reasons.push('Invalid URL');
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
suspicious: reasons.length > 0,
|
|
237
|
+
reasons
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Add domain to malicious list
|
|
242
|
+
*/
|
|
243
|
+
addMaliciousDomain(domain) {
|
|
244
|
+
this.maliciousDomains.add(domain.toLowerCase());
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Add domain to safe list
|
|
248
|
+
*/
|
|
249
|
+
addSafeDomain(domain) {
|
|
250
|
+
this.safeDomains.add(domain.toLowerCase());
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Remove domain from malicious list
|
|
254
|
+
*/
|
|
255
|
+
removeMaliciousDomain(domain) {
|
|
256
|
+
this.maliciousDomains.delete(domain.toLowerCase());
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Check if domain is safe
|
|
260
|
+
*/
|
|
261
|
+
isDomainSafe(domain) {
|
|
262
|
+
// Check if it's a subdomain of a trusted domain
|
|
263
|
+
for (const trusted of this.safeDomains) {
|
|
264
|
+
if (domain === trusted || domain.endsWith(`.${trusted}`)) {
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Check for suspicious TLD
|
|
272
|
+
*/
|
|
273
|
+
hasSuspiciousTLD(domain) {
|
|
274
|
+
for (const tld of SUSPICIOUS_TLDS) {
|
|
275
|
+
if (domain.endsWith(tld)) {
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Check for suspicious path patterns
|
|
283
|
+
*/
|
|
284
|
+
checkSuspiciousPath(path) {
|
|
285
|
+
const lowerPath = path.toLowerCase();
|
|
286
|
+
// Check for common phishing path patterns
|
|
287
|
+
const suspiciousPatterns = [
|
|
288
|
+
/\/login\//i,
|
|
289
|
+
/\/signin\//i,
|
|
290
|
+
/\/verify\//i,
|
|
291
|
+
/\/secure\//i,
|
|
292
|
+
/\/account\//i,
|
|
293
|
+
/\.php\?.*(?:user|pass|login|token)/i,
|
|
294
|
+
/\/wp-(?:admin|login)/i,
|
|
295
|
+
/\/administrator/i
|
|
296
|
+
];
|
|
297
|
+
return suspiciousPatterns.some(pattern => pattern.test(lowerPath));
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Calculate phishing score
|
|
301
|
+
*/
|
|
302
|
+
calculatePhishingScore(url, domain) {
|
|
303
|
+
let score = 0;
|
|
304
|
+
const lowerUrl = url.toLowerCase();
|
|
305
|
+
const lowerDomain = domain.toLowerCase();
|
|
306
|
+
// Check for brand impersonation
|
|
307
|
+
for (const keyword of PHISHING_KEYWORDS) {
|
|
308
|
+
// Brand name in subdomain (like google.malicious.com)
|
|
309
|
+
if (lowerDomain.includes(keyword) && !this.safeDomains.has(domain)) {
|
|
310
|
+
score += 20;
|
|
311
|
+
}
|
|
312
|
+
// Brand name in path
|
|
313
|
+
if (lowerUrl.includes(keyword)) {
|
|
314
|
+
score += 5;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// Check for lookalike domains
|
|
318
|
+
const lookalikePairs = [
|
|
319
|
+
['google', ['g00gle', 'googie', 'go0gle', 'goog1e']],
|
|
320
|
+
['facebook', ['faceb00k', 'facebok', 'faceboook']],
|
|
321
|
+
['microsoft', ['micr0soft', 'mircosoft', 'microsft']],
|
|
322
|
+
['apple', ['app1e', 'appie', 'aple']],
|
|
323
|
+
['paypal', ['paypa1', 'paypai', 'paypaI']]
|
|
324
|
+
];
|
|
325
|
+
for (const [, lookalikes] of lookalikePairs) {
|
|
326
|
+
for (const lookalike of lookalikes) {
|
|
327
|
+
if (lowerDomain.includes(lookalike)) {
|
|
328
|
+
score += 40;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// Check for excessive subdomains
|
|
333
|
+
const subdomainCount = domain.split('.').length - 2;
|
|
334
|
+
if (subdomainCount > 2) {
|
|
335
|
+
score += 10 * (subdomainCount - 2);
|
|
336
|
+
}
|
|
337
|
+
// Check for suspicious characters
|
|
338
|
+
if (/[@]/.test(url.split('?')[0] || '')) {
|
|
339
|
+
score += 30;
|
|
340
|
+
}
|
|
341
|
+
// Check for encoded characters that look suspicious
|
|
342
|
+
if (/%[0-9a-f]{2}/i.test(domain)) {
|
|
343
|
+
score += 20;
|
|
344
|
+
}
|
|
345
|
+
return Math.min(score, 100);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Get risk level from score
|
|
349
|
+
*/
|
|
350
|
+
getRiskLevel(score) {
|
|
351
|
+
if (score < 15)
|
|
352
|
+
return 'safe';
|
|
353
|
+
if (score < 30)
|
|
354
|
+
return 'low';
|
|
355
|
+
if (score < 50)
|
|
356
|
+
return 'medium';
|
|
357
|
+
if (score < 75)
|
|
358
|
+
return 'high';
|
|
359
|
+
return 'critical';
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Resolve URL redirects
|
|
363
|
+
*/
|
|
364
|
+
resolveRedirects(url, depth = 0) {
|
|
365
|
+
return new Promise((resolve, reject) => {
|
|
366
|
+
if (depth >= this.options.maxRedirects) {
|
|
367
|
+
resolve(url);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const protocol = url.startsWith('https') ? https : http;
|
|
371
|
+
const request = protocol.get(url, {
|
|
372
|
+
timeout: this.options.timeout,
|
|
373
|
+
headers: { 'User-Agent': 'Mozilla/5.0' }
|
|
374
|
+
}, (response) => {
|
|
375
|
+
if (response.statusCode && response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
|
|
376
|
+
const redirectUrl = response.headers.location.startsWith('http')
|
|
377
|
+
? response.headers.location
|
|
378
|
+
: new URL(response.headers.location, url).toString();
|
|
379
|
+
this.resolveRedirects(redirectUrl, depth + 1)
|
|
380
|
+
.then(resolve)
|
|
381
|
+
.catch(reject);
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
resolve(url);
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
request.on('error', reject);
|
|
388
|
+
request.on('timeout', () => {
|
|
389
|
+
request.destroy();
|
|
390
|
+
resolve(url);
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// =====================================================
|
|
396
|
+
// FACTORY FUNCTION
|
|
397
|
+
// =====================================================
|
|
398
|
+
export const createLinkScanner = (options) => {
|
|
399
|
+
return new LinkScanner(options);
|
|
400
|
+
};
|
|
401
|
+
// =====================================================
|
|
402
|
+
// QUICK FUNCTIONS
|
|
403
|
+
// =====================================================
|
|
404
|
+
/**
|
|
405
|
+
* Quick check if URL is a shortener
|
|
406
|
+
*/
|
|
407
|
+
export const isUrlShortener = (url) => {
|
|
408
|
+
try {
|
|
409
|
+
const domain = new URL(url).hostname.toLowerCase();
|
|
410
|
+
return URL_SHORTENERS.has(domain);
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
/**
|
|
417
|
+
* Extract domain from URL
|
|
418
|
+
*/
|
|
419
|
+
export const extractDomain = (url) => {
|
|
420
|
+
try {
|
|
421
|
+
return new URL(url).hostname.toLowerCase();
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
/**
|
|
428
|
+
* Check if domain is trusted
|
|
429
|
+
*/
|
|
430
|
+
export const isTrustedDomain = (domain) => {
|
|
431
|
+
return TRUSTED_DOMAINS.has(domain.toLowerCase());
|
|
432
|
+
};
|
|
433
|
+
//# sourceMappingURL=link-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-scanner.js","sourceRoot":"","sources":["../../src/Utils/link-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baileys-Joss: Media Downloader
|
|
3
|
+
*
|
|
4
|
+
* Download semua media dari chat
|
|
5
|
+
*/
|
|
6
|
+
import type { WAMessage } from '../Types/index.js';
|
|
7
|
+
export type DownloadMediaType = 'image' | 'video' | 'audio' | 'document' | 'sticker' | 'all';
|
|
8
|
+
export interface DownloadOptions {
|
|
9
|
+
/** Output directory */
|
|
10
|
+
outputDir: string;
|
|
11
|
+
/** Media types to download */
|
|
12
|
+
types?: DownloadMediaType[];
|
|
13
|
+
/** Create subfolder for each type */
|
|
14
|
+
createSubfolders?: boolean;
|
|
15
|
+
/** Custom filename template */
|
|
16
|
+
filenameTemplate?: string;
|
|
17
|
+
/** Skip existing files */
|
|
18
|
+
skipExisting?: boolean;
|
|
19
|
+
/** Maximum file size in bytes (0 = no limit) */
|
|
20
|
+
maxFileSize?: number;
|
|
21
|
+
/** Progress callback */
|
|
22
|
+
onProgress?: (current: number, total: number, filename: string) => void;
|
|
23
|
+
/** Error callback */
|
|
24
|
+
onError?: (message: WAMessage, error: Error) => void;
|
|
25
|
+
/** Delay between downloads in ms */
|
|
26
|
+
delay?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface DownloadResult {
|
|
29
|
+
messageId: string;
|
|
30
|
+
type: DownloadMediaType;
|
|
31
|
+
filename: string;
|
|
32
|
+
filepath: string;
|
|
33
|
+
size: number;
|
|
34
|
+
success: boolean;
|
|
35
|
+
error?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DownloadSummary {
|
|
38
|
+
total: number;
|
|
39
|
+
successful: number;
|
|
40
|
+
failed: number;
|
|
41
|
+
skipped: number;
|
|
42
|
+
totalSize: number;
|
|
43
|
+
results: DownloadResult[];
|
|
44
|
+
startedAt: Date;
|
|
45
|
+
completedAt: Date;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Media Downloader
|
|
49
|
+
*/
|
|
50
|
+
export declare class MediaDownloader {
|
|
51
|
+
private getMessage;
|
|
52
|
+
constructor(getMessage: (key: {
|
|
53
|
+
remoteJid: string;
|
|
54
|
+
id: string;
|
|
55
|
+
}) => Promise<WAMessage | undefined>);
|
|
56
|
+
/**
|
|
57
|
+
* Filter messages that have downloadable media
|
|
58
|
+
*/
|
|
59
|
+
filterMediaMessages(messages: WAMessage[], types?: DownloadMediaType[]): WAMessage[];
|
|
60
|
+
/**
|
|
61
|
+
* Download media from a single message
|
|
62
|
+
*/
|
|
63
|
+
downloadSingle(message: WAMessage, outputDir: string, options?: Omit<DownloadOptions, 'outputDir'>): Promise<DownloadResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Download media from multiple messages
|
|
66
|
+
*/
|
|
67
|
+
downloadMultiple(messages: WAMessage[], options: DownloadOptions): Promise<DownloadSummary>;
|
|
68
|
+
/**
|
|
69
|
+
* Download all media from a chat
|
|
70
|
+
*/
|
|
71
|
+
downloadFromChat(jid: string, messages: WAMessage[], options: Omit<DownloadOptions, 'outputDir'> & {
|
|
72
|
+
outputDir?: string;
|
|
73
|
+
}): Promise<DownloadSummary>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create media downloader
|
|
77
|
+
*/
|
|
78
|
+
export declare const createMediaDownloader: (getMessage: (key: {
|
|
79
|
+
remoteJid: string;
|
|
80
|
+
id: string;
|
|
81
|
+
}) => Promise<WAMessage | undefined>) => MediaDownloader;
|
|
82
|
+
/**
|
|
83
|
+
* Quick download helper
|
|
84
|
+
*/
|
|
85
|
+
export declare const downloadAllMedia: (messages: WAMessage[], outputDir: string, options?: Omit<DownloadOptions, "outputDir">) => Promise<DownloadSummary>;
|
|
86
|
+
//# sourceMappingURL=media-downloader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-downloader.d.ts","sourceRoot":"","sources":["../../src/Utils/media-downloader.ts"],"names":[],"mappings":"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"}
|