chore: initial commit
This commit is contained in:
173
src/main.py
Normal file
173
src/main.py
Normal file
@@ -0,0 +1,173 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Entry point: ChatGPT Plus auto-registration + subscription, or Codex OAuth login."""
|
||||
import argparse
|
||||
import random
|
||||
import string
|
||||
import sys
|
||||
|
||||
from config import settings
|
||||
from vmail_client import MailClient
|
||||
from captcha_solver import CaptchaSolver
|
||||
from http_client import HTTPClient
|
||||
from chatgpt_register_http_reverse import ChatGPTRegisterHTTPReverse
|
||||
from chatgpt_payment import ChatGPTPayment
|
||||
from codex_oauth_http_flow import CodexOAuthHTTPFlow, DEFAULT_AUTHORIZE_URL
|
||||
|
||||
|
||||
def generate_password(length=16):
|
||||
chars = string.ascii_letters + string.digits + "!@#$%"
|
||||
while True:
|
||||
pwd = "".join(random.choice(chars) for _ in range(length))
|
||||
if (any(c.islower() for c in pwd) and any(c.isupper() for c in pwd)
|
||||
and any(c.isdigit() for c in pwd) and any(c in "!@#$%" for c in pwd)):
|
||||
return pwd
|
||||
|
||||
|
||||
def generate_name():
|
||||
first = random.choice(["John", "Jane", "Mike", "Sarah", "David", "Emma", "Chris", "Lisa"])
|
||||
last = random.choice(["Smith", "Johnson", "Brown", "Davis", "Wilson", "Moore", "Taylor", "Lee"])
|
||||
return f"{first} {last}"
|
||||
|
||||
|
||||
def cmd_register(args):
|
||||
"""Register a new ChatGPT account and optionally subscribe to Plus."""
|
||||
password = generate_password()
|
||||
name = generate_name()
|
||||
|
||||
print("Generated credentials:")
|
||||
print(f" Password: {password}")
|
||||
print(f" Name: {name}")
|
||||
|
||||
mail = MailClient()
|
||||
http = HTTPClient(proxy=settings.socks5_proxy)
|
||||
|
||||
try:
|
||||
print("\n=== ChatGPT Registration ===")
|
||||
register = ChatGPTRegisterHTTPReverse(http, mail)
|
||||
session = register.register(password, name)
|
||||
print("\n Registration complete!")
|
||||
print(f" Email: {session['email']}")
|
||||
print(f" Mailbox password: {session['mailbox_password']}")
|
||||
print(f" ChatGPT password: {password}")
|
||||
if session["access_token"]:
|
||||
print(f" Access Token: {session['access_token'][:50]}...")
|
||||
|
||||
if settings.card_number and session.get("access_token"):
|
||||
print("\n=== ChatGPT Plus Subscription ===")
|
||||
captcha = CaptchaSolver(settings.yescaptcha_api_key)
|
||||
payment = ChatGPTPayment(http, captcha)
|
||||
success = payment.subscribe_plus(
|
||||
access_token=session["access_token"],
|
||||
country=settings.country,
|
||||
currency=settings.currency,
|
||||
card_info={
|
||||
"number": settings.card_number,
|
||||
"exp_month": settings.card_exp_month,
|
||||
"exp_year": settings.card_exp_year,
|
||||
"cvc": settings.card_cvc,
|
||||
"billing_name": settings.billing_name or name,
|
||||
"billing_email": settings.billing_email or session["email"],
|
||||
"billing_address_line1": settings.billing_address_line1,
|
||||
"billing_address_city": settings.billing_address_city,
|
||||
"billing_address_state": settings.billing_address_state,
|
||||
"billing_address_postal_code": settings.billing_address_postal_code,
|
||||
},
|
||||
)
|
||||
if success:
|
||||
print("\n Plus subscription complete!")
|
||||
print(f" Email: {session['email']}")
|
||||
print(f" Mailbox password: {session['mailbox_password']}")
|
||||
print(f" ChatGPT password: {password}")
|
||||
else:
|
||||
print("\n No card info configured, skipping Plus subscription")
|
||||
except Exception as e:
|
||||
print(f"\n Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return 1
|
||||
finally:
|
||||
http.close()
|
||||
return 0
|
||||
|
||||
|
||||
def cmd_codex_login(args):
|
||||
"""Run Codex OAuth login and print the callback URL with authorization code."""
|
||||
email = args.email
|
||||
password = args.password
|
||||
if not email:
|
||||
email = input("Email: ").strip()
|
||||
if not password:
|
||||
import getpass
|
||||
password = getpass.getpass("Password: ")
|
||||
|
||||
authorize_url = args.authorize_url or DEFAULT_AUTHORIZE_URL
|
||||
|
||||
print(f"Starting Codex OAuth flow for {email}")
|
||||
flow = CodexOAuthHTTPFlow(
|
||||
authorize_url=authorize_url,
|
||||
email=email,
|
||||
password=password,
|
||||
otp=args.otp or "",
|
||||
workspace_id=args.workspace_id or "",
|
||||
)
|
||||
try:
|
||||
callback_url = flow.run()
|
||||
print("\n" + "=" * 60)
|
||||
print("[SUCCESS] callback_url:")
|
||||
print(callback_url)
|
||||
print("=" * 60)
|
||||
return 0
|
||||
except Exception as e:
|
||||
print(f"\n[ERROR] {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return 1
|
||||
finally:
|
||||
flow.close()
|
||||
|
||||
|
||||
def build_parser():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="ChatGPT Plus auto-registration + subscription, or Codex OAuth login",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
Commands:
|
||||
register Auto-register a new ChatGPT account and subscribe to Plus
|
||||
codex-login Run Codex CLI OAuth login and obtain the callback URL
|
||||
|
||||
Examples:
|
||||
python src/main.py register
|
||||
python src/main.py codex-login --email user@example.com --password mypass
|
||||
"""
|
||||
)
|
||||
sub = parser.add_subparsers(dest="command")
|
||||
|
||||
# register sub-command
|
||||
sub.add_parser("register", help="Register new ChatGPT account + optional Plus subscription")
|
||||
|
||||
# codex-login sub-command
|
||||
p_codex = sub.add_parser("codex-login", help="Codex CLI OAuth login (HTTP-only, no browser)")
|
||||
p_codex.add_argument("--email", default="", help="OpenAI account email")
|
||||
p_codex.add_argument("--password", default="", help="OpenAI account password")
|
||||
p_codex.add_argument("--otp", default="", help="Email OTP code (if already known)")
|
||||
p_codex.add_argument("--workspace-id", dest="workspace_id", default="", help="Workspace ID to select")
|
||||
p_codex.add_argument("--authorize-url", dest="authorize_url", default="", help="Custom authorize URL")
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
def main():
|
||||
parser = build_parser()
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.command == "register":
|
||||
return cmd_register(args)
|
||||
elif args.command == "codex-login":
|
||||
return cmd_codex_login(args)
|
||||
else:
|
||||
parser.print_help()
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user