const puppeteer = require('puppeteer'); const express = require('express'); const cors = require('cors'); // 引入 cors 中间件 const app = express(); const port = 7860; app.use(cors()); // 使用 cors 中间件 function convertEscapedUrlToStandard(escapedUrl) { // 使用正则表达式替换所有的转义反斜杠 const standardUrl = escapedUrl.replace(/\\\//g, '/'); return standardUrl; } function extractStringAfterRp(url) { // 分割URL并找到 'rp/' 后面的部分 const parts = url.split('rp/'); if (parts.length > 1) { return parts[1]; // 返回 'rp/' 后面的字符串 } return '未找到 "rp/" 后的字符串'; } app.get('/*', async (req, res) => { const referer = req.headers.referer || "https://r.bing.com"; const url = new URL(referer); const rehost = url.hostname; // 启动浏览器 const browser = await puppeteer.launch({ executablePath: '/usr/bin/google-chrome-stable', // 根据您的实际路径进行修改 // 其他选项... }); const page = await browser.newPage(); // 导航到网页 await page.goto('https://www.bing.com/search?q=Microsoft+Copilot&FORM=hpcodx&showconv=1&showconv=1'); // 等待页面源码中出现 'CodexBundle' 字符串,最长等待时间为30秒 await page.waitForFunction(() => { return document.documentElement.innerHTML.includes('CodexBundle'); }, { timeout: 30000 }); // 设置超时时间为30秒 // 执行页面脚本来查找特定的字符串 const result = await page.evaluate(() => { const regex = /CodexBundle:cib-bundle.*?\.js/; const htmlContent = document.documentElement.innerHTML; const matchcib = htmlContent.match(regex); if (matchcib) { const cibname = matchcib[0]; // 使用正则表达式提取所有的JS文件URL const allregex = /\/([a-zA-Z0-9_-]+\.br\.js)'/g; const matches = htmlContent.match(allregex); let scripts = ''; if (matches) { matches.forEach(match => { const scriptUrl = match.replace(/'/g, ""); scripts += `\n`; }); } return { scripts, cibname, htmlContent }; } return { scripts: '没有找到匹配的字符串', cibname, htmlContent }; }); console.log(result.cibname); // 在此处输出 htmlContent // 判断访问路径 if (req.path === '/html') { res.set('Content-Type', 'text/html'); res.send(result.htmlContent); // 发送 htmlContent 的纯文本响应 } else if (req.path === '/core') { // 先找到包含前后字符的字符串 const coreContent = result.htmlContent.match(/\(function\(n,t\)\{onload=function\(\)\{_G\.BPT=new.*?\/\/\]\]/s); if (coreContent) { // 删除掉不需要的部分 let extractedString = coreContent[0]; extractedString = extractedString.replace('[CDATA[', '').replace('//]]', '').replace('https:\/\/r.bing.com', ''); extractedString = extractedString.replace(/\\\/rp\\\//g, `https://${rehost}/rp/`); // 使用模板字符串 extractedString = extractedString.replace(/https:\\\/\\\/r\.bing\.com/g, ''); // 删除 https:\/\/r.bing.com 字符串 extractedString = extractedString.replace(/\\\/rs\\\/6r\\\/x2\\\/nj\\\//g, `https://r.bing.com/rs/6r/x2/nj/`); extractedString = extractedString.replace(/\\\/rs\\\/6r\\\/sQ\\\/jnc,nj\\\//g, `https://r.bing.com/rs/6r/sQ/jnc,nj/`); extractedString = extractedString.replace(/\\\/rs\\\/6r\\\/kQ\\\/jnc,nj\\\//g, `https://r.bing.com/rs/6r/kQ/jnc,nj/`); // extractedString = extractedString.replace(/\}\);;/g, `},{ 'A:rms:answers:Web:SydneyWelcomeScreen':'https://${rehost}/rp/J1Qt_5kw_tmsXwaKeAFz2xPNi4s.br.js' });;`); // 使用模板字符串 extractedString = extractedString.replace(/,\{\'A:.{1,2}\':.{1,2}\}/g, ''); // extractedString = extractedString.replace(/\{\'A:rms:answers:Web:FreeSydneyHelper/g, '//{\'A:rms:answers:Web:FreeSydneyHelper'); extractedString = extractedString.replace(/\{\'A:rms:answers:Web:SydneyFSCHelper/g, '//{\'A:rms:answers:Web:SydneyFSCHelper'); extractedString = extractedString.replace(/\'\},/g, '\'},\n'); res.set('Content-Type', 'text/plain'); res.send(extractedString); // 发送提取后的字符串 } else { res.set('Content-Type', 'text/plain'); res.send('没有找到Core匹配的字符串'); } } else if (req.path === '/importmap') { // 提取以 结尾的字符串 const importmapContent = result.htmlContent.match(/