Spaces:
Sleeping
Sleeping
Update script.js
Browse files
script.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
document.addEventListener('DOMContentLoaded', () => {
|
| 2 |
// ─────────────────────────────────────────────────────────────────────────
|
| 3 |
-
//
|
| 4 |
const inputTextArea = document.getElementById('predict_info');
|
| 5 |
const inputButton = document.getElementById('detect_button');
|
| 6 |
const clearButton = document.getElementById('clear_button');
|
|
@@ -16,15 +16,15 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 16 |
const TEXT_API = '/predict';
|
| 17 |
const FEEDBACK_API = '/feedback';
|
| 18 |
|
|
|
|
| 19 |
inputButton.addEventListener('click', async () => {
|
| 20 |
const message = inputTextArea.value.trim();
|
| 21 |
if (!message) {
|
| 22 |
alert('請輸入您想檢測的訊息內容。');
|
| 23 |
return;
|
| 24 |
}
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
normalOrScam.textContent = '檢測中...';
|
| 28 |
normalOrScam.style.color = 'gray';
|
| 29 |
confidenceScoreSpan.textContent = '計算中...';
|
| 30 |
suspiciousPhrasesDiv.innerHTML = '<p>正在分析訊息,請稍候...</p>';
|
|
@@ -41,10 +41,10 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 41 |
});
|
| 42 |
if (!res.ok) throw new Error(`伺服器錯誤: ${res.status}`);
|
| 43 |
const data = await res.json();
|
| 44 |
-
|
| 45 |
-
// 更新纯文字分析结果
|
| 46 |
normalOrScam.textContent = data.status;
|
| 47 |
confidenceScoreSpan.textContent = data.confidence + '%';
|
|
|
|
| 48 |
suspiciousPhrasesDiv.innerHTML = '';
|
| 49 |
if (Array.isArray(data.suspicious_keywords) && data.suspicious_keywords.length) {
|
| 50 |
const ul = document.createElement('ul');
|
|
@@ -57,13 +57,13 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 57 |
} else {
|
| 58 |
suspiciousPhrasesDiv.innerHTML = '<p>沒有偵測到可疑詞句。</p>';
|
| 59 |
}
|
| 60 |
-
|
| 61 |
feedbackArea.style.display = 'block';
|
| 62 |
lastPrediction = { text: message, model_status: data.status };
|
| 63 |
} catch (err) {
|
| 64 |
console.error('文字檢測失敗:', err);
|
| 65 |
alert(`文字檢測失敗,請檢查後端。\n錯誤:${err.message}`);
|
| 66 |
-
//
|
| 67 |
normalOrScam.textContent = '待檢測';
|
| 68 |
normalOrScam.style.color = 'inherit';
|
| 69 |
confidenceScoreSpan.textContent = '待檢測';
|
|
@@ -71,16 +71,18 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 71 |
}
|
| 72 |
});
|
| 73 |
|
|
|
|
| 74 |
clearButton.addEventListener('click', () => {
|
| 75 |
inputTextArea.value = '';
|
| 76 |
-
//
|
| 77 |
normalOrScam.textContent = '待檢測';
|
| 78 |
normalOrScam.style.color = 'inherit';
|
| 79 |
confidenceScoreSpan.textContent = '待檢測';
|
| 80 |
suspiciousPhrasesDiv.innerHTML = '<p>請輸入訊息並點擊「檢測!」按鈕。</p>';
|
| 81 |
feedbackArea.style.display = 'none';
|
| 82 |
feedbackStatus.textContent = '';
|
| 83 |
-
|
|
|
|
| 84 |
extractedTextSpan.textContent = '尚未上傳圖片';
|
| 85 |
imgIsScamSpan.textContent = '尚未上傳圖片';
|
| 86 |
imgConfidenceSpan.textContent = '尚未上傳圖片';
|
|
@@ -88,6 +90,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 88 |
imageUpload.value = '';
|
| 89 |
});
|
| 90 |
|
|
|
|
| 91 |
feedbackCorrectBtn.addEventListener('click', () => submitFeedback('正確'));
|
| 92 |
feedbackWrongBtn.addEventListener('click', () => submitFeedback('錯誤'));
|
| 93 |
|
|
@@ -101,7 +104,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 101 |
body: JSON.stringify(payload)
|
| 102 |
});
|
| 103 |
await r.json();
|
| 104 |
-
feedbackStatus.textContent = '✅
|
| 105 |
feedbackCorrectBtn.style.display = 'none';
|
| 106 |
feedbackWrongBtn.style.display = 'none';
|
| 107 |
} catch (e) {
|
|
@@ -112,7 +115,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 112 |
|
| 113 |
|
| 114 |
// ─────────────────────────────────────────────────────────────────────────
|
| 115 |
-
// 圖片OCR相關元素
|
| 116 |
const imageUpload = document.getElementById('image_upload');
|
| 117 |
const imageButton = document.getElementById('image_button');
|
| 118 |
const extractedTextSpan = document.getElementById('extracted_text');
|
|
@@ -123,23 +126,22 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 123 |
const IMAGE_API = '/analyze-image';
|
| 124 |
|
| 125 |
imageButton.addEventListener('click', async () => {
|
| 126 |
-
//
|
| 127 |
if (!imageUpload.files.length) {
|
| 128 |
alert('請先選擇一個圖片檔案。');
|
| 129 |
return;
|
| 130 |
}
|
| 131 |
|
| 132 |
-
//
|
| 133 |
extractedTextSpan.textContent = '辨識中...';
|
| 134 |
imgIsScamSpan.textContent = '辨識中...';
|
| 135 |
imgConfidenceSpan.textContent = '辨識中...';
|
| 136 |
imgSuspiciousDiv.innerHTML = '<p>正在分析圖片,請稍候...</p>';
|
| 137 |
|
| 138 |
-
//
|
| 139 |
const formData = new FormData();
|
| 140 |
formData.append('file', imageUpload.files[0]);
|
| 141 |
|
| 142 |
-
// 调用后端
|
| 143 |
try {
|
| 144 |
const resp = await fetch(IMAGE_API, {
|
| 145 |
method: 'POST',
|
|
@@ -148,13 +150,14 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 148 |
if (!resp.ok) throw new Error(`伺服器錯誤: ${resp.status}`);
|
| 149 |
const data = await resp.json();
|
| 150 |
|
|
|
|
| 151 |
const extracted = data.extracted_text || '';
|
| 152 |
const result = data.analysis_result || {};
|
| 153 |
|
| 154 |
-
//
|
| 155 |
extractedTextSpan.textContent = extracted || '(無文字)';
|
| 156 |
imgIsScamSpan.textContent = result.status || '(無法辨識)';
|
| 157 |
-
imgConfidenceSpan.textContent = result.confidence !== undefined
|
| 158 |
? result.confidence + '%'
|
| 159 |
: '(無法辨識)';
|
| 160 |
imgSuspiciousDiv.innerHTML = '';
|
|
@@ -177,5 +180,5 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 177 |
imgSuspiciousDiv.innerHTML = `<p style="color:red;">❌ ${err.message}</p>`;
|
| 178 |
}
|
| 179 |
});
|
| 180 |
-
|
| 181 |
});
|
|
|
|
| 1 |
document.addEventListener('DOMContentLoaded', () => {
|
| 2 |
// ─────────────────────────────────────────────────────────────────────────
|
| 3 |
+
// 1. 文字分析相關元素
|
| 4 |
const inputTextArea = document.getElementById('predict_info');
|
| 5 |
const inputButton = document.getElementById('detect_button');
|
| 6 |
const clearButton = document.getElementById('clear_button');
|
|
|
|
| 16 |
const TEXT_API = '/predict';
|
| 17 |
const FEEDBACK_API = '/feedback';
|
| 18 |
|
| 19 |
+
// 文字檢測:當按「檢測!」時觸發
|
| 20 |
inputButton.addEventListener('click', async () => {
|
| 21 |
const message = inputTextArea.value.trim();
|
| 22 |
if (!message) {
|
| 23 |
alert('請輸入您想檢測的訊息內容。');
|
| 24 |
return;
|
| 25 |
}
|
| 26 |
+
// 顯示 loading
|
| 27 |
+
normalOrScam.textContent = '檢測中...';
|
|
|
|
| 28 |
normalOrScam.style.color = 'gray';
|
| 29 |
confidenceScoreSpan.textContent = '計算中...';
|
| 30 |
suspiciousPhrasesDiv.innerHTML = '<p>正在分析訊息,請稍候...</p>';
|
|
|
|
| 41 |
});
|
| 42 |
if (!res.ok) throw new Error(`伺服器錯誤: ${res.status}`);
|
| 43 |
const data = await res.json();
|
| 44 |
+
// 更新文字分析結果
|
|
|
|
| 45 |
normalOrScam.textContent = data.status;
|
| 46 |
confidenceScoreSpan.textContent = data.confidence + '%';
|
| 47 |
+
// 可疑詞句
|
| 48 |
suspiciousPhrasesDiv.innerHTML = '';
|
| 49 |
if (Array.isArray(data.suspicious_keywords) && data.suspicious_keywords.length) {
|
| 50 |
const ul = document.createElement('ul');
|
|
|
|
| 57 |
} else {
|
| 58 |
suspiciousPhrasesDiv.innerHTML = '<p>沒有偵測到可疑詞句。</p>';
|
| 59 |
}
|
| 60 |
+
// 顯示回饋區
|
| 61 |
feedbackArea.style.display = 'block';
|
| 62 |
lastPrediction = { text: message, model_status: data.status };
|
| 63 |
} catch (err) {
|
| 64 |
console.error('文字檢測失敗:', err);
|
| 65 |
alert(`文字檢測失敗,請檢查後端。\n錯誤:${err.message}`);
|
| 66 |
+
// 還原預設文字區
|
| 67 |
normalOrScam.textContent = '待檢測';
|
| 68 |
normalOrScam.style.color = 'inherit';
|
| 69 |
confidenceScoreSpan.textContent = '待檢測';
|
|
|
|
| 71 |
}
|
| 72 |
});
|
| 73 |
|
| 74 |
+
// 「清除」按鈕:清空文字、圖片結果
|
| 75 |
clearButton.addEventListener('click', () => {
|
| 76 |
inputTextArea.value = '';
|
| 77 |
+
// 清空文字檢測結果
|
| 78 |
normalOrScam.textContent = '待檢測';
|
| 79 |
normalOrScam.style.color = 'inherit';
|
| 80 |
confidenceScoreSpan.textContent = '待檢測';
|
| 81 |
suspiciousPhrasesDiv.innerHTML = '<p>請輸入訊息並點擊「檢測!」按鈕。</p>';
|
| 82 |
feedbackArea.style.display = 'none';
|
| 83 |
feedbackStatus.textContent = '';
|
| 84 |
+
|
| 85 |
+
// 清空圖片OCR結果
|
| 86 |
extractedTextSpan.textContent = '尚未上傳圖片';
|
| 87 |
imgIsScamSpan.textContent = '尚未上傳圖片';
|
| 88 |
imgConfidenceSpan.textContent = '尚未上傳圖片';
|
|
|
|
| 90 |
imageUpload.value = '';
|
| 91 |
});
|
| 92 |
|
| 93 |
+
// 使用者回饋
|
| 94 |
feedbackCorrectBtn.addEventListener('click', () => submitFeedback('正確'));
|
| 95 |
feedbackWrongBtn.addEventListener('click', () => submitFeedback('錯誤'));
|
| 96 |
|
|
|
|
| 104 |
body: JSON.stringify(payload)
|
| 105 |
});
|
| 106 |
await r.json();
|
| 107 |
+
feedbackStatus.textContent = '✅ 感謝您的回饋!';
|
| 108 |
feedbackCorrectBtn.style.display = 'none';
|
| 109 |
feedbackWrongBtn.style.display = 'none';
|
| 110 |
} catch (e) {
|
|
|
|
| 115 |
|
| 116 |
|
| 117 |
// ─────────────────────────────────────────────────────────────────────────
|
| 118 |
+
// 2. 圖片OCR相關元素
|
| 119 |
const imageUpload = document.getElementById('image_upload');
|
| 120 |
const imageButton = document.getElementById('image_button');
|
| 121 |
const extractedTextSpan = document.getElementById('extracted_text');
|
|
|
|
| 126 |
const IMAGE_API = '/analyze-image';
|
| 127 |
|
| 128 |
imageButton.addEventListener('click', async () => {
|
| 129 |
+
// 確認 user 已經選擇檔案
|
| 130 |
if (!imageUpload.files.length) {
|
| 131 |
alert('請先選擇一個圖片檔案。');
|
| 132 |
return;
|
| 133 |
}
|
| 134 |
|
| 135 |
+
// 顯示 Loading
|
| 136 |
extractedTextSpan.textContent = '辨識中...';
|
| 137 |
imgIsScamSpan.textContent = '辨識中...';
|
| 138 |
imgConfidenceSpan.textContent = '辨識中...';
|
| 139 |
imgSuspiciousDiv.innerHTML = '<p>正在分析圖片,請稍候...</p>';
|
| 140 |
|
| 141 |
+
// 建立 FormData,append 檔案
|
| 142 |
const formData = new FormData();
|
| 143 |
formData.append('file', imageUpload.files[0]);
|
| 144 |
|
|
|
|
| 145 |
try {
|
| 146 |
const resp = await fetch(IMAGE_API, {
|
| 147 |
method: 'POST',
|
|
|
|
| 150 |
if (!resp.ok) throw new Error(`伺服器錯誤: ${resp.status}`);
|
| 151 |
const data = await resp.json();
|
| 152 |
|
| 153 |
+
// 此 data 格式:{ extracted_text: "...", analysis_result: { status, confidence, suspicious_keywords } }
|
| 154 |
const extracted = data.extracted_text || '';
|
| 155 |
const result = data.analysis_result || {};
|
| 156 |
|
| 157 |
+
// 更新前端OCR結果
|
| 158 |
extractedTextSpan.textContent = extracted || '(無文字)';
|
| 159 |
imgIsScamSpan.textContent = result.status || '(無法辨識)';
|
| 160 |
+
imgConfidenceSpan.textContent = (result.confidence !== undefined)
|
| 161 |
? result.confidence + '%'
|
| 162 |
: '(無法辨識)';
|
| 163 |
imgSuspiciousDiv.innerHTML = '';
|
|
|
|
| 180 |
imgSuspiciousDiv.innerHTML = `<p style="color:red;">❌ ${err.message}</p>`;
|
| 181 |
}
|
| 182 |
});
|
| 183 |
+
// ─────────────────────────────────────────────────────────────────────────
|
| 184 |
});
|