wuyuncheng-26's picture
upload files from Harry-zklcdc/go-proxy-bingai
d669ddb verified
<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;
// todo 反馈暂时无法使用,先移除
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 = '有问题尽管问我...("/" 触发提示词)';
}
// 加入css
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>