diff --git a/README.md b/README.md index 1ee944a4..c63ab798 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,8 @@ https://bing.github1s.tk ## 安装和使用 +> 由于目前微软封杀比较严重,推荐优先使用 [部署 Huggingface](#部署到-huggingface) 。 + * 使用 Node 启动 ```bash diff --git a/src/components/settings.tsx b/src/components/settings.tsx index e18aa5b4..45ba6044 100644 --- a/src/components/settings.tsx +++ b/src/components/settings.tsx @@ -13,14 +13,16 @@ import { } from '@/components/ui/dialog' import { Button } from './ui/button' import { Input } from './ui/input' -import { ChunkKeys, parseCookies, extraCurlFromCookie, randomIP, encodeHeadersToCookie } from '@/lib/utils' +import { ChunkKeys, parseCookies, extraCurlFromCookie, encodeHeadersToCookie, getCookie, setCookie } from '@/lib/utils' import { ExternalLink } from './external-link' import { useCopyToClipboard } from '@/lib/hooks/use-copy-to-clipboard' + export function Settings() { const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2000 }) const [loc, setLoc] = useAtom(hashAtom) const [curlValue, setCurlValue] = useState(extraCurlFromCookie(parseCookies(document.cookie, ChunkKeys))) + const [imageOnly, setImageOnly] = useState(getCookie('IMAGE_ONLY') !== '0') const [enableTTS, setEnableTTS] = useAtom(voiceAtom) useEffect(() => { @@ -58,6 +60,19 @@ export function Settings() { placeholder="在此填写用户信息,格式: curl 'https://www.bing.com/turing/captcha/challenge' ..." onChange={e => setCurlValue(e.target.value)} /> +
+ 身份信息仅用于画图(推荐) + setImageOnly(checked)} + > + + +
+ @@ -71,7 +86,7 @@ export function Settings() { if (headerValue) { try { headerValue = atob(headerValue) - } catch (e) {} + } catch (e) { } if (!/^\s*curl ['"]https:\/\/www\.bing\.com\/turing\/captcha\/challenge['"]/.test(headerValue)) { toast.error('格式不正确') return @@ -79,8 +94,9 @@ export function Settings() { const maxAge = 86400 * 30 encodeHeadersToCookie(headerValue).forEach(cookie => document.cookie = `${cookie}; Max-Age=${maxAge}; Path=/; SameSite=None; Secure`) } else { - [...ChunkKeys, 'BING_COOKIE', 'BING_UA', 'BING_IP'].forEach(key => document.cookie = `${key}=; Path=/; SameSite=None; Secure`) + [...ChunkKeys, 'BING_COOKIE', 'BING_UA', 'BING_IP'].forEach(key => setCookie(key, '')) } + setCookie('IMAGE_ONLY', imageOnly ? '1' : '0') toast.success('保存成功') setLoc('') diff --git a/src/lib/bots/bing/index.ts b/src/lib/bots/bing/index.ts index 2c4afae0..ec039c1b 100644 --- a/src/lib/bots/bing/index.ts +++ b/src/lib/bots/bing/index.ts @@ -139,7 +139,7 @@ export class BingWebBot { } if (!resp?.result) { - throw new ChatError('Invalid response', ErrorCode.UNKOWN_ERROR) + throw new ChatError('你的 VPS 或代理可能被封禁,如有疑问,请前往 https://github.com/weaigc/bingo 咨询', ErrorCode.UNKOWN_ERROR) } const { value, message } = resp.result || {} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 07feedb3..0a09ddc4 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -27,6 +27,8 @@ export function randomIP() { return `11.${random(104, 107)}.${random(1, 255)}.${random(1, 255)}` } +export const defaultUID = Math.random().toString(36).slice(2) + export function parseHeadersFromCurl(content: string) { const re = /-H '([^:]+):\s*([^']+)/mg const headers: HeadersInit = {} @@ -76,6 +78,16 @@ export function parseCookie(cookie: string, cookieName: string) { return targetCookie ? decodeURIComponent(targetCookie).trim() : cookie.indexOf('=') === -1 ? cookie.trim() : '' } +export function setCookie(key: string, value: string) { + const maxAge = 86400 * 30 + document.cookie = `${key}=${value || ''}; Path=/; Max-Age=${maxAge}; SameSite=None; Secure` +} + +export function getCookie(cookieName: string) { + const re = new RegExp(`(?:[; ]|^)${cookieName}=([^;]*)`) + return re.test(document.cookie) ? RegExp.$1 : '' +} + export function parseCookies(cookie: string, cookieNames: string[]) { const cookies: { [key: string]: string } = {} cookieNames.forEach(cookieName => { @@ -91,25 +103,33 @@ export function parseUA(ua?: string, default_ua = DEFAULT_UA) { return / EDGE?/i.test(decodeURIComponent(ua || '')) ? decodeURIComponent(ua!.trim()) : default_ua } -export function createHeaders(cookies: Partial<{ [key: string]: string }>, defaultHeaders?: Partial<{ [key: string]: string }>) { +export function createHeaders(cookies: Partial<{ [key: string]: string }>, defaultHeaders?: Partial<{ [key: string]: string }>, type?: string) { let { BING_COOKIE = process.env.BING_COOKIE, BING_UA = process.env.BING_UA, BING_IP = process.env.BING_IP, BING_HEADER = process.env.BING_HEADER, + IMAGE_ONLY = process.env.IMAGE_ONLY ?? '1', } = cookies if (BING_HEADER) { - return extraHeadersFromCookie({ + const headers = extraHeadersFromCookie({ BING_HEADER, ...cookies, - }) + }) || {} + if (/^(1|true|yes)$/.test(String(IMAGE_ONLY)) && type !== 'image') { + // 仅画图时设置 cookie + headers.cookie = `_U=${defaultUID}` + } + if (headers['user-agent']) { + return headers + } } const ua = parseUA(BING_UA) if (!BING_COOKIE) { - BING_COOKIE = defaultHeaders?.IMAGE_BING_COOKIE || 'xxx' // hf 暂时不用 Cookie 也可以正常使用 + BING_COOKIE = defaultHeaders?.IMAGE_BING_COOKIE || defaultUID // hf 暂时不用 Cookie 也可以正常使用 } const parsedCookie = parseCookie(BING_COOKIE, '_U') diff --git a/src/pages/api/create.ts b/src/pages/api/create.ts index 508fa97e..430bb2d5 100644 --- a/src/pages/api/create.ts +++ b/src/pages/api/create.ts @@ -4,8 +4,8 @@ import { NextApiRequest, NextApiResponse } from 'next' import { fetch, debug } from '@/lib/isomorphic' import { createHeaders } from '@/lib/utils' -// const API_ENDPOINT = 'https://www.bing.com/turing/conversation/create' -const API_ENDPOINT = 'https://edgeservices.bing.com/edgesvc/turing/conversation/create'; +const API_ENDPOINT = 'https://www.bing.com/turing/conversation/create' +// const API_ENDPOINT = 'https://edgeservices.bing.com/edgesvc/turing/conversation/create'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { diff --git a/src/pages/api/image.ts b/src/pages/api/image.ts index 4b894bea..fbc0c8de 100644 --- a/src/pages/api/image.ts +++ b/src/pages/api/image.ts @@ -18,7 +18,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) try { const headers = createHeaders(req.cookies, { IMAGE_BING_COOKIE: process.env.IMAGE_BING_COOKIE - }) + }, 'image') debug('headers', headers) const response = await createImage(String(prompt), String(id), {