|
<script setup lang="ts">
|
|
import { h, ref, onMounted, inject, defineComponent, render } from 'vue';
|
|
import { NDropdown, type DropdownOption, NModal, NInput, NInputNumber, NButton, NGrid, NGridItem, useMessage, NImage, NForm, NFormItem, NSwitch, NTag, NSelect, NSpin, NP, NA, NConfigProvider, NSpace, NRadio, NRadioGroup, NTooltip, NIcon, lightTheme, darkTheme, useOsTheme, type GlobalTheme } from 'naive-ui';
|
|
import conversationCssText from '@/assets/css/conversation.css?raw';
|
|
import settingSvgUrl from '@/assets/img/setting.svg?url';
|
|
import { usePromptStore } from '@/stores/modules/prompt';
|
|
import { storeToRefs } from 'pinia';
|
|
import ChatNavItem from './ChatNavItem.vue';
|
|
import type { Component } from 'vue';
|
|
import { isMobile } from '@/utils/utils';
|
|
import CreateImage from '@/components/CreateImage/CreateImage.vue';
|
|
import { useChatStore } from '@/stores/modules/chat';
|
|
import { useUserStore } from '@/stores/modules/user';
|
|
|
|
const isShowMore = ref(false);
|
|
const isShowSettingModal = ref(false);
|
|
const isShowAdvancedSettingModal = ref(false);
|
|
const isShowSetAboutModal = ref(false);
|
|
const isShowCookieModal = ref(false);
|
|
const isShowLoginModal = ref(false);
|
|
const isShowIframe = ref(false);
|
|
const userToken = ref('');
|
|
const userKievRPSSecAuth = ref('');
|
|
const userMUID = ref('');
|
|
const userRwBf = ref('');
|
|
const message = useMessage();
|
|
const promptStore = usePromptStore();
|
|
const { isShowPromptSotre } = storeToRefs(promptStore);
|
|
const isShowClearCacheModal = ref(false);
|
|
const isShowCreateImageModal = ref(false);
|
|
const chatStore = useChatStore();
|
|
const { isShowChatServiceSelectModal } = storeToRefs(chatStore);
|
|
const userStore = useUserStore();
|
|
const localVersion = __APP_INFO__.version;
|
|
const lastVersion = ref('加载中...');
|
|
const { historyEnable, themeMode, uiVersion, langRegion, autoReopenMic, fullCookiesEnable, cookiesStr, enterpriseEnable, copilotProEnable, customChatNum, gpt4tEnable, sydneyEnable, sydneyPrompt, passServer } = storeToRefs(userStore);
|
|
|
|
let cookiesEnable = ref(false);
|
|
let cookies = ref('');
|
|
let history = ref(true);
|
|
let themeModeSetting = ref('auto');
|
|
let uiVersionSetting = ref('v3');
|
|
let langRegionSetting = ref('CN');
|
|
let theme = ref(inject('theme'));
|
|
let autoReopenMicSetting = ref(true);
|
|
|
|
let settingIconStyle = ref({
|
|
filter: 'invert(70%)',
|
|
})
|
|
let passingCFChallenge = ref(false);
|
|
const enterpriseSetting = ref(false);
|
|
const copilotProSetting = ref(false);
|
|
const customChatNumSetting = ref(0);
|
|
const gpt4tSetting = ref(true);
|
|
const sydneySetting = ref(false);
|
|
const sydneyPromptSetting = ref('');
|
|
const passServerSetting = ref('');
|
|
const getCookieTip = ref('获取 Cookie 中, 请稍后...');
|
|
const bingUrl = base58Decode('7RYHpA38gs3NAby2mkvoRMwjncBpS');
|
|
|
|
const oneKeyLogin = ref('false');
|
|
const loginTypeOptions = ref([
|
|
{
|
|
label: '账号登录',
|
|
value: 'false',
|
|
},
|
|
{
|
|
label: '一键登录',
|
|
value: 'true',
|
|
}
|
|
]);
|
|
const msLoginAccount = ref('');
|
|
const msLoginPassword = ref('');
|
|
const msLoginType = ref('passwd');
|
|
const msLoginCode = ref('');
|
|
const msLogining = ref(false);
|
|
const msContinueing = ref(false);
|
|
const msLoginTypeOptions = ref([
|
|
{
|
|
label: '密码登录',
|
|
value: 'passwd',
|
|
},
|
|
{
|
|
label: '邮箱验证码登录',
|
|
value: 'email',
|
|
},
|
|
{
|
|
label: '2FA登录',
|
|
value: 'device',
|
|
}
|
|
])
|
|
const msLoginContext = ref({
|
|
cookies: '',
|
|
context: {}
|
|
});
|
|
|
|
const GetLastVersion = async () => {
|
|
const res = await fetch('https://api.github.com/repos/Harry-zklcdc/go-proxy-bingai/releases/latest');
|
|
const json = await res.json();
|
|
lastVersion.value = json.tag_name;
|
|
};
|
|
|
|
const navType = {
|
|
login: 'login',
|
|
setting: 'setting',
|
|
chat: 'chat',
|
|
notebook: 'notebook',
|
|
compose: 'compose',
|
|
createImage: 'createImage',
|
|
reset: 'reset',
|
|
about: 'about',
|
|
};
|
|
let navConfigs = ref([
|
|
{
|
|
key: navType.setting,
|
|
label: '设置',
|
|
},
|
|
{
|
|
key: navType.notebook,
|
|
label: '笔记本',
|
|
},
|
|
{
|
|
key: navType.compose,
|
|
label: '撰写文章',
|
|
url: '/web/compose.html',
|
|
},
|
|
{
|
|
key: navType.createImage,
|
|
label: '图像创建',
|
|
},
|
|
{
|
|
key: navType.reset,
|
|
label: '一键重置',
|
|
},
|
|
{
|
|
key: navType.about,
|
|
label: '关于'
|
|
},
|
|
]);
|
|
|
|
const themeModeOptions = ref([
|
|
{
|
|
label: '浅色',
|
|
value: 'light',
|
|
}, {
|
|
label: '深色',
|
|
value: 'dark',
|
|
}, {
|
|
label: '跟随系统',
|
|
value: 'auto',
|
|
}
|
|
]);
|
|
|
|
const uiVersionOptions = ref([
|
|
{
|
|
label: 'V1',
|
|
value: 'v1',
|
|
},
|
|
{
|
|
label: 'V2',
|
|
value: 'v2',
|
|
},
|
|
{
|
|
label: 'V3',
|
|
value: 'v3',
|
|
}
|
|
]);
|
|
|
|
const langRegionOptions = ref([
|
|
{
|
|
label: '中文优先',
|
|
value: 'CN',
|
|
},
|
|
{
|
|
label: '英文优先',
|
|
value: 'US',
|
|
}
|
|
]);
|
|
|
|
onMounted(() => {
|
|
if (themeMode.value == 'light') {
|
|
settingIconStyle.value = { filter: 'invert(0%)' }
|
|
} else if (themeMode.value == 'dark') {
|
|
settingIconStyle.value = { filter: 'invert(70%)' }
|
|
} else if (themeMode.value == 'auto') {
|
|
if (useOsTheme().value == 'dark') {
|
|
settingIconStyle.value = { filter: 'invert(70%)' }
|
|
} else {
|
|
settingIconStyle.value = { filter: 'invert(0%)' }
|
|
}
|
|
}
|
|
})
|
|
|
|
const sleep = async (ms: number) => {
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
}
|
|
|
|
const renderDropdownLabel = (option: DropdownOption) => {
|
|
return h(ChatNavItem as Component, { navConfig: option });
|
|
};
|
|
|
|
const handleSelect = async (key: string) => {
|
|
switch (key) {
|
|
case navType.chat:
|
|
{
|
|
CIB.showConversation();
|
|
navConfigs.value[1] = {
|
|
key: navType.notebook,
|
|
label: '笔记本',
|
|
};
|
|
const prjupyIndex = CIB.config.sydney.request.optionsSets.indexOf('prjupy');
|
|
const galileoIndex = CIB.config.sydney.request.optionsSets.indexOf('clgalileo');
|
|
CIB.config.sydney.request.optionsSets = CIB.config.sydney.request.optionsSets.slice(0, prjupyIndex);
|
|
if (galileoIndex > -1) {
|
|
CIB.config.sydney.request.optionsSets[galileoIndex] = 'galileo';
|
|
}
|
|
if (uiVersion.value == 'v3') {
|
|
await sleep(25);
|
|
await ChatHomeScreen.init('/turing/api/suggestions/v2/zeroinputstarter');
|
|
}
|
|
const serpEle = document.querySelector('cib-serp');
|
|
const conversationEle = serpEle?.shadowRoot?.querySelector('cib-conversation') as HTMLElement;
|
|
|
|
const welcomeEle = conversationEle?.shadowRoot?.querySelector('cib-welcome-container');
|
|
const loginTip = welcomeEle?.shadowRoot?.querySelectorAll("div[class='muid-upsell']");
|
|
if (loginTip?.length) {
|
|
loginTip.forEach((ele) => {
|
|
ele.remove();
|
|
});
|
|
}
|
|
welcomeEle?.shadowRoot?.querySelector('.preview-container')?.remove();
|
|
welcomeEle?.shadowRoot?.querySelector('.footer')?.remove();
|
|
serpEle?.shadowRoot?.querySelector('cib-serp-feedback')?.remove();
|
|
if (isMobile()) {
|
|
welcomeEle?.shadowRoot?.querySelector('.container-item')?.remove();
|
|
CIB.vm.actionBar.input.placeholder = '有问题尽管问我...("/" 触发提示词)';
|
|
}
|
|
|
|
const conversationStyleEle = document.createElement('style');
|
|
conversationStyleEle.innerText = conversationCssText;
|
|
conversationEle.shadowRoot?.append(conversationStyleEle);
|
|
}
|
|
break;
|
|
case navType.notebook:
|
|
{
|
|
CIB.showNotebook();
|
|
const galileoIndex = CIB.config.sydney.request.optionsSets.indexOf('galileo');
|
|
if (galileoIndex > -1) {
|
|
CIB.config.sydney.request.optionsSets[galileoIndex] = 'clgalileo';
|
|
}
|
|
CIB.config.sydney.request.optionsSets.push('prjupy', 'uprofdeuv1', 'uprofupdv2', 'gndlogcf');
|
|
navConfigs.value[1] = {
|
|
key: navType.chat,
|
|
label: '聊天',
|
|
};
|
|
await sleep(25);
|
|
const serpEle = document.querySelector('cib-serp');
|
|
const notebook = serpEle?.shadowRoot?.querySelector('cib-notebook');
|
|
const disclaimer = notebook?.shadowRoot?.querySelector('cib-ai-disclaimer');
|
|
disclaimer?.shadowRoot?.querySelector('div')?.remove();
|
|
disclaimer?.shadowRoot?.querySelector('div')?.remove();
|
|
}
|
|
break;
|
|
case navType.setting:
|
|
{
|
|
isShowSettingModal.value = true;
|
|
}
|
|
break;
|
|
case navType.createImage:
|
|
{
|
|
if (!userStore.sysConfig?.isSysCK && !userStore.getUserToken()) {
|
|
message.warning('体验画图功能需先登录');
|
|
}
|
|
isShowCreateImageModal.value = true;
|
|
}
|
|
break;
|
|
case navType.reset:
|
|
{
|
|
isShowClearCacheModal.value = true;
|
|
}
|
|
break;
|
|
case navType.about:
|
|
{
|
|
isShowSetAboutModal.value = true;
|
|
GetLastVersion();
|
|
await sleep(25)
|
|
const ele = document.createElement('div');
|
|
render(h(NConfigProvider, { theme: theme.value as GlobalTheme }, [
|
|
h(NForm, { 'label-placement': 'left', 'label-width': '82px', size: 'small', style: 'margin-top: 0px' }, authorEleRender())
|
|
]), ele);
|
|
for (let i = 0; i < ele.childNodes.length; i++) {
|
|
document.getElementById('latestVersion')?.parentNode?.appendChild(ele.childNodes[i]);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
};
|
|
|
|
const settingMenu = (key: string) => {
|
|
switch(key) {
|
|
case 'autoPassCFChallenge':
|
|
{
|
|
autoPassCFChallenge()
|
|
}
|
|
break;
|
|
case 'login':
|
|
{
|
|
isShowLoginModal.value = true;
|
|
isShowIframe.value = false;
|
|
}
|
|
break;
|
|
case 'chatService':
|
|
{
|
|
isShowChatServiceSelectModal.value = true;
|
|
chatStore.checkAllSydneyConfig();
|
|
}
|
|
break;
|
|
case 'cookieSetting':
|
|
{
|
|
userToken.value = userStore.getUserToken();
|
|
userKievRPSSecAuth.value = userStore.getUserKievRPSSecAuth();
|
|
userMUID.value = userStore.getUserMUID();
|
|
userRwBf.value = userStore.getUserRwBf();
|
|
history.value = historyEnable.value;
|
|
cookiesEnable.value = fullCookiesEnable.value;
|
|
cookies.value = cookiesStr.value;
|
|
isShowCookieModal.value = true;
|
|
}
|
|
break;
|
|
case 'promptStore':
|
|
{
|
|
isShowPromptSotre.value = true;
|
|
}
|
|
break;
|
|
case 'advancedSetting':
|
|
{
|
|
history.value = historyEnable.value;
|
|
themeModeSetting.value = themeMode.value;
|
|
uiVersionSetting.value = uiVersion.value;
|
|
langRegionSetting.value = langRegion.value;
|
|
copilotProSetting.value = copilotProEnable.value;
|
|
enterpriseSetting.value = enterpriseEnable.value;
|
|
customChatNumSetting.value = customChatNum.value;
|
|
gpt4tSetting.value = gpt4tEnable.value;
|
|
autoReopenMicSetting.value = autoReopenMic.value;
|
|
sydneySetting.value = sydneyEnable.value;
|
|
sydneyPromptSetting.value = sydneyPrompt.value;
|
|
passServerSetting.value = passServer.value;
|
|
isShowAdvancedSettingModal.value = true;
|
|
}
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
const resetCache = async () => {
|
|
isShowClearCacheModal.value = false;
|
|
await userStore.resetCache();
|
|
message.success('清理完成');
|
|
window.location.href = '/';
|
|
};
|
|
|
|
const saveSetting = () => {
|
|
if (cookiesEnable.value) {
|
|
userStore.saveCookies(cookies.value);
|
|
cookiesStr.value = cookies.value;
|
|
} else {
|
|
if (!userToken.value) {
|
|
message.warning('请先填入用户 _U Cookie');
|
|
} else {
|
|
userStore.saveUserToken(userToken.value);
|
|
}
|
|
if (!userKievRPSSecAuth.value) {
|
|
message.warning('请先填入用户 KievRPSSecAuth Cookie');
|
|
} else {
|
|
userStore.saveUserKievRPSSecAuth(userKievRPSSecAuth.value);
|
|
}
|
|
if (!userRwBf.value) {
|
|
message.warning('请先填入用户 _RwBf Cookie');
|
|
} else {
|
|
userStore.saveUserRwBf(userRwBf.value);
|
|
}
|
|
if (!userMUID.value) {
|
|
message.warning('请先填入用户 MUID Cookie');
|
|
} else {
|
|
userStore.saveUserMUID(userMUID.value);
|
|
}
|
|
}
|
|
fullCookiesEnable.value = cookiesEnable.value;
|
|
isShowCookieModal.value = false;
|
|
};
|
|
|
|
const saveAdvancedSetting = () => {
|
|
historyEnable.value = history.value;
|
|
const tmpEnterpris = enterpriseEnable.value;
|
|
enterpriseEnable.value = enterpriseSetting.value;
|
|
customChatNum.value = customChatNumSetting.value;
|
|
const tmpGpt4t = gpt4tEnable.value, tmpSydney = sydneyEnable.value, tmpuiVersion = uiVersion.value, tmpCopilotPro = copilotProEnable.value;
|
|
copilotProEnable.value = copilotProSetting.value;
|
|
gpt4tEnable.value = gpt4tSetting.value;
|
|
autoReopenMic.value = autoReopenMicSetting.value;
|
|
sydneyEnable.value = sydneySetting.value;
|
|
sydneyPrompt.value = sydneyPromptSetting.value;
|
|
uiVersion.value = uiVersionSetting.value;
|
|
if (passServerSetting.value && passServerSetting.value.startsWith('http')) {
|
|
userStore.setPassServer(passServerSetting.value)
|
|
}
|
|
if (langRegion.value != langRegionSetting.value) {
|
|
langRegion.value = langRegionSetting.value;
|
|
_G.Region = langRegionSetting.value;
|
|
}
|
|
|
|
const serpEle = document.querySelector('cib-serp');
|
|
const sidepanel = serpEle?.shadowRoot?.querySelector('cib-conversation')?.querySelector('cib-side-panel')?.shadowRoot?.querySelector('.main')
|
|
const threadsHeader = sidepanel?.querySelector('.threads-header') as HTMLElement;
|
|
const threadsContainer = sidepanel?.querySelector('.threads-container') as HTMLElement;
|
|
if (!isMobile()) {
|
|
if (history.value && userStore.getUserToken() && !enterpriseEnable.value) {
|
|
if (tmpuiVersion === 'v1') {
|
|
CIB.vm.sidePanel.panels = [
|
|
{ type: 'threads', label: '最近的活动' },
|
|
{ type: 'plugins', label: '插件' }
|
|
]
|
|
} else {
|
|
threadsHeader.style.display = 'flex'
|
|
threadsContainer.style.display = 'block'
|
|
}
|
|
} else {
|
|
if (tmpuiVersion === 'v2') {
|
|
threadsHeader.style.display = 'none'
|
|
threadsContainer.style.display = 'none'
|
|
} else {
|
|
CIB.vm.sidePanel.panels = [
|
|
{ type: 'plugins', label: '插件' }
|
|
]
|
|
CIB.vm.sidePanel.selectedPanel = 'plugins'
|
|
}
|
|
}
|
|
}
|
|
|
|
themeMode.value = themeModeSetting.value;
|
|
if (themeModeSetting.value == 'light') {
|
|
CIB.changeColorScheme(0);
|
|
theme.value = lightTheme;
|
|
settingIconStyle.value = { filter: 'invert(0%)' }
|
|
} else if (themeModeSetting.value == 'dark') {
|
|
CIB.changeColorScheme(1);
|
|
theme.value = darkTheme;
|
|
settingIconStyle.value = { filter: 'invert(70%)' }
|
|
} else if (themeModeSetting.value == 'auto') {
|
|
if (useOsTheme().value == 'dark') {
|
|
CIB.changeColorScheme(1);
|
|
theme.value = darkTheme;
|
|
settingIconStyle.value = { filter: 'invert(70%)' }
|
|
} else {
|
|
CIB.changeColorScheme(0);
|
|
theme.value = lightTheme;
|
|
settingIconStyle.value = { filter: 'invert(0%)' }
|
|
}
|
|
}
|
|
isShowAdvancedSettingModal.value = false;
|
|
if (tmpEnterpris != enterpriseSetting.value || tmpSydney != sydneySetting.value || tmpGpt4t != gpt4tSetting.value || tmpuiVersion != uiVersionSetting.value || tmpCopilotPro != copilotProSetting.value) {
|
|
window.location.href = '/';
|
|
}
|
|
}
|
|
|
|
const newWindow = () => {
|
|
window.open("/fd/auth/signin?action=interactive&provider=windows_live_id&return_url=https%3a%2f%2fwww.bing.com%2fchat%3fq%3dBing%2bAI%26FORM%3dhpcodx%26wlsso%3d1%26wlexpsignin%3d1&src=EXPLICIT&sig=001DD71D5A386F753B1FC3055B306E8F", "_blank");
|
|
}
|
|
|
|
const loginHandel = async ()=> {
|
|
isShowIframe.value = true;
|
|
getCookieTip.value = '获取 Cookie 中, 请稍后...';
|
|
window.addEventListener('message', function (e) {
|
|
const d = e.data
|
|
if (d.cookies != "" && d.cookies != null && d.cookies != undefined) {
|
|
userStore.saveCookies(d.cookies);
|
|
cookiesStr.value = d.cookies;
|
|
message.success('登录成功');
|
|
isShowLoginModal.value = false;
|
|
window.location.href = '/';
|
|
}
|
|
})
|
|
await sleep(1500);
|
|
getCookieTimeoutHandel();
|
|
const iframe = document.getElementById('login');
|
|
const S = base58Decode(_G.S);
|
|
let tmpA = [];
|
|
for (let i = 0; i < _G.SP.length; i++) {
|
|
tmpA.push(S[_G.SP[i]]);
|
|
}
|
|
const e = base58Decode(tmpA.join(''));
|
|
(iframe as any).contentWindow.postMessage({
|
|
IG: _G.IG,
|
|
T: await aesEncrypt(e, _G.IG),
|
|
}, '*');
|
|
}
|
|
|
|
const msLoginHandel = async () => {
|
|
msLogining.value = true;
|
|
switch (msLoginType.value) {
|
|
case 'passwd':
|
|
{
|
|
if (!msLoginAccount.value) {
|
|
message.warning('请先填入账号');
|
|
msLogining.value = false;
|
|
break;
|
|
} else if (!msLoginPassword.value) {
|
|
message.warning('请先填入密码');
|
|
msLogining.value = false;
|
|
break;
|
|
}
|
|
const res = await fetch('/api/ms/login', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
account: msLoginAccount.value,
|
|
password: msLoginPassword.value,
|
|
type: msLoginType.value,
|
|
})
|
|
})
|
|
if (!res.ok) {
|
|
message.error('登录失败, 请重试');
|
|
msLogining.value = false;
|
|
break;
|
|
}
|
|
message.success('登录成功');
|
|
isShowLoginModal.value = false;
|
|
const resData = await res.json();
|
|
userStore.saveCookies(resData.data.cookies);
|
|
cookiesStr.value = resData.data.cookies;
|
|
fullCookiesEnable.value = true;
|
|
window.location.href = '/';
|
|
}
|
|
break;
|
|
case 'email':
|
|
{
|
|
if (!msLoginAccount.value) {
|
|
message.warning('请先填入账号');
|
|
msLogining.value = false;
|
|
break;
|
|
}
|
|
const res = await fetch('/api/ms/login', {
|
|
method: 'PUT',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
account: msLoginAccount.value,
|
|
type: msLoginType.value,
|
|
verify_code: msLoginCode.value,
|
|
cookies: msLoginContext.value.cookies,
|
|
context: msLoginContext.value.context,
|
|
}),
|
|
})
|
|
if (!res.ok) {
|
|
message.error('登录失败, 请重试');
|
|
msLogining.value = false;
|
|
break;
|
|
}
|
|
message.success('登录成功');
|
|
isShowLoginModal.value = false;
|
|
const resData = await res.json();
|
|
userStore.saveCookies(resData.data.cookies);
|
|
cookiesStr.value = resData.data.cookies;
|
|
fullCookiesEnable.value = true;
|
|
window.location.href = '/';
|
|
}
|
|
break;
|
|
case 'device':
|
|
{
|
|
if (!msLoginAccount.value) {
|
|
message.warning('请先填入账号');
|
|
msLogining.value = true;
|
|
break;
|
|
}
|
|
const res = await fetch('/api/ms/login', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
account: msLoginAccount.value,
|
|
type: msLoginType.value,
|
|
})
|
|
})
|
|
const resData = await res.json();
|
|
if (res.status != 201) {
|
|
message.error('获取2FA失败, 请重试');
|
|
msLogining.value = false;
|
|
break;
|
|
}
|
|
message.success('获取2FA成功, 请在手机上查看并输入验证码');
|
|
msLoginCode.value = resData.data.code;
|
|
msLoginContext.value.cookies = resData.data.cookies;
|
|
msLoginContext.value.context = resData.data.context;
|
|
await msLoginContinueHandel();
|
|
}
|
|
break;
|
|
default:
|
|
msLogining.value = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
const msLoginContinueHandel = async () => {
|
|
msContinueing.value = true;
|
|
switch (msLoginType.value) {
|
|
case 'email':
|
|
{
|
|
if (!msLoginAccount.value) {
|
|
message.warning('请先填入账号');
|
|
msLogining.value = true;
|
|
break;
|
|
}
|
|
const res = await fetch('/api/ms/login', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
account: msLoginAccount.value,
|
|
type: msLoginType.value,
|
|
})
|
|
})
|
|
if (res.status != 201) {
|
|
message.error('获取邮箱验证码失败, 请重试');
|
|
msContinueing.value = false;
|
|
break;
|
|
}
|
|
message.success('获取邮箱验证码成功, 请检查邮箱');
|
|
msContinueing.value = false;
|
|
const resData = await res.json();
|
|
msLoginContext.value.cookies = resData.data.cookies;
|
|
msLoginContext.value.context = resData.data.context;
|
|
}
|
|
break;
|
|
case 'device':
|
|
{
|
|
if (!msLoginAccount.value) {
|
|
message.warning('请先填入账号');
|
|
msLogining.value = true;
|
|
break;
|
|
}
|
|
const res = await fetch('/api/ms/login', {
|
|
method: 'PUT',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
account: msLoginAccount.value,
|
|
type: msLoginType.value,
|
|
cookies: msLoginContext.value.cookies,
|
|
context: msLoginContext.value.context,
|
|
}),
|
|
})
|
|
if (!res.ok) {
|
|
message.error('获取2FA失败, 请重试');
|
|
msLogining.value = false;
|
|
break;
|
|
}
|
|
message.success('登录成功');
|
|
isShowLoginModal.value = false;
|
|
const resData = await res.json();
|
|
userStore.saveCookies(resData.data.cookies);
|
|
cookiesStr.value = resData.data.cookies;
|
|
fullCookiesEnable.value = true;
|
|
window.location.href = '/';
|
|
}
|
|
break;
|
|
default:
|
|
msContinueing.value = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
const authorEleRender = () => {
|
|
const data = JSON.parse(decodeURI(base58Decode(_G.TP)));
|
|
let r = []
|
|
for (let i = 0; i < data.length; i++) {
|
|
r.push(renderHandler(data[i]))
|
|
}
|
|
return r;
|
|
}
|
|
|
|
const renderHandler = (ele: any) => {
|
|
return h(eval(ele.type), ele.props, ele.children.map((child: any) => {
|
|
if (child.type) {
|
|
return renderHandler(child);
|
|
} else {
|
|
return child;
|
|
}
|
|
}));
|
|
}
|
|
|
|
const getCookieTimeoutHandel = async() => {
|
|
await sleep(3000)
|
|
getCookieTip.value = '获取 Cookie 时间过长, 请检查油猴插件及脚本是否安装正确';
|
|
}
|
|
|
|
const autoPassCFChallenge = async () => {
|
|
let resq = await fetch('/pass', {
|
|
credentials: 'include',
|
|
method: 'POST', // *GET, POST, PUT, DELETE, etc.
|
|
mode: 'cors', // no-cors, *cors, same-origin
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
'IG': _G.IG,
|
|
'T': await aesEncrypt(_G.AT, _G.IG),
|
|
}),
|
|
}).then((res) => res.json())
|
|
.catch(() => {
|
|
message.error('人机验证失败, 请重试');
|
|
passingCFChallenge.value = false;
|
|
})
|
|
if (resq['result'] != null && resq['result'] != undefined) {
|
|
userStore.saveCookies(resq['result']['cookies']);
|
|
cookiesStr.value = resq['result']['cookies'];
|
|
message.success('自动通过人机验证成功');
|
|
passingCFChallenge.value = false;
|
|
window.location.href = '/';
|
|
} else {
|
|
message.error('人机验证失败, 请重试');
|
|
passingCFChallenge.value = false;
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<NDropdown v-if="isMobile()" class="select-none" :show="isShowMore" :options="navConfigs" :render-label="renderDropdownLabel" @select="handleSelect">
|
|
<NImage class="fixed top-6 right-4 cursor-pointer z-50" :src="settingSvgUrl" alt="设置菜单" :preview-disabled="true" @click="isShowMore = !isShowMore" :style="settingIconStyle"></NImage>
|
|
</NDropdown>
|
|
<NDropdown v-else class="select-none" trigger="hover" :options="navConfigs" :render-label="renderDropdownLabel" @select="handleSelect">
|
|
<NImage class="fixed top-6 right-6 cursor-pointer z-50" :src="settingSvgUrl" alt="设置菜单" :preview-disabled="true" :style="settingIconStyle"></NImage>
|
|
</NDropdown>
|
|
<NModal v-model:show="isShowLoginModal" preset="dialog" :show-icon="false">
|
|
<template #header>
|
|
<div class="text-3xl py-2">账号登录</div>
|
|
</template>
|
|
<NSelect v-model:value="oneKeyLogin" :options="loginTypeOptions" size="large" placeholder="选择登录方式" />
|
|
<div v-if="oneKeyLogin == 'true'">
|
|
<div v-if="!isShowIframe" style="margin-top:12px; margin-bottom:24px">
|
|
<NP>
|
|
使用此功能前, 请先安装<NA href="https://www.tampermonkey.net/">油猴插件</NA>, 并安装<NA href="https://greasyfork.org/zh-CN/scripts/487409-go-proxy-bingai">此脚本</NA>
|
|
<br>
|
|
请点击下面「打开登录页面」按钮, 在新打开登录页面中登录账号, 登录成功后点击确定
|
|
</NP>
|
|
</div>
|
|
<div v-else>
|
|
<NSpin size="large" :description="getCookieTip" style="margin: 0 auto; width: 100%" />
|
|
<iframe id="login" :src="bingUrl" style="border: none; width: 0; height: 0" />
|
|
</div>
|
|
</div>
|
|
<div v-else>
|
|
<NForm ref="formRef" label-placement="left" label-width="auto" require-mark-placement="right-hanging" style="margin-top: 16px;">
|
|
<NFormItem path="cookiesEnable" label="登录方式">
|
|
<NRadioGroup v-model:value="msLoginType">
|
|
<NSpace vertical>
|
|
<NRadio v-for="item in msLoginTypeOptions" size="large" :key="item.value" :value="item.value">{{ item.label }}</NRadio>
|
|
</NSpace>
|
|
</NRadioGroup>
|
|
</NFormItem>
|
|
<NFormItem path="account" label="账号">
|
|
<NInput size="large" v-model:value="msLoginAccount" type="text" placeholder="账号" />
|
|
</NFormItem>
|
|
<NFormItem v-show="msLoginType === 'passwd'" path="password" label=" 密码">
|
|
<NInput size="large" v-model:value="msLoginPassword" type="password" show-password-on="click" placeholder="密码" />
|
|
</NFormItem>
|
|
<NFormItem v-show="msLoginType !== 'passwd'" path="verify_code" label="验证码">
|
|
<NInput size="large" v-model:value="msLoginCode" type="text" placeholder="验证码" :disabled="msLoginType === 'device'" />
|
|
</NFormItem>
|
|
</NForm>
|
|
</div>
|
|
<template #action>
|
|
<NButton v-show="oneKeyLogin == 'true'" size="large" type="info" @click="newWindow">打开登录页面</NButton>
|
|
<NButton v-show="oneKeyLogin == 'true'" size="large" @click="isShowLoginModal = false">取消</NButton>
|
|
<NButton v-show="oneKeyLogin == 'true'" ghost size="large" type="info" @click="loginHandel">确定</NButton>
|
|
<NButton v-show="oneKeyLogin != 'true' && msLoginType === 'email'" size="large" type="info" :loading="msContinueing" @click="msLoginContinueHandel">获取邮箱验证码</NButton>
|
|
<NButton v-show="oneKeyLogin != 'true'" ghost size="large" type="info" :loading="msLogining" @click="msLoginHandel">确定</NButton>
|
|
</template>
|
|
</NModal>
|
|
<NModal v-model:show="isShowSettingModal" preset="dialog" :show-icon="false">
|
|
<template #header>
|
|
<div class="text-3xl py-2">设置</div>
|
|
</template>
|
|
<NForm ref="formRef" label-placement="left" label-width="auto" require-mark-placement="right-hanging" style="margin-top: 16px;">
|
|
<NGrid x-gap="0" :cols="2">
|
|
<NGridItem>
|
|
<NFormItem path="cookiesEnable" label="自动人机验证">
|
|
<NTooltip>
|
|
<template #trigger>
|
|
<NButton type="info" :loading="passingCFChallenge" @click="settingMenu('autoPassCFChallenge')">启动</NButton>
|
|
</template>
|
|
旧版本的人机验证, 现已完全自动代理通过
|
|
</NTooltip>
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="cookiesEnable" label="账号登录">
|
|
<NButton type="info" @click="settingMenu('login')">打开</NButton>
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="cookiesEnable" label="服务选择">
|
|
<NButton type="info" @click="settingMenu('chatService')">打开</NButton>
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="cookiesEnable" label="Cookie 设置">
|
|
<NButton type="info" @click="settingMenu('cookieSetting')">打开</NButton>
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="cookiesEnable" label="提示词库">
|
|
<NButton type="info" @click="settingMenu('promptStore')">打开</NButton>
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="cookiesEnable" label="高级设置">
|
|
<NButton type="info" @click="settingMenu('advancedSetting')">打开</NButton>
|
|
</NFormItem>
|
|
</NGridItem>
|
|
</NGrid>
|
|
</NForm>
|
|
<template #action>
|
|
<NButton ghost size="large" type="info" @click="isShowSettingModal = false">确定</NButton>
|
|
</template>
|
|
</NModal>
|
|
<NModal v-model:show="isShowCookieModal" preset="dialog" :show-icon="false">
|
|
<template #header>
|
|
<div class="text-3xl py-2">Cookie 设置</div>
|
|
</template>
|
|
<NForm ref="formRef" label-placement="left" label-width="auto" require-mark-placement="right-hanging" style="margin-top: 16px;">
|
|
<NFormItem path="cookiesEnable" label="完整 Cookie">
|
|
<NSwitch v-model:value="cookiesEnable" />
|
|
</NFormItem>
|
|
<NFormItem v-show="!cookiesEnable" path="token" label="Token">
|
|
<NInput size="large" v-model:value="userToken" type="text" placeholder="用户 Cookie ,仅需要 _U 的值" />
|
|
</NFormItem>
|
|
<NFormItem v-show="!cookiesEnable" path="token" label="KievRPSSecAuth">
|
|
<NInput size="large" v-model:value="userKievRPSSecAuth" type="text" placeholder="用户 Cookie ,仅需要 KievRPSSecAuth 的值" />
|
|
</NFormItem>
|
|
<NFormItem v-show="!cookiesEnable" path="token" label="_RwBf">
|
|
<NInput size="large" v-model:value="userRwBf" type="text" placeholder="用户 Cookie ,仅需要 _RwBf 的值" />
|
|
</NFormItem>
|
|
<NFormItem v-show="!cookiesEnable" path="token" label="MUID">
|
|
<NInput size="large" v-model:value="userMUID" type="text" placeholder="用户 Cookie ,仅需要 MUID 的值" />
|
|
</NFormItem>
|
|
<NFormItem v-show="cookiesEnable" path="token" label="Cookies">
|
|
<NInput size="large" v-model:value="cookies" type="text" placeholder="完整用户 Cookie" />
|
|
</NFormItem>
|
|
</NForm>
|
|
<template #action>
|
|
<NButton size="large" @click="isShowCookieModal = false">取消</NButton>
|
|
<NButton ghost size="large" type="info" @click="saveSetting">保存</NButton>
|
|
</template>
|
|
</NModal>
|
|
<NModal v-model:show="isShowAdvancedSettingModal" preset="dialog" :show-icon="false">
|
|
<template #header>
|
|
<div class="text-3xl py-2">高级设置</div>
|
|
</template>
|
|
<NForm ref="formRef" label-placement="left" label-width="auto" require-mark-placement="right-hanging"
|
|
style="margin-top: 16px;">
|
|
<NGrid x-gap="0" :cols="2">
|
|
<NGridItem>
|
|
<NFormItem path="history" label="历史记录">
|
|
<NSwitch v-model:value="history" />
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="enterpriseEnable" label="企业版">
|
|
<NSwitch v-model:value="enterpriseSetting" />
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="copilotProEnable">
|
|
<template #label>
|
|
Copilot Pro
|
|
<NTooltip trigger="hover">
|
|
<template #trigger>
|
|
<NIcon size="14" style="top: 2px;">
|
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path d="M256 56C145.72 56 56 145.72 56 256s89.72 200 200 200s200-89.72 200-200S366.28 56 256 56zm0 82a26 26 0 1 1-26 26a26 26 0 0 1 26-26zm64 226H200v-32h44v-88h-32v-32h64v120h44z" fill="currentColor"></path></svg>
|
|
</NIcon>
|
|
</template>
|
|
如果有 Copilot Pro 的账号, 可开启此选项
|
|
</NTooltip>
|
|
</template>
|
|
<NSwitch v-model:value="copilotProSetting" />
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="sydneyEnable" label="连续语音对话">
|
|
<NSwitch v-model:value="autoReopenMicSetting" />
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="gpt4tEnable">
|
|
<template #label>
|
|
Copilot 增强
|
|
<NTooltip trigger="hover" :style="{ maxWidth: '240px' }">
|
|
<template #trigger>
|
|
<NIcon size="14" style="top: 2px;">
|
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path d="M256 56C145.72 56 56 145.72 56 256s89.72 200 200 200s200-89.72 200-200S366.28 56 256 56zm0 82a26 26 0 1 1-26 26a26 26 0 0 1 26-26zm64 226H200v-32h44v-88h-32v-32h64v120h44z" fill="currentColor"></path></svg>
|
|
</NIcon>
|
|
</template>
|
|
增强 Microsoft Copilot 的能力, 有可能会导致一些问题
|
|
</NTooltip>
|
|
</template>
|
|
<NSwitch v-model:value="gpt4tSetting" />
|
|
</NFormItem>
|
|
</NGridItem>
|
|
<NGridItem>
|
|
<NFormItem path="sydneyEnable" label="越狱模式">
|
|
<NSwitch v-model:value="sydneySetting" />
|
|
</NFormItem>
|
|
</NGridItem>
|
|
</NGrid>
|
|
<NFormItem path="langRegion" label="语言理解能力">
|
|
<NSelect v-model:value="langRegionSetting" :options="langRegionOptions" size="large" placeholder="语言理解能力" />
|
|
</NFormItem>
|
|
<NFormItem path="sydneyPrompt" label="人机验证服务器">
|
|
<NInput size="large" v-model:value="passServerSetting" type="text" placeholder="人机验证服务器" />
|
|
</NFormItem>
|
|
<NFormItem path="sydneyPrompt" label="提示词">
|
|
<NInput size="large" v-model:value="sydneyPromptSetting" type="text" placeholder="越狱模式提示词" />
|
|
</NFormItem>
|
|
<NFormItem path="themeMode" label="UI 版本">
|
|
<NSelect v-model:value="uiVersionSetting" :options="uiVersionOptions" size="large" placeholder="请选择 UI 版本" />
|
|
</NFormItem>
|
|
<NFormItem path="themeMode" label="主题模式">
|
|
<NSelect v-model:value="themeModeSetting" :options="themeModeOptions" size="large" placeholder="请选择主题模式" />
|
|
</NFormItem>
|
|
<NFormItem v-show="!cookiesEnable" path="customChatNum" label="聊天次数">
|
|
<NInputNumber size="large" v-model:value="customChatNumSetting" min="0" style="width: 100%;"/>
|
|
</NFormItem>
|
|
</NForm>
|
|
<template #action>
|
|
<NButton size="large" @click="isShowAdvancedSettingModal = false">取消</NButton>
|
|
<NButton ghost size="large" type="info" @click="saveAdvancedSetting">保存</NButton>
|
|
</template>
|
|
</NModal>
|
|
<NModal v-model:show="isShowClearCacheModal" preset="dialog" :show-icon="false">
|
|
<template #header>
|
|
<div class="text-xl py-2">将删除包括 Cookie 等的所有缓存?</div>
|
|
</template>
|
|
<template #action>
|
|
<NButton size="large" @click="isShowClearCacheModal = false">取消</NButton>
|
|
<NButton ghost size="large" type="error" @click="resetCache">确定</NButton>
|
|
</template>
|
|
</NModal>
|
|
<NModal v-model:show="isShowSetAboutModal" preset="dialog" :show-icon="false">
|
|
<template #header>
|
|
<div class="text-3xl py-2">关于</div>
|
|
</template>
|
|
<NForm ref="formRef" label-placement="left" label-width="82px" size="small" style="margin-top: 16px;">
|
|
<NFormItem path="version" label="版本号">
|
|
<NTag type="info" size="small" round>{{ 'v' + localVersion }}</NTag>
|
|
</NFormItem>
|
|
<NFormItem path="latestVersion" label="最新版本" id="latestVersion" ref="latestVersion">
|
|
<NTag type="info" size="small" round>{{ lastVersion }}</NTag>
|
|
</NFormItem>
|
|
</NForm>
|
|
<template #action>
|
|
<NButton ghost size="large" @click="isShowSetAboutModal = false" type="info">确定</NButton>
|
|
</template>
|
|
</NModal>
|
|
<CreateImage v-model:show="isShowCreateImageModal" />
|
|
</template>
|
|
|