fix: keep mail and CPA traffic direct
This commit is contained in:
@@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
作用:注册 OpenAI 时使用的固定代理。
|
作用:注册 OpenAI 时使用的固定代理。
|
||||||
|
|
||||||
|
注意:这个代理只用于 OpenAI 注册流程;邮箱服务接口默认直连,不使用代理。
|
||||||
|
|
||||||
常见填写示例:
|
常见填写示例:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
@@ -95,6 +97,28 @@
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
当前建议:DuckMail 直连,不要走 OpenAI 的代理;否则在当前环境下可能出现 `502 Bad Gateway`。
|
||||||
|
|
||||||
|
如果你填写了 `domain`,程序会固定使用这个域名创建邮箱,不会再随机选择其他 DuckMail 域名。
|
||||||
|
|
||||||
|
例如:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"duckmail": {
|
||||||
|
"api_base": "https://api.duckmail.sbs",
|
||||||
|
"bearer_token": "your_duckmail_token",
|
||||||
|
"domain": "cursors.online"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
实际创建出来的邮箱会像:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ocxxxxxxx@cursors.online
|
||||||
|
```
|
||||||
|
|
||||||
|
也就是说,前缀是程序随机生成的,但域名会固定用你填写的 `cursors.online`。
|
||||||
|
|
||||||
### `moemail`
|
### `moemail`
|
||||||
|
|
||||||
如果你有 MoeMail 服务:
|
如果你有 MoeMail 服务:
|
||||||
|
|||||||
@@ -69,6 +69,10 @@ python3 /root/standalone_cli/run.py config setup
|
|||||||
|
|
||||||
- `http://127.0.0.1:17891`
|
- `http://127.0.0.1:17891`
|
||||||
|
|
||||||
|
说明:这个 `proxy` 用于 OpenAI 注册流程,邮箱服务接口默认直连,不走代理。
|
||||||
|
|
||||||
|
如果你在 DuckMail 配置里填写了 `domain`,程序会固定使用这个域名创建邮箱,不会随机切换到其他 DuckMail 域名。
|
||||||
|
|
||||||
模板里的 URL 现在使用了更明确的占位值:
|
模板里的 URL 现在使用了更明确的占位值:
|
||||||
|
|
||||||
- `https://your-cpa.example.com`
|
- `https://your-cpa.example.com`
|
||||||
|
|||||||
8
main.py
8
main.py
@@ -201,6 +201,7 @@ def handle_register(args: argparse.Namespace) -> dict[str, Any]:
|
|||||||
try:
|
try:
|
||||||
provider_name, provider = mail_router.next_provider()
|
provider_name, provider = mail_router.next_provider()
|
||||||
print(f"[*] 本次使用邮箱提供商: {provider_name}")
|
print(f"[*] 本次使用邮箱提供商: {provider_name}")
|
||||||
|
print("[*] 邮箱接口默认直连,不使用代理")
|
||||||
token_json = register_run(
|
token_json = register_run(
|
||||||
proxy,
|
proxy,
|
||||||
mail_provider=provider,
|
mail_provider=provider,
|
||||||
@@ -234,7 +235,7 @@ def handle_register(args: argparse.Namespace) -> dict[str, Any]:
|
|||||||
run_result: dict[str, Any] = {"ok": True, "file": file_name, "email": email}
|
run_result: dict[str, Any] = {"ok": True, "file": file_name, "email": email}
|
||||||
cpa = get_pool_maintainer(cfg)
|
cpa = get_pool_maintainer(cfg)
|
||||||
if cpa:
|
if cpa:
|
||||||
cpa_ok = cpa.upload_token(file_name, token_data, proxy=proxy or "")
|
cpa_ok = cpa.upload_token(file_name, token_data, proxy="")
|
||||||
run_result["cpa_uploaded"] = cpa_ok
|
run_result["cpa_uploaded"] = cpa_ok
|
||||||
print(f"[{'+' if cpa_ok else '-'}] CPA {'上传成功' if cpa_ok else '上传失败'}: {email}")
|
print(f"[{'+' if cpa_ok else '-'}] CPA {'上传成功' if cpa_ok else '上传失败'}: {email}")
|
||||||
if cfg.get("auto_sync"):
|
if cfg.get("auto_sync"):
|
||||||
@@ -328,6 +329,7 @@ def handle_config_setup(args: argparse.Namespace) -> dict[str, Any]:
|
|||||||
cfg = load_sync_config()
|
cfg = load_sync_config()
|
||||||
|
|
||||||
print("开始交互式配置,直接回车表示使用当前值。\n")
|
print("开始交互式配置,直接回车表示使用当前值。\n")
|
||||||
|
print("说明: OpenAI 注册流程使用 `proxy`,邮箱接口默认直连,不使用代理。\n")
|
||||||
|
|
||||||
cfg["proxy"] = _prompt_text("1) 注册代理地址", str(cfg.get("proxy") or "http://127.0.0.1:17891"))
|
cfg["proxy"] = _prompt_text("1) 注册代理地址", str(cfg.get("proxy") or "http://127.0.0.1:17891"))
|
||||||
cfg["auto_register"] = _prompt_bool("2) 池不足时自动注册", bool(cfg.get("auto_register", False)))
|
cfg["auto_register"] = _prompt_bool("2) 池不足时自动注册", bool(cfg.get("auto_register", False)))
|
||||||
@@ -345,7 +347,9 @@ def handle_config_setup(args: argparse.Namespace) -> dict[str, Any]:
|
|||||||
elif provider_name == "duckmail":
|
elif provider_name == "duckmail":
|
||||||
provider_cfg["api_base"] = _prompt_text(" DuckMail API 地址", str(provider_cfg.get("api_base") or "https://api.duckmail.sbs"))
|
provider_cfg["api_base"] = _prompt_text(" DuckMail API 地址", str(provider_cfg.get("api_base") or "https://api.duckmail.sbs"))
|
||||||
provider_cfg["bearer_token"] = _prompt_text(" DuckMail Bearer Token", str(provider_cfg.get("bearer_token") or ""))
|
provider_cfg["bearer_token"] = _prompt_text(" DuckMail Bearer Token", str(provider_cfg.get("bearer_token") or ""))
|
||||||
provider_cfg["domain"] = _prompt_text(" DuckMail 域名(可留空)", str(provider_cfg.get("domain") or ""))
|
provider_cfg["domain"] = _prompt_text(" DuckMail 域名(填写后将固定使用该域名,不再随机选域)", str(provider_cfg.get("domain") or ""))
|
||||||
|
if provider_cfg.get("domain"):
|
||||||
|
print(f" 已固定 DuckMail 域名: {provider_cfg['domain']},后续邮箱会使用该域名。")
|
||||||
elif provider_name == "moemail":
|
elif provider_name == "moemail":
|
||||||
provider_cfg["api_base"] = _prompt_text(" MoeMail API 地址", str(provider_cfg.get("api_base") or ""))
|
provider_cfg["api_base"] = _prompt_text(" MoeMail API 地址", str(provider_cfg.get("api_base") or ""))
|
||||||
provider_cfg["api_key"] = _prompt_text(" MoeMail API Key", str(provider_cfg.get("api_key") or ""))
|
provider_cfg["api_key"] = _prompt_text(" MoeMail API Key", str(provider_cfg.get("api_key") or ""))
|
||||||
|
|||||||
@@ -1325,17 +1325,17 @@ def run(
|
|||||||
emitter.info("正在创建临时邮箱...", step="create_email")
|
emitter.info("正在创建临时邮箱...", step="create_email")
|
||||||
try:
|
try:
|
||||||
email, dev_token = mail_provider.create_mailbox(
|
email, dev_token = mail_provider.create_mailbox(
|
||||||
proxy=static_proxy,
|
proxy="",
|
||||||
proxy_selector=mail_proxy_selector,
|
proxy_selector=None,
|
||||||
)
|
)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
email, dev_token = mail_provider.create_mailbox(proxy=static_proxy)
|
email, dev_token = mail_provider.create_mailbox(proxy="")
|
||||||
else:
|
else:
|
||||||
emitter.info("正在创建 Mail.tm 临时邮箱...", step="create_email")
|
emitter.info("正在创建 Mail.tm 临时邮箱...", step="create_email")
|
||||||
email, dev_token = get_email_and_token(
|
email, dev_token = get_email_and_token(
|
||||||
static_proxies,
|
None,
|
||||||
emitter,
|
emitter,
|
||||||
proxy_selector=mail_proxies_selector,
|
proxy_selector=None,
|
||||||
)
|
)
|
||||||
if not email or not dev_token:
|
if not email or not dev_token:
|
||||||
emitter.error("临时邮箱创建失败", step="create_email")
|
emitter.error("临时邮箱创建失败", step="create_email")
|
||||||
@@ -1487,25 +1487,25 @@ def run(
|
|||||||
code = mail_provider.wait_for_otp(
|
code = mail_provider.wait_for_otp(
|
||||||
dev_token,
|
dev_token,
|
||||||
email,
|
email,
|
||||||
proxy=static_proxy,
|
proxy="",
|
||||||
proxy_selector=mail_proxy_selector,
|
proxy_selector=None,
|
||||||
stop_event=stop_event,
|
stop_event=stop_event,
|
||||||
)
|
)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
code = mail_provider.wait_for_otp(
|
code = mail_provider.wait_for_otp(
|
||||||
dev_token,
|
dev_token,
|
||||||
email,
|
email,
|
||||||
proxy=static_proxy,
|
proxy="",
|
||||||
stop_event=stop_event,
|
stop_event=stop_event,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
code = get_oai_code(
|
code = get_oai_code(
|
||||||
dev_token,
|
dev_token,
|
||||||
email,
|
email,
|
||||||
static_proxies,
|
None,
|
||||||
emitter,
|
emitter,
|
||||||
stop_event,
|
stop_event,
|
||||||
proxy_selector=mail_proxies_selector,
|
proxy_selector=None,
|
||||||
)
|
)
|
||||||
if not code:
|
if not code:
|
||||||
return None
|
return None
|
||||||
@@ -1765,12 +1765,12 @@ def run(
|
|||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
_otp_code2 = mail_provider.wait_for_otp(
|
_otp_code2 = mail_provider.wait_for_otp(
|
||||||
dev_token, email, proxy=static_proxy,
|
dev_token, email, proxy="",
|
||||||
proxy_selector=mail_proxy_selector, stop_event=stop_event,
|
proxy_selector=None, stop_event=stop_event,
|
||||||
)
|
)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
_otp_code2 = mail_provider.wait_for_otp(
|
_otp_code2 = mail_provider.wait_for_otp(
|
||||||
dev_token, email, proxy=static_proxy, stop_event=stop_event,
|
dev_token, email, proxy="", stop_event=stop_event,
|
||||||
)
|
)
|
||||||
if not _otp_code2 or _otp_code2 in _tried_codes:
|
if not _otp_code2 or _otp_code2 in _tried_codes:
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|||||||
@@ -743,7 +743,6 @@ def upload_all_tokens_to_cpa(cfg: Optional[Dict[str, Any]] = None, skip_uploaded
|
|||||||
maintainer = get_pool_maintainer(config)
|
maintainer = get_pool_maintainer(config)
|
||||||
if not maintainer:
|
if not maintainer:
|
||||||
raise ValueError("请先配置 CPA 地址和 Token")
|
raise ValueError("请先配置 CPA 地址和 Token")
|
||||||
proxy = str(config.get("proxy") or "").strip()
|
|
||||||
results = []
|
results = []
|
||||||
for path in iter_token_files():
|
for path in iter_token_files():
|
||||||
try:
|
try:
|
||||||
@@ -751,7 +750,7 @@ def upload_all_tokens_to_cpa(cfg: Optional[Dict[str, Any]] = None, skip_uploaded
|
|||||||
if skip_uploaded and "cpa" in extract_uploaded_platforms(token_data):
|
if skip_uploaded and "cpa" in extract_uploaded_platforms(token_data):
|
||||||
results.append({"file": path.name, "email": token_data.get("email", path.name), "ok": True, "skipped": True})
|
results.append({"file": path.name, "email": token_data.get("email", path.name), "ok": True, "skipped": True})
|
||||||
continue
|
continue
|
||||||
ok = maintainer.upload_token(path.name, token_data, proxy=proxy)
|
ok = maintainer.upload_token(path.name, token_data, proxy="")
|
||||||
if ok:
|
if ok:
|
||||||
mark_token_uploaded_platform(path, "cpa")
|
mark_token_uploaded_platform(path, "cpa")
|
||||||
results.append({"file": path.name, "email": token_data.get("email", path.name), "ok": ok, "skipped": False})
|
results.append({"file": path.name, "email": token_data.get("email", path.name), "ok": ok, "skipped": False})
|
||||||
|
|||||||
Reference in New Issue
Block a user