from time import time import httpx import asyncio from faker import Faker import random import string import base64 import json from datetime import datetime from rich.console import Console from rich.panel import Panel from rich.table import Table from rich import print as rprint from typing import List from auth.register import Registration from config.api_keys import APIKeyManager from protos import request_pb2, response_pb2 console = Console() async def generate_firebase_client(): # Create heartbeat data with current date heartbeat_data = { "version": 2, "heartbeats": [{ "agent": "fire-core/0.10.2 fire-core-esm2017/0.10.2 fire-js/ fire-auth/1.7.2 fire-auth-esm2017/1.7.2 fire-js-all-app/10.11.1", "dates": [datetime.now().strftime("%Y-%m-%d")] }] } return base64.b64encode(json.dumps(heartbeat_data).encode()).decode() async def generate_account(): faker = Faker() # Generate random email and password email = faker.email(safe=True, domain='outlook.com') password = ''.join(random.choices(string.ascii_letters + string.digits, k=random.randint(9, 15))) firebase_client = await generate_firebase_client() async with httpx.AsyncClient() as client: # Step 1: Firebase Sign Up signup_response = await client.post( 'https://identitytoolkit.googleapis.com/v1/accounts:signUp', params={'key': 'AIzaSyDsOl-1XpT5err0Tcnx8FFod1H8gVGIycY'}, headers={ 'X-Firebase-Client': firebase_client, 'Content-Type': 'application/json', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36' }, json={ 'returnSecureToken': True, 'email': email, 'password': password, 'clientType': 'CLIENT_TYPE_WEB' } ) id_token = signup_response.json()['idToken'] # Step 2: Get Current User current_user = request_pb2.CurrentUser() current_user.jwt = id_token current_user.f1 = 1 current_user.f2 = 1 current_user_response = await client.post( 'https://web-backend.codeium.com/exa.seat_management_pb.SeatManagementService/GetCurrentUser', headers={ 'Content-Type': 'application/proto', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36', 'Accept-Language': 'en', 'Sec-Ch-Ua-Platform': '"Windows"', 'Sec-Ch-Ua': '"Not?A_Brand";v="99", "Chromium";v="130"', 'Sec-Ch-Ua-Mobile': '?0', 'Connect-Protocol-Version': '1', 'Accept': '*/*', 'Origin': 'https://codeium.com', 'Sec-Fetch-Site': 'same-site', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'Referer': 'https://codeium.com/', "X-Auth-Token": id_token, 'Accept-Encoding': 'gzip, deflate, br', }, content=current_user.SerializeToString() ) assert current_user_response.status_code == 200 response_proto = response_pb2.CurrentUserResponse() response_proto.ParseFromString(current_user_response.content) console.print(Panel(f"[bold green]User Created[/bold green]\nName: {response_proto.user.name}\nStatus: {response_proto.status.status}")) # Step 3: Get Preapproval For User get_preapproval_for_user = request_pb2.GetPreapprovalForUser() get_preapproval_for_user.jwt = id_token get_preapproval_for_user_response = await client.post( 'https://web-backend.codeium.com/exa.seat_management_pb.SeatManagementService/GetPreapprovalForUser', headers={ 'Content-Type': 'application/proto', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36', 'Accept-Language': 'en', 'Sec-Ch-Ua-Platform': '"Windows"', 'Sec-Ch-Ua': '"Not?A_Brand";v="99", "Chromium";v="130"', 'Sec-Ch-Ua-Mobile': '?0', 'Connect-Protocol-Version': '1', 'Accept': '*/*', 'Origin': 'https://codeium.com', 'Sec-Fetch-Site': 'same-site', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'Referer': 'https://codeium.com/', 'Accept-Encoding': 'gzip, deflate, br', "X-Auth-Token": id_token, 'Priority': 'u=1, i' }, content=get_preapproval_for_user.SerializeToString() ) assert get_preapproval_for_user_response.status_code == 200 # Step 4: Update Name using Protobuf change_name = request_pb2.ChangeName() change_name.jwt = id_token change_name.name = faker.name() name_response = await client.post( 'https://web-backend.codeium.com/exa.seat_management_pb.SeatManagementService/UpdateName', headers={ 'Content-Type': 'application/proto', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36', 'Accept-Language': 'en', 'Sec-Ch-Ua-Platform': '"Windows"', 'Sec-Ch-Ua': '"Not?A_Brand";v="99", "Chromium";v="130"', 'Sec-Ch-Ua-Mobile': '?0', 'Connect-Protocol-Version': '1', 'Accept': '*/*', 'Origin': 'https://codeium.com', 'Sec-Fetch-Site': 'same-site', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'Referer': 'https://codeium.com/', 'Accept-Encoding': 'gzip, deflate, br', 'Priority': 'u=1, i' }, content=change_name.SerializeToString() ) return { 'email': email, 'password': password, 'id_token': id_token, 'name_response': name_response.status_code } async def generate_multiple_accounts(num_accounts: int): tasks = [] for _ in range(num_accounts): tasks.append(generate_account()) results = await asyncio.gather(*tasks) return results async def main(): # 获取命令行参数,默认创建3个账号 num_accounts = 3 with console.status(f"[bold green]Generating {num_accounts} accounts...", spinner="dots"): results = await generate_multiple_accounts(num_accounts) for result in results: id_token = result['id_token'] email = result['email'] name_response = result['name_response'] if name_response != 200: console.print(f"[bold red]Failed to update name. Status code: {name_response}[/bold red]") continue key_manager = APIKeyManager() with console.status("[bold green]Registering user...", spinner="dots"): api_key = await Registration.register_user(id_token.strip()) # Add GetCurrentUser call after registration async with httpx.AsyncClient() as client: current_user = request_pb2.CurrentUser() current_user.jwt = id_token current_user.f1 = 1 current_user.f2 = 1 current_user_response = await client.post( 'https://web-backend.codeium.com/exa.seat_management_pb.SeatManagementService/GetCurrentUser', headers={ 'Content-Type': 'application/proto', 'X-Auth-Token': id_token, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36', 'Accept-Language': 'en', 'Sec-Ch-Ua-Platform': '"Windows"', 'Sec-Ch-Ua': '"Not?A_Brand";v="99", "Chromium";v="130"', 'Sec-Ch-Ua-Mobile': '?0', 'Connect-Protocol-Version': '1', 'Accept': '*/*', 'Origin': 'https://codeium.com', 'Sec-Fetch-Site': 'same-site', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'Referer': 'https://codeium.com/', 'Accept-Encoding': 'gzip, deflate, br', }, content=current_user.SerializeToString() ) response_proto = response_pb2.CurrentUserResponse() response_proto.ParseFromString(current_user_response.content) key_manager.add_key(api_key) # Update table to include password table = Table(title=f"Registration Results - {email}") table.add_column("Field", style="cyan") table.add_column("Value", style="green") table.add_row("Email", email) table.add_row("Password", result['password']) table.add_row("API Key", api_key) table.add_row("Status", str(response_proto.status.status)) console.print(table) console.print("\n") # Add a blank line between tables if __name__ == "__main__": asyncio.run(main())