gemini-proxy-client 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/manager.js +2 -0
- package/dist/cli.js +9 -2
- package/dist/commands/start.js +16 -10
- package/package.json +1 -1
package/dist/browser/manager.js
CHANGED
|
@@ -37,6 +37,8 @@ export class BrowserManager {
|
|
|
37
37
|
disable_coop: true,
|
|
38
38
|
// 允许在主世界执行脚本,用于 iframe 内的 evaluate
|
|
39
39
|
main_world_eval: true,
|
|
40
|
+
// 忽略 disable_coop 警告
|
|
41
|
+
i_know_what_im_doing: true,
|
|
40
42
|
});
|
|
41
43
|
this.context = await this.browser.newContext({
|
|
42
44
|
viewport: fingerprint.viewport,
|
package/dist/cli.js
CHANGED
|
@@ -7,19 +7,26 @@ import fs from 'fs';
|
|
|
7
7
|
import { startClient } from './commands/start.js';
|
|
8
8
|
import { loginCommand } from './commands/login.js';
|
|
9
9
|
import { statusCommand } from './commands/status.js';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = path.dirname(__filename);
|
|
13
|
+
// 从 package.json 读取版本号
|
|
14
|
+
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
15
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
10
16
|
const DEFAULT_DATA_DIR = path.join(os.homedir(), '.gemini-client');
|
|
11
17
|
const program = new Command();
|
|
12
18
|
program
|
|
13
19
|
.name('gemini-client')
|
|
14
20
|
.description('Gemini Proxy Build App 客户端 - 使用 Camoufox 自动保持连接')
|
|
15
|
-
.version(
|
|
21
|
+
.version(packageJson.version);
|
|
16
22
|
program
|
|
17
23
|
.command('start')
|
|
18
24
|
.description('启动客户端,连接到代理服务器')
|
|
19
25
|
.option('-s, --server <url>', '代理服务器 WebSocket 地址', 'ws://localhost:5345/v1/ws')
|
|
20
26
|
.option('-t, --token <token>', '客户端认证令牌 (不指定则自动生成)')
|
|
21
27
|
.option('-d, --daemon', '后台运行模式')
|
|
22
|
-
.option('--headless', '强制无头模式 (
|
|
28
|
+
.option('--headless', '强制无头模式 (可能有兼容性问题)')
|
|
29
|
+
.option('--virtual', '虚拟显示模式 (需要安装 xvfb,推荐)')
|
|
23
30
|
.option('--data-dir <path>', '数据目录路径', DEFAULT_DATA_DIR)
|
|
24
31
|
.action(async (options) => {
|
|
25
32
|
try {
|
package/dist/commands/start.js
CHANGED
|
@@ -65,17 +65,22 @@ export async function startClient(options) {
|
|
|
65
65
|
console.log(chalk.gray('─'.repeat(50)));
|
|
66
66
|
const cookiesPath = path.join(dataDir, 'cookies.json');
|
|
67
67
|
const hasCookies = fs.existsSync(cookiesPath);
|
|
68
|
-
//
|
|
68
|
+
// 决定使用哪种模式: false (有界面) / true (无头) / 'virtual' (虚拟显示)
|
|
69
69
|
let headless = options.headless ?? false;
|
|
70
|
+
// 如果指定了 --virtual,使用虚拟显示模式
|
|
71
|
+
if (options.virtual) {
|
|
72
|
+
headless = 'virtual';
|
|
73
|
+
}
|
|
70
74
|
if (!hasCookies) {
|
|
71
75
|
console.log(chalk.yellow('⚠️ 未检测到 Google 登录状态'));
|
|
72
76
|
console.log(chalk.white(' 将打开浏览器,请登录您的 Google 账号...'));
|
|
73
77
|
headless = false;
|
|
74
78
|
}
|
|
75
|
-
else if (!options.headless) {
|
|
76
|
-
// 有 cookies
|
|
77
|
-
headless =
|
|
79
|
+
else if (!options.headless && !options.virtual) {
|
|
80
|
+
// 有 cookies,默认使用虚拟显示模式(如果可用)或无头模式
|
|
81
|
+
headless = 'virtual';
|
|
78
82
|
console.log(chalk.green('📂 检测到已保存的登录状态'));
|
|
83
|
+
console.log(chalk.gray(' 尝试使用虚拟显示模式 (需要 xvfb)'));
|
|
79
84
|
}
|
|
80
85
|
const spinner = ora('启动 Camoufox 浏览器...').start();
|
|
81
86
|
try {
|
|
@@ -103,19 +108,19 @@ export async function startClient(options) {
|
|
|
103
108
|
// 保存 cookies
|
|
104
109
|
await browserManager.saveCookies();
|
|
105
110
|
console.log(chalk.green('✅ Google 登录成功!已保存登录状态'));
|
|
106
|
-
//
|
|
107
|
-
console.log(chalk.gray('🔄
|
|
111
|
+
// 关闭有界面的浏览器,以虚拟显示模式重新启动
|
|
112
|
+
console.log(chalk.gray('🔄 切换到虚拟显示模式...'));
|
|
108
113
|
await browserManager.close();
|
|
109
|
-
//
|
|
114
|
+
// 创建新的虚拟显示模式浏览器实例
|
|
110
115
|
browserManager = new BrowserManager({
|
|
111
|
-
headless:
|
|
116
|
+
headless: 'virtual',
|
|
112
117
|
dataDir,
|
|
113
118
|
serverUrl: server,
|
|
114
119
|
token,
|
|
115
120
|
});
|
|
116
121
|
// 重新设置信号处理
|
|
117
122
|
setupSignalHandlers(browserManager);
|
|
118
|
-
spinner.start('
|
|
123
|
+
spinner.start('以虚拟显示模式重新启动...');
|
|
119
124
|
await browserManager.launch();
|
|
120
125
|
spinner.text = '打开 Build App 页面...';
|
|
121
126
|
await browserManager.openBuildApp();
|
|
@@ -124,8 +129,9 @@ export async function startClient(options) {
|
|
|
124
129
|
spinner.text = '点击 ws connect 按钮...';
|
|
125
130
|
await browserManager.clickConnectButton();
|
|
126
131
|
spinner.succeed(chalk.green('已连接到代理服务器!'));
|
|
132
|
+
const modeText = headless === 'virtual' ? '虚拟显示模式' : (headless ? '无头模式' : '有界面模式');
|
|
127
133
|
console.log(chalk.gray('─'.repeat(50)));
|
|
128
|
-
console.log(chalk.green(`✅ 客户端已启动 (
|
|
134
|
+
console.log(chalk.green(`✅ 客户端已启动 (${modeText})`));
|
|
129
135
|
console.log(chalk.white(` Token: ${token}`));
|
|
130
136
|
console.log(chalk.gray(' 按 Ctrl+C 退出'));
|
|
131
137
|
console.log(chalk.gray('─'.repeat(50)));
|