Spaces:
Paused
Paused
vlff李飞飞
commited on
Commit
·
eb10065
1
Parent(s):
92bc940
优化chrome 插件
Browse files- chrome_agent/_locales/de/messages.json +34 -0
- chrome_agent/_locales/en/messages.json +34 -0
- chrome_agent/background.js +13 -0
- chrome_agent/manifest.json +5 -5
- chrome_agent/options/options.css +84 -0
- chrome_agent/options/options.html +35 -0
- chrome_agent/options/options.js +69 -0
- chrome_agent/{src → popup}/content.js +0 -0
- chrome_agent/{src → popup}/md5.js +0 -0
- chrome_agent/{src → popup}/popup.html +2 -1
- chrome_agent/{src → popup}/popup.js +0 -0
chrome_agent/_locales/de/messages.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"optionsTitle": {
|
| 3 |
+
"message": "Einstellungen",
|
| 4 |
+
"description": "Titel der Einstellungen-Seite"
|
| 5 |
+
},
|
| 6 |
+
"apiTitle": {
|
| 7 |
+
"message": "Gib deinen OpenAI API Schlüssel ein, um die Erweiterung zu nutzen:",
|
| 8 |
+
"description": "Titel der API-Schlüssel-Eingabe"
|
| 9 |
+
},
|
| 10 |
+
"apiModelTitle": {
|
| 11 |
+
"message": "Wähle ein API Model aus:",
|
| 12 |
+
"description": "Titel der API-Model-Auswahl"
|
| 13 |
+
},
|
| 14 |
+
"lastMessagesTitle": {
|
| 15 |
+
"message": "Letzte Nachrichten",
|
| 16 |
+
"description": "Titel der letzten Nachrichten"
|
| 17 |
+
},
|
| 18 |
+
"optionsInputPlaceholder": {
|
| 19 |
+
"message": "Hier Access Schlüssel eingeben",
|
| 20 |
+
"description": "Platzhalter für API Schlüssel Eingabe"
|
| 21 |
+
},
|
| 22 |
+
"optionsAccessTokenNote": {
|
| 23 |
+
"message": "Dein Access Schlüssel wird nur lokal gespeichert und nicht an Dritte weitergegeben.",
|
| 24 |
+
"description": "Hinweis zum API Schlüssel"
|
| 25 |
+
},
|
| 26 |
+
"optionsSaveButtonText": {
|
| 27 |
+
"message": "Speichern",
|
| 28 |
+
"description": "Text für den Button zum Speichern des Access Schlüssels"
|
| 29 |
+
},
|
| 30 |
+
"optionsDeleteButtonText": {
|
| 31 |
+
"message": "API Schlüssel löschen",
|
| 32 |
+
"description": "Text für den Button zum Löschen des Access Schlüssels"
|
| 33 |
+
}
|
| 34 |
+
}
|
chrome_agent/_locales/en/messages.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"optionsTitle": {
|
| 3 |
+
"message": "Options",
|
| 4 |
+
"description": "Title of the options page"
|
| 5 |
+
},
|
| 6 |
+
"apiTitle": {
|
| 7 |
+
"message": "Enter your Access token below to get started.",
|
| 8 |
+
"description": "Title of the Access-token section"
|
| 9 |
+
},
|
| 10 |
+
"apiModelTitle": {
|
| 11 |
+
"message": "Choose API-Model:",
|
| 12 |
+
"description": "Title of the API-Model section"
|
| 13 |
+
},
|
| 14 |
+
"lastMessagesTitle": {
|
| 15 |
+
"message": "Last Messages:",
|
| 16 |
+
"description": "Title of the last messages section"
|
| 17 |
+
},
|
| 18 |
+
"optionsInputPlaceholder": {
|
| 19 |
+
"message": "Enter your Access token here",
|
| 20 |
+
"description": "Placeholder of the Access-Token input"
|
| 21 |
+
},
|
| 22 |
+
"optionsAccessTokenNote": {
|
| 23 |
+
"message": "Note: Your Access token will only be stored locally on your computer and nowhere else.",
|
| 24 |
+
"description": "Note about the Access-Token"
|
| 25 |
+
},
|
| 26 |
+
"optionsSaveButtonText": {
|
| 27 |
+
"message": "Save",
|
| 28 |
+
"description": "Text of the save button"
|
| 29 |
+
},
|
| 30 |
+
"optionsDeleteButtonText": {
|
| 31 |
+
"message": "Delete Access token",
|
| 32 |
+
"description": "Text of the delete button"
|
| 33 |
+
}
|
| 34 |
+
}
|
chrome_agent/background.js
CHANGED
|
@@ -66,3 +66,16 @@ chrome.runtime.onMessage.addListener(async (msg, sender) => {
|
|
| 66 |
// }
|
| 67 |
// }
|
| 68 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
// }
|
| 67 |
// }
|
| 68 |
});
|
| 69 |
+
|
| 70 |
+
// Listen for when the extension is installed
|
| 71 |
+
chrome.runtime.onInstalled.addListener(function () {
|
| 72 |
+
// Set default API model
|
| 73 |
+
let defaultModel = "gpt-35-turbo";
|
| 74 |
+
chrome.storage.local.set({ apiModel: defaultModel });
|
| 75 |
+
|
| 76 |
+
// Set empty chat history
|
| 77 |
+
chrome.storage.local.set({ chatHistory: [] });
|
| 78 |
+
|
| 79 |
+
// Open the options page
|
| 80 |
+
chrome.runtime.openOptionsPage();
|
| 81 |
+
});
|
chrome_agent/manifest.json
CHANGED
|
@@ -3,13 +3,13 @@
|
|
| 3 |
"description" : "An Extension Driven by LLM",
|
| 4 |
"version": "1.0",
|
| 5 |
"manifest_version": 3,
|
| 6 |
-
|
| 7 |
"background": {
|
| 8 |
"service_worker": "background.js"
|
| 9 |
},
|
| 10 |
-
|
| 11 |
"action": {
|
| 12 |
-
"default_popup": "
|
| 13 |
"default_icon": "img/popup.png",
|
| 14 |
"default_title": "BrowserLLMBB"
|
| 15 |
},
|
|
@@ -33,8 +33,8 @@
|
|
| 33 |
"content_scripts": [
|
| 34 |
{
|
| 35 |
"js": [
|
| 36 |
-
"
|
| 37 |
-
"
|
| 38 |
],
|
| 39 |
"matches": [
|
| 40 |
"https://www.jianshu.com/p/*",
|
|
|
|
| 3 |
"description" : "An Extension Driven by LLM",
|
| 4 |
"version": "1.0",
|
| 5 |
"manifest_version": 3,
|
| 6 |
+
"default_locale": "en",
|
| 7 |
"background": {
|
| 8 |
"service_worker": "background.js"
|
| 9 |
},
|
| 10 |
+
"options_page": "options/options.html",
|
| 11 |
"action": {
|
| 12 |
+
"default_popup": "popup/popup.html",
|
| 13 |
"default_icon": "img/popup.png",
|
| 14 |
"default_title": "BrowserLLMBB"
|
| 15 |
},
|
|
|
|
| 33 |
"content_scripts": [
|
| 34 |
{
|
| 35 |
"js": [
|
| 36 |
+
"popup/content.js",
|
| 37 |
+
"popup/md5.js"
|
| 38 |
],
|
| 39 |
"matches": [
|
| 40 |
"https://www.jianshu.com/p/*",
|
chrome_agent/options/options.css
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
body {
|
| 2 |
+
font-family: 'Arial', sans-serif;
|
| 3 |
+
background-color: #343541;
|
| 4 |
+
margin: 0;
|
| 5 |
+
display: flex;
|
| 6 |
+
justify-content: center;
|
| 7 |
+
align-items: center;
|
| 8 |
+
height: 100vh;
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
* {
|
| 12 |
+
box-sizing: border-box;
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
.container {
|
| 16 |
+
display: flex;
|
| 17 |
+
flex-direction: column;
|
| 18 |
+
text-align: center;
|
| 19 |
+
background-color: #fff;
|
| 20 |
+
padding: 20px;
|
| 21 |
+
border-radius: 8px;
|
| 22 |
+
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
label {
|
| 26 |
+
display: block;
|
| 27 |
+
margin-bottom: 10px;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
#input-container {
|
| 31 |
+
display: flex;
|
| 32 |
+
flex-direction: row;
|
| 33 |
+
gap: 10px;
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
input {
|
| 37 |
+
width: 100%;
|
| 38 |
+
padding: 8px;
|
| 39 |
+
box-sizing: border-box;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
button {
|
| 43 |
+
background-color: #4caf50;
|
| 44 |
+
color: #fff;
|
| 45 |
+
padding: 10px 15px;
|
| 46 |
+
border: none;
|
| 47 |
+
border-radius: 4px;
|
| 48 |
+
cursor: pointer;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
button:hover {
|
| 52 |
+
background-color: #45a049;
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
button i {
|
| 56 |
+
margin-right: 5px;
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
#save-button {
|
| 60 |
+
display: flex;
|
| 61 |
+
align-items: center;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
#delete-container {
|
| 65 |
+
display: flex;
|
| 66 |
+
flex-direction: row;
|
| 67 |
+
justify-content: space-between;
|
| 68 |
+
gap: 10px;
|
| 69 |
+
margin-top: 10px;
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
#delete-button {
|
| 73 |
+
background-color: #f44336;
|
| 74 |
+
padding: 10px 15px;
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
#delete-button:hover {
|
| 78 |
+
background-color: #d32f2f;
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
#status-message {
|
| 82 |
+
margin-top: 10px;
|
| 83 |
+
color: #333;
|
| 84 |
+
}
|
chrome_agent/options/options.html
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
|
| 4 |
+
<head>
|
| 5 |
+
<meta charset="UTF-8">
|
| 6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 7 |
+
<title>Options</title>
|
| 8 |
+
<link rel="stylesheet" href="options.css">
|
| 9 |
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
|
| 10 |
+
</head>
|
| 11 |
+
|
| 12 |
+
<body>
|
| 13 |
+
<div class="container">
|
| 14 |
+
<h1 id="optionsTitle"></h1>
|
| 15 |
+
<p id="apiTitle"></p>
|
| 16 |
+
<div id="input-container">
|
| 17 |
+
<input type="text" id="accessToken">
|
| 18 |
+
<button id="save-button" title="Save Access token">
|
| 19 |
+
<i class="fa fa-save"></i>
|
| 20 |
+
<span id="save-button-text"></span>
|
| 21 |
+
</button>
|
| 22 |
+
</div>
|
| 23 |
+
<div id="delete-container">
|
| 24 |
+
<button id="delete-button" title="Delete Access token">
|
| 25 |
+
<i class="fa fa-trash"></i>
|
| 26 |
+
<span id="delete-button-text"></span>
|
| 27 |
+
</button>
|
| 28 |
+
<p id="status-message"></p>
|
| 29 |
+
</div>
|
| 30 |
+
<p id="access-token-note" class="note"></p>
|
| 31 |
+
</div>
|
| 32 |
+
<script src="options.js"></script>
|
| 33 |
+
</body>
|
| 34 |
+
|
| 35 |
+
</html>
|
chrome_agent/options/options.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
document.addEventListener('DOMContentLoaded', function () {
|
| 2 |
+
// Fetch the elements
|
| 3 |
+
const accessTokenInput = document.getElementById('accessToken');
|
| 4 |
+
const saveButton = document.getElementById('save-button');
|
| 5 |
+
const deleteButton = document.getElementById('delete-button');
|
| 6 |
+
const statusMessage = document.getElementById('status-message');
|
| 7 |
+
|
| 8 |
+
// Retrieve the saved Access token from local storage
|
| 9 |
+
chrome.storage.local.get(['access_token'], function (result) {
|
| 10 |
+
if (result.access_token) {
|
| 11 |
+
accessTokenInput.value = result.access_token;
|
| 12 |
+
}
|
| 13 |
+
});
|
| 14 |
+
|
| 15 |
+
// Add event listener to the save button
|
| 16 |
+
saveButton.addEventListener('click', function () {
|
| 17 |
+
// Get the entered Access token
|
| 18 |
+
const accessToken = accessTokenInput.value.trim();
|
| 19 |
+
|
| 20 |
+
// Check if the Access token is not empty
|
| 21 |
+
if (accessToken !== '' && accessToken.length > 1 && accessToken.length < 100) {
|
| 22 |
+
// Save the Access token to local storage
|
| 23 |
+
chrome.storage.local.set({ access_token: accessToken }, function () {
|
| 24 |
+
// Update the status message
|
| 25 |
+
statusMessage.textContent = 'Access token saved successfully!';
|
| 26 |
+
setTimeout(function () {
|
| 27 |
+
// Clear the status message after 2 seconds
|
| 28 |
+
statusMessage.textContent = '';
|
| 29 |
+
}, 2000);
|
| 30 |
+
});
|
| 31 |
+
} else {
|
| 32 |
+
// Display an error message if the Access token is empty
|
| 33 |
+
statusMessage.textContent = 'Please enter a valid Access token.';
|
| 34 |
+
}
|
| 35 |
+
});
|
| 36 |
+
|
| 37 |
+
// Add event listener to the delete button
|
| 38 |
+
deleteButton.addEventListener('click', function () {
|
| 39 |
+
// Remove the Access token from local storage
|
| 40 |
+
chrome.storage.local.remove(['access_token'], function () {
|
| 41 |
+
// Update the status message
|
| 42 |
+
statusMessage.textContent = 'Access token deleted successfully!';
|
| 43 |
+
accessTokenInput.value = '';
|
| 44 |
+
setTimeout(function () {
|
| 45 |
+
// Clear the status message after 2 seconds
|
| 46 |
+
statusMessage.textContent = '';
|
| 47 |
+
}, 2000);
|
| 48 |
+
});
|
| 49 |
+
});
|
| 50 |
+
});
|
| 51 |
+
|
| 52 |
+
// localize title optionsTitle
|
| 53 |
+
document.getElementById('optionsTitle').innerHTML = chrome.i18n.getMessage("optionsTitle");
|
| 54 |
+
|
| 55 |
+
// localize api title apiTitle
|
| 56 |
+
document.getElementById('apiTitle').innerHTML = chrome.i18n.getMessage("apiTitle");
|
| 57 |
+
|
| 58 |
+
// localize the Access token input placeholder
|
| 59 |
+
document.getElementById('accessToken').placeholder = chrome.i18n.getMessage("optionsInputPlaceholder");
|
| 60 |
+
|
| 61 |
+
// localize access-token-note
|
| 62 |
+
document.getElementById('access-token-note').innerHTML = chrome.i18n.getMessage("optionsAccessTokenNote");
|
| 63 |
+
|
| 64 |
+
// localize save button text
|
| 65 |
+
document.getElementById('save-button-text').innerText = chrome.i18n.getMessage("optionsSaveButtonText");
|
| 66 |
+
|
| 67 |
+
// localize delete button text
|
| 68 |
+
document.getElementById('delete-button-text').innerText = chrome.i18n.getMessage("optionsDeleteButtonText");
|
| 69 |
+
|
chrome_agent/{src → popup}/content.js
RENAMED
|
File without changes
|
chrome_agent/{src → popup}/md5.js
RENAMED
|
File without changes
|
chrome_agent/{src → popup}/popup.html
RENAMED
|
@@ -112,10 +112,11 @@
|
|
| 112 |
<!-- <iframe src=$popup_url style="height: 550px"></iframe>-->
|
| 113 |
<div id="iframe_area" style="height: 570px"></div>
|
| 114 |
|
|
|
|
| 115 |
<h3>Customize Token:</h3>
|
| 116 |
<input type="text" id="access_token" name="access_token" class="input-text" placeholder="input and chick change button, then reopen this">
|
| 117 |
<button id="set_access_token" class="upload_btn">Change</button>
|
| 118 |
-
|
| 119 |
<script src="popup.js"></script>
|
| 120 |
<script src="md5.js"></script>
|
| 121 |
</body>
|
|
|
|
| 112 |
<!-- <iframe src=$popup_url style="height: 550px"></iframe>-->
|
| 113 |
<div id="iframe_area" style="height: 570px"></div>
|
| 114 |
|
| 115 |
+
<div style="display:none">
|
| 116 |
<h3>Customize Token:</h3>
|
| 117 |
<input type="text" id="access_token" name="access_token" class="input-text" placeholder="input and chick change button, then reopen this">
|
| 118 |
<button id="set_access_token" class="upload_btn">Change</button>
|
| 119 |
+
</div>
|
| 120 |
<script src="popup.js"></script>
|
| 121 |
<script src="md5.js"></script>
|
| 122 |
</body>
|
chrome_agent/{src → popup}/popup.js
RENAMED
|
File without changes
|