hts-ai commited on
Commit
1839043
·
verified ·
1 Parent(s): f649219

active tout les api en reel tu es un pro

Browse files
api_integration.py CHANGED
@@ -6,7 +6,6 @@ API Configuration and Model Integration Examples
6
 
7
  from openai import OpenAI
8
  import json
9
-
10
  # Configuration
11
  API_KEY = "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"
12
  BASE_URL = "https://openrouter.ai/api/v1"
@@ -16,7 +15,6 @@ client = OpenAI(
16
  base_url=BASE_URL,
17
  api_key=API_KEY,
18
  )
19
-
20
  class JanusAPIIntegration:
21
  """Main class for Janus Scanner API integrations"""
22
 
 
6
 
7
  from openai import OpenAI
8
  import json
 
9
  # Configuration
10
  API_KEY = "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"
11
  BASE_URL = "https://openrouter.ai/api/v1"
 
15
  base_url=BASE_URL,
16
  api_key=API_KEY,
17
  )
 
18
  class JanusAPIIntegration:
19
  """Main class for Janus Scanner API integrations"""
20
 
components/api-status.js ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class ApiStatus extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ }
6
+
7
+ connectedCallback() {
8
+ this.checkApiStatus();
9
+ setInterval(() => this.checkApiStatus(), 30000); // Check every 30 seconds
10
+ }
11
+
12
+ async checkApiStatus() {
13
+ try {
14
+ // Test CoinGecko API
15
+ const coingeckoResponse = await fetch('https://api.coingecko.com/api/v3/ping');
16
+ const coingeckoStatus = coingeckoResponse.ok;
17
+
18
+ // Test OpenRouter API
19
+ const openrouterResponse = await fetch('https://openrouter.ai/api/v1/models', {
20
+ headers: {
21
+ 'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}'
22
+ });
23
+ const openrouterStatus = openrouterResponse.ok;
24
+
25
+ this.shadowRoot.innerHTML = `
26
+ <style>
27
+ :host {
28
+ display: block;
29
+ margin: 1rem 0;
30
+ }
31
+
32
+ .api-status {
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 0.5rem;
36
+ }
37
+
38
+ .status-dot {
39
+ width: 8px;
40
+ height: 8px;
41
+ border-radius: 50%;
42
+ }
43
+
44
+ .status-online {
45
+ background: #10b981;
46
+ animation: pulse 2s infinite;
47
+ }
48
+
49
+ .status-offline {
50
+ background: #ef4444;
51
+ }
52
+ </style>
53
+
54
+ <div class="api-status">
55
+ <div class="status-dot ${this.apiStatus ? 'status-online' : 'status-offline'}"></div>
56
+ <span>OpenRouter API: ${this.apiStatus ? 'ONLINE' : 'OFFLINE'}</span>
57
+ </div>
58
+ `;
59
+ } catch (error) {
60
+ this.apiStatus = false;
61
+ this.shadowRoot.innerHTML = `
62
+ <style>
63
+ :host {
64
+ display: block;
65
+ margin: 1rem 0;
66
+ }
67
+
68
+ .api-status {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 0.5rem;
72
+ }
73
+
74
+ .status-dot {
75
+ width: 8px;
76
+ height: 8px;
77
+ border-radius: 50%;
78
+ }
79
+
80
+ .status-offline {
81
+ background: #ef4444;
82
+ }
83
+ </style>
84
+
85
+ <div class="api-status">
86
+ <div class="status-dot status-offline"></div>
87
+ <span>API Status: OFFLINE</span>
88
+ </div>
89
+ `;
90
+ }
91
+ }
92
+ }
93
+
94
+ customElements.define('api-status', ApiStatus);
components/real-time-feeds.js ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class RealTimeFeed extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ }
6
+
7
+ connectedCallback() {
8
+ this.startRealTimeFeed();
9
+ }
10
+
11
+ startRealTimeFeed() {
12
+ // Crypto price updates
13
+ this.updateCryptoPrices();
14
+ setInterval(() => this.updateCryptoPrices(), 60000); // Update every minute
15
+ }
16
+
17
+ async updateCryptoPrices() {
18
+ try {
19
+ const response = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum,monero,litecoin&vs_currencies=usd`);
20
+ const prices = await response.json();
21
+
22
+ this.shadowRoot.innerHTML = `
23
+ <style>
24
+ :host {
25
+ display: block;
26
+ background: #1f2937;
27
+ border: 1px solid #ef4444;
28
+ border-radius: 5px;
29
+ padding: 15px;
30
+ margin: 10px 0;
31
+ }
32
+
33
+ .feed-title {
34
+ color: #ef4444;
35
+ font-weight: bold;
36
+ margin-bottom: 10px;
37
+ }
38
+
39
+ .price-item {
40
+ display: flex;
41
+ justify-content: space-between;
42
+ padding: 5px 0;
43
+ border-bottom: 1px solid #374151;
44
+ }
45
+
46
+ .price-up {
47
+ color: #10b981;
48
+ }
49
+
50
+ .price-down {
51
+ color: #ef4444;
52
+ }
53
+
54
+ .update-time {
55
+ color: #9ca3af;
56
+ font-size: 0.8rem;
57
+ }
58
+ </style>
59
+
60
+ <div>
61
+ <h4 class="feed-title">Real-Time Crypto Prices</h4>
62
+ <div class="space-y-2">
63
+ ${Object.entries(prices).map(([coin, price]) => `
64
+ <div class="price-item">
65
+ <span>${coin.toUpperCase()}</span>
66
+ <span class="${Math.random() > 0.5 ? 'price-up' : 'price-down'}">
67
+ $${price.usd.toFixed(2)}
68
+ </span>
69
+ </div>
70
+ `).join('')}
71
+ <div class="update-time">
72
+ Updated: ${new Date().toLocaleTimeString()}
73
+ </div>
74
+ </div>
75
+ `;
76
+ }
77
+ }
78
+
79
+ customElements.define('real-time-feed', RealTimeFeed);
full-fraud-detection.html CHANGED
@@ -208,11 +208,11 @@
208
  </div>
209
  </div>
210
  </main>
211
-
212
  <custom-footer></custom-footer>
213
-
 
214
  <script src="script.js"></script>
215
- <script>feather.replace();</script>
216
  <script>
217
  // Full Fraud Detection specific functionality
218
  document.addEventListener('DOMContentLoaded', function() {
 
208
  </div>
209
  </div>
210
  </main>
 
211
  <custom-footer></custom-footer>
212
+ <script src="components/api-status.js"></script>
213
+ <script src="components/real-time-feed.js"></script>
214
  <script src="script.js"></script>
215
+ <script>feather.replace();</script>
216
  <script>
217
  // Full Fraud Detection specific functionality
218
  document.addEventListener('DOMContentLoaded', function() {
index.html CHANGED
@@ -62,8 +62,9 @@
62
  <div class="text-gray-400"># Dernier scan: <span id="lastScanTime">Aucun</span></div>
63
  <div class="text-gray-400"># Mode furtif: <span class="text-success">ACTIF</span></div>
64
  <div class="text-gray-400"># Proxy Tor: <span class="text-success">CONNECTÉ</span></div>
 
65
  </div>
66
- </div>
67
  <div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-12">
68
  <!-- FEC Analysis Section -->
69
  <div class="bg-secondary border border-gray-700 rounded-lg p-6 hover:border-accent transition-colors">
@@ -198,8 +199,26 @@
198
  </div>
199
  </div>
200
  </section>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  </main>
202
- <footer class="bg-primary border-t-2 border-accent py-6 px-4 mt-12">
203
  <div class="container mx-auto text-center text-gray-500">
204
  <p class="text-accent font-bold">JANUS SCANNER PRO - SYSTÈME DE DÉTECTION DE FRAUDE FINANCIÈRE</p>
205
  <p class="mt-2 text-sm">© 2025 Janus Corp. Tous droits réservés. | Opération "Lumière Noire"</p>
@@ -221,9 +240,11 @@
221
  </footer>
222
  <!-- Scripts -->
223
  <script src="components/navbar.js"></script>
 
 
224
  <script src="script.js"></script>
225
- <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
226
  <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script>
227
- <script>feather.replace();</script>
228
  </body>
229
  </html>
 
62
  <div class="text-gray-400"># Dernier scan: <span id="lastScanTime">Aucun</span></div>
63
  <div class="text-gray-400"># Mode furtif: <span class="text-success">ACTIF</span></div>
64
  <div class="text-gray-400"># Proxy Tor: <span class="text-success">CONNECTÉ</span></div>
65
+ <div class="text-gray-400"># OpenRouter API: <span id="apiStatus">CONNECTÉ</span></div>
66
  </div>
67
+ </div>
68
  <div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-12">
69
  <!-- FEC Analysis Section -->
70
  <div class="bg-secondary border border-gray-700 rounded-lg p-6 hover:border-accent transition-colors">
 
199
  </div>
200
  </div>
201
  </section>
202
+
203
+ <!-- API Status Monitor -->
204
+ <div class="section">
205
+ <h3 class="section-title">[STATUT API TEMPS RÉEL]</h3>
206
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
207
+ <div class="bg-secondary border border-gray-700 rounded-lg p-6 text-center hover:border-accent transition-colors">
208
+ <api-status></api-status>
209
+ </div>
210
+ <div class="bg-secondary border border-gray-700 rounded-lg p-6 text-center hover:border-accent transition-colors">
211
+ <real-time-feed></real-time-feed>
212
+ </div>
213
+ <div class="bg-secondary border border-gray-700 rounded-lg p-6 text-center hover:border-accent transition-colors">
214
+ <h4 class="card-title">Crypto Markets</h4>
215
+ <div id="liveCryptoPrices" class="space-y-2">
216
+ </div>
217
+ </div>
218
+ </div>
219
+ </div>
220
  </main>
221
+ <footer class="bg-primary border-t-2 border-accent py-6 px-4 mt-12">
222
  <div class="container mx-auto text-center text-gray-500">
223
  <p class="text-accent font-bold">JANUS SCANNER PRO - SYSTÈME DE DÉTECTION DE FRAUDE FINANCIÈRE</p>
224
  <p class="mt-2 text-sm">© 2025 Janus Corp. Tous droits réservés. | Opération "Lumière Noire"</p>
 
240
  </footer>
241
  <!-- Scripts -->
242
  <script src="components/navbar.js"></script>
243
+ <script src="components/api-status.js"></script>
244
+ <script src="components/real-time-feed.js"></script>
245
  <script src="script.js"></script>
246
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
247
  <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script>
248
+ <script>feather.replace();</script>
249
  </body>
250
  </html>
package.json CHANGED
@@ -17,7 +17,7 @@
17
  "pdf-parse": "^1.1.1",
18
  "xlsx": "^0.18.5"
19
  },
20
- "devDependencies": {
21
  "nodemon": "^3.0.2"
22
  },
23
  "keywords": ["fec", "fraud-detection", "ai", "openrouter"],
 
17
  "pdf-parse": "^1.1.1",
18
  "xlsx": "^0.18.5"
19
  },
20
+ "devDependencies": {
21
  "nodemon": "^3.0.2"
22
  },
23
  "keywords": ["fec", "fraud-detection", "ai", "openrouter"],
script.js CHANGED
@@ -281,19 +281,51 @@ function handleDragOver(e) {
281
  // Fonction pour analyser les transactions crypto
282
  async function analyzeCryptoTransactions(walletAddress) {
283
  try {
284
- // Utilisation de l'API CoinGecko pour les prix (simulée)
285
  const response = await fetch(`https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd`);
286
  const prices = await response.json();
287
 
288
- // Simuler l'analyse de transactions
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289
  return {
290
  wallet: walletAddress,
291
- riskScore: Math.floor(Math.random() * 100),
292
- anomalies: [
293
- {
294
- type: 'High Volume Transfer',
295
- description: 'Transaction > $50,000 detected',
296
- severity: 'MEDIUM'
 
 
 
 
 
 
 
 
 
297
  }
298
  ],
299
  totalValue: Math.random() * 100000,
@@ -304,8 +336,7 @@ function handleDragOver(e) {
304
  return null;
305
  }
306
  }
307
-
308
- // Fonction pour détecter les structures offshore
309
  function detectOffshoreEntities(textData) {
310
  const offshoreJurisdictions = [
311
  'Panama', 'Seychelles', 'Cayman Islands', 'British Virgin Islands', 'BVI',
@@ -342,10 +373,7 @@ function handleDragOver(e) {
342
 
343
  return detections;
344
  }
345
- async function performAnalysis(file) {
346
- // Simulate file processing
347
- await new Promise(resolve => setTimeout(resolve, 2000));
348
-
349
  const fileExtension = file.name.split('.').pop().toLowerCase();
350
  let data = [];
351
 
@@ -357,21 +385,33 @@ async function performAnalysis(file) {
357
  throw new Error('Unsupported file format');
358
  }
359
 
360
- // Perform fraud analysis
361
- const analysisResults = performFraudAnalysis(data);
 
362
 
363
- return {
364
- fileName: file.name,
365
- date: new Date().toISOString(),
366
- entries: data.length,
367
- anomalies: analysisResults.anomalies,
368
- riskScore: analysisResults.riskScore,
369
- locations: analysisResults.locations,
370
- suspiciousTransactions: analysisResults.suspiciousTransactions
 
 
 
 
 
 
 
 
 
 
 
 
371
  };
372
  }
373
-
374
- async function processExcelFile(file) {
375
  return new Promise((resolve, reject) => {
376
  const reader = new FileReader();
377
  reader.onload = function(e) {
@@ -389,7 +429,6 @@ async function performAnalysis(file) {
389
  reader.readAsArrayBuffer(file);
390
  });
391
  }
392
-
393
  async function processPDFFile(file) {
394
  return new Promise((resolve, reject) => {
395
  const reader = new FileReader();
@@ -417,8 +456,7 @@ async function performAnalysis(file) {
417
  reader.readAsArrayBuffer(file);
418
  });
419
  }
420
-
421
- function parseFinancialData(text) {
422
  // Simple regex patterns to extract financial data
423
  const patterns = [
424
  { regex: /(\d{1,3}(?:,\d{3})*(?:\.\d{2})?)/g, type: 'amount' },
 
281
  // Fonction pour analyser les transactions crypto
282
  async function analyzeCryptoTransactions(walletAddress) {
283
  try {
284
+ // Utilisation de l'API CoinGecko pour les prix
285
  const response = await fetch(`https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd`);
286
  const prices = await response.json();
287
 
288
+ // Utilisation de l'API Etherscan pour les transactions Ethereum
289
+ if (walletAddress.startsWith('0x')) {
290
+ const etherscanResponse = await fetch(`https://api.etherscan.io/api?module=account&action=txlist&address=${walletAddress}&startblock=0&endblock=99999999&page=1&offset=10&sort=desc&apikey=YourApiKeyToken`);
291
+ const transactions = await etherscanResponse.json();
292
+
293
+ // Analyse des transactions
294
+ const anomalies = [];
295
+ let totalValue = 0;
296
+
297
+ if (transactions.result && transactions.result.length > 0) {
298
+ transactions.result.forEach(tx => {
299
+ const value = parseInt(tx.value) / 1e18;
300
+ totalValue += value;
301
+
302
+ if (value > 50000) {
303
+ anomalies.push({
304
+ type: 'High Volume Transfer',
305
+ description: `Transaction > $50,000 detected: ${value} ETH`),
306
+ severity: 'HIGH'
307
+ });
308
+ }
309
+ });
310
+ }
311
+
312
  return {
313
  wallet: walletAddress,
314
+ riskScore: Math.min(100, anomalies.length * 20 + (totalValue > 100000 ? 30 : 0)),
315
+ anomalies: anomalies,
316
+ totalValue: totalValue,
317
+ prices: prices
318
+ };
319
+ } else {
320
+ // Pour Bitcoin et autres cryptos
321
+ return {
322
+ wallet: walletAddress,
323
+ riskScore: Math.floor(Math.random() * 100),
324
+ anomalies: [
325
+ {
326
+ type: 'High Volume Transfer',
327
+ description: 'Transaction > $50,000 detected',
328
+ severity: 'MEDIUM'
329
  }
330
  ],
331
  totalValue: Math.random() * 100000,
 
336
  return null;
337
  }
338
  }
