brp / index.js
lix02's picture
Update index.js
8268d6f verified
raw
history blame
5.63 kB
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 += `<script src="https://r.bing.com/rp${scriptUrl}"></script>\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://bcore.pages.dev/web/rp/sNzL8vfHHNmyqYOSQey9fNYd3kI.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') {
// 提取以 <script type="importmap" nonce=""> 开始,以 </script> 结尾的字符串
const importmapContent = result.htmlContent.match(/<script type="importmap" nonce="">.*?<\/script>/s);
if (importmapContent) {
let pextractedString = importmapContent[0];
pextractedString = pextractedString.replace('<script type="importmap" nonce="">', '').replace('<\/script>', '');
//pextractedString = pextractedString.replace(/https:\/\/r\.bing\.com/g, 'https://cfby.nbing.eu.org'); // 删除 https://r.bing.com
// pextractedString = pextractedString.replace(/https:\/\/r\.bing\.com/g, ''); // 删除 https://r.bing.com
res.set('Content-Type', 'text/plain');
res.send(pextractedString); // 发送提取后的字符串
} else {
res.set('Content-Type', 'text/plain');
res.send('没有找到map匹配的字符串');
}
} else {
res.set('Content-Type', 'text/plain');
res.send(result.scripts); // 发送 scripts 的纯文本响应
}
// 关闭浏览器
await browser.close();
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});