This commit is contained in:
dengqichen 2025-11-17 20:13:06 +08:00
parent 13cd9fbb49
commit b0b81e9279
3 changed files with 66 additions and 6 deletions

View File

@ -23,8 +23,11 @@ export const defaultConfig = {
proxyLogin: '',
proxyPassword: '',
enabledForBlacklistControl: false, // Use blacklist control
blackUrlList: [], // Blacklist URL list
enabledForBlacklistControl: true, // Use blacklist control
blackUrlList: [
'checkout.stripe.com', // 禁用 CapSolver 在 Stripe 支付页面
'js.stripe.com' // 禁用 CapSolver 在 Stripe JS 资源
], // Blacklist URL list
// Is captcha enabled by default or not
enabledForRecaptcha: true,

View File

@ -133,10 +133,19 @@ class BatchRegister {
logger.info('BatchRegister', `注册间隔: ${this.delayBetweenRuns/1000}`);
logger.info('BatchRegister', `单次重试: ${this.maxRetries}\n`);
// 捕获 Ctrl+C
// 捕获 Ctrl+C支持二次强制退出
let sigintCount = 0;
process.on('SIGINT', async () => {
logger.warn('BatchRegister', '\n\n⚠ 收到停止信号,等待当前任务完成...');
this.running = false;
sigintCount++;
if (sigintCount === 1) {
logger.warn('BatchRegister', '\n\n⚠ 收到停止信号,等待当前任务完成...');
logger.info('BatchRegister', '💡 再次按 Ctrl+C 可强制退出');
this.running = false;
} else if (sigintCount >= 2) {
logger.error('BatchRegister', '\n\n❌ 收到第二次停止信号,强制退出!');
process.exit(1);
}
});
// 并发控制:使用 profile 池

View File

@ -192,10 +192,58 @@ class BrowserManager {
try {
logger.info(this.siteName, ' → 关闭浏览器...');
// 1. 先关闭所有页面/标签页
try {
const pages = await this.browser.pages();
logger.info(this.siteName, ` → 关闭所有标签页 (共 ${pages.length} 个)...`);
for (const page of pages) {
try {
await page.close();
logger.info(this.siteName, ` → ✓ 已关闭一个标签页`);
} catch (e) {
logger.warn(this.siteName, ` → 关闭标签页失败: ${e.message}`);
}
}
} catch (e) {
logger.warn(this.siteName, ` → 获取页面列表失败: ${e.message}`);
}
// 2. 断开 Puppeteer 连接
await this.browser.disconnect();
logger.success(this.siteName, ' → ✓ Puppeteer 连接已断开');
// 3. 调用 AdsPower API 停止浏览器进程
if (this.profileId) {
const stopUrl = `${this.apiBase}/api/v1/browser/stop?user_id=${encodeURIComponent(this.profileId)}`;
const headers = {};
if (this.apiKey && this.apiKey.trim()) {
headers['Authorization'] = `Bearer ${this.apiKey}`;
}
logger.info(this.siteName, ` → 调用 AdsPower API 停止浏览器进程...`);
try {
const response = await axios.get(stopUrl, { headers });
const data = response.data;
if (data.code === 0) {
logger.success(this.siteName, ' → ✓ AdsPower 浏览器进程已停止');
} else {
logger.warn(this.siteName, ` → AdsPower stop API 返回: ${data.msg || JSON.stringify(data)}`);
}
} catch (e) {
logger.warn(this.siteName, ` → 调用 AdsPower stop API 失败: ${e.message}`);
logger.info(this.siteName, ' → 浏览器可能已经关闭,或需要手动关闭');
}
}
this.browser = null;
this.page = null;
logger.success(this.siteName, ' → ✓ 浏览器已关闭');
logger.success(this.siteName, ' → ✓ 浏览器完全关闭');
} catch (error) {
logger.error(this.siteName, `关闭浏览器失败: ${error.message}`);
throw error;