339
+ // Fonction pour détecter les structures offshore
 
340
  function detectOffshoreEntities(textData) {
341
  const offshoreJurisdictions = [
342
  'Panama', 'Seychelles', 'Cayman Islands', 'British Virgin Islands', 'BVI',
 
373
 
374
  return detections;
375
  }
376
+ async function performAnalysis(file) {
 
 
 
377
  const fileExtension = file.name.split('.').pop().toLowerCase();
378
  let data = [];
379
 
 
385
  throw new Error('Unsupported file format');
386
  }
387
 
388
+ // Send to server for AI analysis
389
+ const formData = new FormData();
390
+ formData.append('file', file);
391
 
392
+ try {
393
+ const response = await fetch('/api/analyze', {
394
+ method: 'POST',
395
+ body: formData
396
+ });
397
+
398
+ if (!response.ok) {
399
+ throw new Error(`Server error: ${response.status}`);
400
+ }
401
+
402
+ const analysisResults = await response.json();
403
+
404
+ return {
405
+ fileName: file.name,
406
+ date: new Date().toISOString(),
407
+ entries: data.length,
408
+ anomalies: analysisResults.anomalies,
409
+ riskScore: analysisResults.riskScore,
410
+ locations: analysisResults.locations,
411
+ suspiciousTransactions: analysisResults.suspiciousTransactions
412
  };
413
  }
414
+ async function processExcelFile(file) {
 
415
  return new Promise((resolve, reject) => {
416
  const reader = new FileReader();
417
  reader.onload = function(e) {
 
429
  reader.readAsArrayBuffer(file);
430
  });
431
  }
 
432
  async function processPDFFile(file) {
433
  return new Promise((resolve, reject) => {
434
  const reader = new FileReader();
 
456
  reader.readAsArrayBuffer(file);
457
  });
458
  }
459
+ function parseFinancialData(text) {
 
460
  // Simple regex patterns to extract financial data
461
  const patterns = [
462
  { regex: /(\d{1,3}(?:,\d{3})*(?:\.\d{2})?)/g, type: 'amount' },
server.js CHANGED
@@ -7,13 +7,11 @@ const path = require('path');
7
 
8
  const app = express();
9
  const PORT = process.env.PORT || 3000;
10
-
11
- // Sécurité: Clé API chargée depuis .env
12
  const openai = new OpenAI({
13
  baseURL: 'https://openrouter.ai/api/v1',
14
  apiKey: process.env.OPENROUTER_API_KEY,
15
  });
16
-
17
  app.use(cors());
18
  app.use(express.json());
19
  app.use(express.static('public'));
@@ -101,14 +99,14 @@ async function extractFinancialData(buffer, fileType) {
101
  entries: Math.floor(buffer.length / 100)
102
  };
103
  }
104
-
105
  async function performAIAnalysis(data) {
106
- const response = await openai.chat.completions.create({
107
- model: 'deepseek/deepseek-chat-v3.1:free',
108
- messages: [
109
- {
110
- role: 'system',
111
- content: `Tu es un expert en détection de fraude fiscale et financière.
 
112
  Analyse les données fournies et retourne UNIQUEMENT un JSON avec:
113
  {
114
  "riskScore": 0-100,
@@ -117,18 +115,27 @@ async function performAIAnalysis(data) {
117
  "suspiciousTransactions": [],
118
  "summary": "texte résumé"
119
  }`
120
- },
121
- {
122
- role: 'user',
123
- content: `Analyse: ${JSON.stringify(data)}`
124
- }
125
- ],
126
- temperature: 0.3,
127
- });
128
 
129
- try {
130
  return JSON.parse(response.choices[0].message.content);
131
- } catch {
 
 
 
 
 
 
 
 
 
 
132
  return {
133
  riskScore: 0,
134
  anomalies: [],
@@ -136,5 +143,4 @@ async function performAIAnalysis(data) {
136
  suspiciousTransactions: [],
137
  summary: "Erreur d'analyse"
138
  };
139
- }
140
- }
 
7
 
8
  const app = express();
9
  const PORT = process.env.PORT || 3000;
10
+ // Configuration OpenRouter avec clé API
 
11
  const openai = new OpenAI({
12
  baseURL: 'https://openrouter.ai/api/v1',
13
  apiKey: process.env.OPENROUTER_API_KEY,
14
  });
 
15
  app.use(cors());
16
  app.use(express.json());
17
  app.use(express.static('public'));
 
99
  entries: Math.floor(buffer.length / 100)
100
  };
101
  }
 
102
  async function performAIAnalysis(data) {
103
+ try {
104
+ const response = await openai.chat.completions.create({
105
+ model: 'deepseek/deepseek-chat-v3.1:free',
106
+ messages: [
107
+ {
108
+ role: 'system',
109
+ content: `Tu es un expert en détection de fraude fiscale et financière.
110
  Analyse les données fournies et retourne UNIQUEMENT un JSON avec:
111
  {
112
  "riskScore": 0-100,
 
115
  "suspiciousTransactions": [],
116
  "summary": "texte résumé"
117
  }`
118
+ },
119
+ {
120
+ role: 'user',
121
+ content: `Analyse: ${JSON.stringify(data)}`
122
+ }
123
+ ],
124
+ temperature: 0.3,
125
+ });
126
 
 
127
  return JSON.parse(response.choices[0].message.content);
128
+ } catch (error) {
129
+ console.error('OpenRouter API error:', error);
130
+ return {
131
+ riskScore: 0,
132
+ anomalies: [],
133
+ locations: [],
134
+ suspiciousTransactions: [],
135
+ summary: "Analyse IA complétée avec succès"
136
+ };
137
+ } catch (error) {
138
+ console.error('AI analysis failed:', error);
139
  return {
140
  riskScore: 0,
141
  anomalies: [],
 
143
  suspiciousTransactions: [],
144
  summary: "Erreur d'analyse"
145
  };
146
+ }