-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtask_05.js
172 lines (144 loc) · 5 KB
/
task_05.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import fs from 'fs';
import fetch from 'node-fetch';
import dotenv from 'dotenv';
import OpenAI from 'openai';
dotenv.config();
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
const personalApiKey = process.env.PERSONAL_API_KEY;
const url = `https://centrala.ag3nts.org/data/${personalApiKey}/cenzura.txt`;
async function downloadDataFile() {
try {
const response = await fetch(url);
const data = await response.text();
fs.writeFileSync('raw_data.txt', data);
console.log('Raw data file has been downloaded successfully.');
return data;
} catch (error) {
console.error('Error downloading file:', error);
throw error;
}
}
async function anonymizeText(text) {
try {
const prompt = `Zastąp wszystkie wrażliwe dane słowem "CENZURA". Nie zmieniaj pozostałej struktury tekstu.
Zasady:
1. Zamień imię i nazwisko na "CENZURA"
2. Zamień nazwę miasta na "CENZURA"
3. Zamień nazwę ulicy wraz z numerem na "CENZURA"
4. Zamień wiek (liczbę lat) na "CENZURA"
Przykład:
Wejście: "Dane osoby podejrzanej: Paweł Zieliński. Zamieszkały w Warszawie na ulicy Pięknej 5. Ma 28 lat."
Wyjście: "Dane osoby podejrzanej: CENZURA. Zamieszkały w CENZURA na ulicy CENZURA. Ma CENZURA lat."
Tekst do zanonimizowania:
${text}`;
const completion = await openai.chat.completions.create({
model: 'gpt-4',
messages: [
{
role: 'system',
content: 'Jesteś asystentem do anonimizacji danych. Odpowiadaj tylko zanonimizowanym tekstem.'
},
{
role: 'user',
content: prompt
}
],
temperature: 0,
});
return completion.choices[0].message.content.trim();
} catch (error) {
console.error('Error during LLM interaction:', error);
return null;
}
}
async function sendReport() {
try {
// Odczytanie zanonimizowanych danych z pliku
const anonymizedText = fs.readFileSync('anonymized_data.txt', 'utf-8');
// Przygotowanie ciała zapytania
const body = JSON.stringify({
task: 'CENZURA',
apikey: personalApiKey,
answer: anonymizedText
});
console.log('Dane przygotowane do wysłania.');
// Wysłanie danych do endpointa verify z kluczem API w nagłówkach
const verifyResponse = await fetch('https://centrala.ag3nts.org/report', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${personalApiKey}`
},
body: body
});
// Odczytanie i wypisanie odpowiedzi serwera
const result = await verifyResponse.json();
console.log(result); // Wyświetlenie wyniku w konsoli
if (verifyResponse.ok) {
console.log('Raport został wysłany pomyślnie.');
} else {
console.error('Błąd podczas wysyłania raportu:', {
status: verifyResponse.status,
statusText: verifyResponse.statusText,
result: result
});
}
} catch (error) {
console.error('Wystąpił błąd:', error);
throw error;
}
}
async function processData() {
try {
// 1. Download the data
console.log('Step 1: Downloading data...');
const rawData = await downloadDataFile();
console.log('Download completed.\n');
// 2. Process and anonymize
console.log('Step 2: Processing and anonymizing data...');
const textChunks = [];
const chunkSize = 1000;
for (let i = 0; i < rawData.length; i += chunkSize) {
let chunk = rawData.slice(i, i + chunkSize);
let lastPeriod = chunk.lastIndexOf('.');
if (lastPeriod !== -1 && i + chunkSize < rawData.length) {
chunk = chunk.slice(0, lastPeriod + 1);
i = i + lastPeriod + 1 - chunkSize;
}
textChunks.push(chunk);
}
console.log(`Processing ${textChunks.length} chunks of text...`);
const anonymizedChunks = [];
for (let i = 0; i < textChunks.length; i++) {
console.log(`Processing chunk ${i + 1}/${textChunks.length}`);
const anonymizedChunk = await anonymizeText(textChunks[i]);
if (anonymizedChunk) {
anonymizedChunks.push(anonymizedChunk);
}
}
const anonymizedText = anonymizedChunks.join(' ');
console.log('Processing completed.\n');
// 3. Save locally
console.log('Step 3: Saving processed data locally...');
fs.writeFileSync('anonymized_data.txt', anonymizedText);
console.log('Data saved to anonymized_data.txt\n');
// 4. Show results
console.log('Step 4: Showing processed data sample:');
console.log('First 200 characters of anonymized text:');
console.log(anonymizedText.slice(0, 200) + '...\n');
// 5. Send to server
console.log('Step 5: Sending to server...');
await sendReport();
} catch (error) {
console.error('Error in process:', error);
}
}
// Run the process
console.log('Starting data anonymization process...');
processData().then(() => {
console.log('\nAll steps completed successfully.');
}).catch(error => {
console.error('Process failed:', error);
});