// ==UserScript==
// @name 2
// @namespace gpt4-account-switch-5
// @version 0.0.8
// @description 为GPT4直连账号切换提供便利
// @author LLinkedList771
// @run-at document-start
// @match https://gpt4.xn--fiqq6k90ovivepbxtg0bz10m.xyz/*
// @match https://chat.freegpts.org/*
// @license MIT
// @downloadURL https://update.greasyfork.cloud/scripts/495801/2.user.js
// @updateURL https://update.greasyfork.cloud/scripts/495801/2.meta.js
// ==/UserScript==
(function() {
'use strict';
let accountData = null;
function setAccountData(data) {
accountData = data;
}
// ----------------- Styles -----------------
function addStyles() {
const styles = `
.tools-logger-panel {
position: fixed;
top: 10%;
right: 2%;
background-color: white;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
z-index: 9999;
width: 250px;
}
.tools-logger-panel.minimized {
width: auto;
padding: 5px;
}
.switch.minimized {
display: none;
}
.head {
font-weight: bold;
margin-bottom: 10px;
}
.switch
// display: inline-block;
vertical-align: middle;
display: flex;
justify-content: space-evenly;
}
.close {
cursor: pointer;
}
.loadAccountJsonBtn {
border: 1px solid #ccc;
border-radius: 5px;
text-decoration: underline;
}
.account-container {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 10px;
}
.account-btn {
padding: 5px 10px;
margin: 2px 0;
background-color: #f0f0f0;
font-weight: bold;
}
.account-btn2 {
display: inline-block; /* 确保按钮并排显示 */
padding: 5px 10px;
margin-right: 10px; /* 右侧外边距,用于按钮之间的间距 */
background-color: #f0f0f0;
font-weight: bold;
}
.email-display {
font-size: 0.8em;
color: #666;
margin-top: 2px;
}
.latex-toggle {
cursor: pointer;
float:right;
margin-right:5px;
}
.latex-toggle.minimized::before {
content: "[+]";
}
.latex-toggle.maximized::before {
content: "[-]";
}
`;
const styleSheet = document.createElement("style");
styleSheet.type = "text/css";
styleSheet.innerText = styles;
document.head.appendChild(styleSheet);
}
// ----------------- UI Creation -----------------
function createUI() {
const controlDiv = document.createElement('div');
controlDiv.className = 'tools-logger-panel';
controlDiv.innerHTML = `
GPT4账号切换助手
`;
document.body.appendChild(controlDiv);
// controlDiv.querySelector(".close").onclick = function() {
// controlDiv.remove();
// };
const toggleIcon = controlDiv.querySelector(".latex-toggle");
const title = controlDiv.querySelector(".title");
const switchDiv = controlDiv.querySelector(".switch");
toggleIcon.onclick = function() {
if (toggleIcon.classList.contains("maximized")) {
controlDiv.querySelector(".main").style.display = "none";
title.style.display = "none";
toggleIcon.classList.remove("maximized");
toggleIcon.classList.add("minimized");
controlDiv.classList.add("minimized");
switchDiv.classList.add("minimized");
} else {
controlDiv.querySelector(".main").style.display = "block";
title.style.display = "inline-block";
toggleIcon.classList.remove("minimized");
toggleIcon.classList.add("maximized");
controlDiv.classList.remove("minimized");
switchDiv.classList.remove("minimized");
}
saveSettings(controlDiv); // Save settings when panel state is changed
};
// 添加文件输入元素
const fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.accept = '.json';
fileInput.style.display = 'none';
controlDiv.appendChild(fileInput);
// 为导入账号信息按钮添加点击事件监听器
document.getElementById("loadAccountJsonBtn").addEventListener("click", function() {
fileInput.click();
});
// 监听文件选择事件
fileInput.addEventListener('change', function(event) {
const file = event.target.files[0];
// 创建FileReader对象
const reader = new FileReader();
// 监听文件读取完成事件
reader.onload = function(event) {
try {
const jsonData = JSON.parse(event.target.result);
// 在这里处理获取到的JSON数据
console.log(jsonData);
processAccountJsonData(jsonData);
// 可以在这里执行其他操作,如在页面上显示数据等
} catch (error) {
console.error('Error parsing JSON:', error);
}
};
// 读取文件内容为文本
reader.readAsText(file);
});
loadSettings(controlDiv); // Load settings when panel is created
}
// 获取当前的url的(去掉路由)
function getCurrentUrl() {
const targetURLBase = window.location.protocol + '//' + window.location.host;
return targetURLBase;
}
function redirectToBaseUrl(){
// https://gpt4.xn--fiqq6k90ovivepbxtg0bz10m.xyz/auth/login
console.log('Log in');
const targetURLBase = getCurrentUrl();
window.location.href = targetURLBase;
}
function logOutCurrentAccount(accessToken) {
const targetURLBase = getCurrentUrl();
const logoutURL = targetURLBase + '/auth/logout';
window.location.href = logoutURL;
}
function logInNewAccount(userName, passWork) {
// var loginBtn = document.querySelector('#submit');
// if(loginBtn) {
// loginBtn.click();
// }
// 第一个输入id="username" 填入userName
var userNameArea = document.getElementById('username');
if(userNameArea) {
userNameArea.value = userName; // 将 '你的用户名' 替换为你想要输入的内容
}
// 第二个输入id="password" 填入passWork
var passWordArea = document.getElementById('password');
if(passWordArea) {
passWordArea.value = passWork; // 将 '你的密码' 替换为你想要输入的内容
}
// 找到登录按钮
var loginBtn = document.querySelector('button[type="submit"]');
if(loginBtn) {
loginBtn.click();
}
// // 找到button里面的值(innerHtml)为OK的按钮
// var okBtn = Array.from(document.querySelectorAll('button')).find(function(btn) {
// return btn.innerText.trim() === 'OK';
// });
// if(okBtn) {
// okBtn.click();
// }
}
function processAccountJsonData(jsonData) {
// 检查所有键是否都是有效的电子邮件
const allKeysAreValid = Object.keys(jsonData).every(isValidEmail);
if (allKeysAreValid) {
clearPreviousAccountData(); // 调用清理函数
localStorage.setItem('gpt4_account_json', JSON.stringify(jsonData));
setAccountData(jsonData);
creatSwitchBtnUI(); // 确保此时已经有有效的accountData来创建按钮
} else {
alert('Some entries are invalid. Please check the data.');
}
}
function alertLoadAccountData() {
alert('请先导入账号信息');
}
function retriveAccountData() {
// 1.首先判断当前的accountData是否为空
if(accountData !== null) {
return true;
}
// 2.从localStorage中读取数据
const jsonData = localStorage.getItem('gpt4_account_json');
if(jsonData !== null) {
accountData = JSON.parse(jsonData);
return true;
}
// 如果当前的accountData为空, 但是localStoraage也为空, 则提示当前需要加载账号信息
alertLoadAccountData();
return false;
}
// ----------------- Save and Load Settings -----------------
function saveSettings(controlDiv) {
const panelState = controlDiv.classList.contains("minimized") ? "minimized" : "maximized";
localStorage.setItem('gpt4PanelState', panelState);
}
function loadSettings(controlDiv) {
const panelState = localStorage.getItem('gpt4PanelState');
const toggleIcon = controlDiv.querySelector(".latex-toggle");
const title = controlDiv.querySelector(".title");
const switchDiv = controlDiv.querySelector(".switch");
if (panelState === "minimized") {
controlDiv.querySelector(".main").style.display = "none";
title.style.display = "none";
toggleIcon.classList.remove("maximized");
toggleIcon.classList.add("minimized");
controlDiv.classList.add("minimized");
switchDiv.classList.add("minimized");
} else {
controlDiv.querySelector(".main").style.display = "block";
title.style.display = "inline-block";
toggleIcon.classList.remove("minimized");
toggleIcon.classList.add("maximized");
controlDiv.classList.remove("minimized");
switchDiv.classList.remove("minimized");
}
}
function creatSwitchBtnUI() {
const controlDiv = document.querySelector('.tools-logger-panel .switch');
if (!controlDiv) return;
let button = document.createElement('button');
button.className = 'account-btn';
button.textContent = `登出账号`;
button.onclick = () => {
// Logic to switch accounts
// setAccountData(accountData[key]);
logOutCurrentAccount();
console.log('Switched to account:', accountData[key]);
};
controlDiv.appendChild(button);
// redirectToBaseUrl();
button = document.createElement('button');
button.className = 'account-btn';
button.textContent = `登录账号`;
button.onclick = () => {
// Logic to switch accounts
// setAccountData(accountData[key]);
redirectToBaseUrl();
console.log('Switched to account:', accountData[key]);
};
controlDiv.appendChild(button);
Object.keys(accountData).forEach((email, index) => {
// 创建包含按钮和电子邮件地址的容器
const container = document.createElement('div');
container.className = 'account-container';
// 创建登录按钮
const button = document.createElement('button');
button.className = 'account-btn';
button.textContent = `登录账号${index + 1}`;
button.onclick = () => {
logInNewAccount(email, accountData[email]);
console.log('Switched to account:', email);
};
// 创建显示电子邮件地址的元素
const emailDisplay = document.createElement('span');
emailDisplay.className = 'email-display';
emailDisplay.textContent = email;
// 将按钮和电子邮件地址添加到容器
container.appendChild(button);
container.appendChild(emailDisplay);
// 将容器添加到主DIV
controlDiv.appendChild(container);
});
}
function loadAndCreateAccountSwitchBtnUI(){
// 首先判断localStorage中是否有数据
if(!retriveAccountData())
{
return;
}
creatSwitchBtnUI(); // Create switch buttons based on account data
// 现在开始加载UI
}
// ----------------- Initialization -----------------
addStyles();
// 确保在DOM完全加载后再创建UI
document.addEventListener('DOMContentLoaded', function() {
createUI();
loadAndCreateAccountSwitchBtnUI(); // Ensure the switch buttons are created after UI is loaded and data is retrieved
})
;
})();
function clearPreviousAccountData() {
// 清除内存中的账号数据
accountData = null;
localStorage.removeItem('gpt4_account_json');
const switchDiv = document.querySelector('.tools-logger-panel .switch');
if (switchDiv) {
while (switchDiv.firstChild) {
switchDiv.removeChild(switchDiv.firstChild);
}
}
}
function isValidEmail(email) {
// 使用正则表达式验证电子邮件地址
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}