From fc879c09ea033c5caac8c60de1af3d41167fa2ea Mon Sep 17 00:00:00 2001 From: Chaos Date: Tue, 14 Jul 2026 09:32:20 +0800 Subject: [PATCH] Generate natural English-style email local-parts with digit suffixes. Replace random alnum usernames with first/last name patterns ending in 2-4 digits across all email providers. --- grok_register_ttk.py | 96 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 92 insertions(+), 4 deletions(-) diff --git a/grok_register_ttk.py b/grok_register_ttk.py index 2a8c264..9e94809 100644 --- a/grok_register_ttk.py +++ b/grok_register_ttk.py @@ -991,8 +991,7 @@ def yyds_get_message_detail(message_id, token=None, api_key=None, jwt=None): def yyds_generate_username(length=10): - chars = string.ascii_lowercase + string.digits - return "".join(secrets.choice(chars) for _ in range(length)) + return generate_username(length) def yyds_pick_domain(api_key=None, jwt=None): @@ -1085,9 +1084,98 @@ def yyds_get_oai_code( raise Exception(f"YYDS 在 {timeout}s 内未收到验证码邮件") +# 常见英文名/姓/词根,拼出更像真人的邮箱 local-part +_FIRST_NAMES = ( + "james", "john", "robert", "michael", "david", "william", "richard", "joseph", + "thomas", "charles", "daniel", "matthew", "anthony", "mark", "steven", "paul", + "andrew", "joshua", "kevin", "brian", "george", "edward", "ronald", "timothy", + "jason", "jeffrey", "ryan", "jacob", "gary", "nicholas", "eric", "jonathan", + "stephen", "larry", "justin", "scott", "brandon", "benjamin", "samuel", "raymond", + "gregory", "frank", "alexander", "patrick", "jack", "dennis", "jerry", "tyler", + "aaron", "jose", "adam", "nathan", "henry", "douglas", "zachary", "peter", + "kyle", "noah", "ethan", "jeremy", "walter", "christian", "keith", "roger", + "mary", "patricia", "jennifer", "linda", "elizabeth", "barbara", "susan", "jessica", + "sarah", "karen", "lisa", "nancy", "betty", "margaret", "sandra", "ashley", + "kimberly", "emily", "donna", "michelle", "dorothy", "carol", "amanda", "melissa", + "deborah", "stephanie", "rebecca", "sharon", "laura", "cynthia", "kathleen", "amy", + "angela", "shirley", "anna", "brenda", "pamela", "emma", "nicole", "helen", + "samantha", "katherine", "christine", "debra", "rachel", "carolyn", "janet", "catherine", + "maria", "heather", "diane", "ruth", "julie", "olivia", "joyce", "virginia", + "victoria", "kelly", "lauren", "christina", "joan", "evelyn", "judith", "megan", + "cheryl", "andrea", "hannah", "jacqueline", "martha", "gloria", "teresa", "ann", + "sara", "madison", "frances", "kathryn", "janice", "jean", "abigail", "alice", + "judy", "sophia", "grace", "denise", "amber", "doris", "marilyn", "danielle", + "beverly", "isabella", "theresa", "diana", "natalie", "brittany", "charlotte", "marie", + "kayla", "alexis", "lori", +) +_LAST_NAMES = ( + "smith", "johnson", "williams", "brown", "jones", "garcia", "miller", "davis", + "rodriguez", "martinez", "hernandez", "lopez", "gonzalez", "wilson", "anderson", "thomas", + "taylor", "moore", "jackson", "martin", "lee", "perez", "thompson", "white", + "harris", "sanchez", "clark", "ramirez", "lewis", "robinson", "walker", "young", + "allen", "king", "wright", "scott", "torres", "nguyen", "hill", "flores", + "green", "adams", "nelson", "baker", "hall", "rivera", "campbell", "mitchell", + "carter", "roberts", "gomez", "phillips", "evans", "turner", "diaz", "parker", + "cruz", "edwards", "collins", "reyes", "stewart", "morris", "morales", "murphy", + "cook", "rogers", "gutierrez", "ortiz", "morgan", "cooper", "peterson", "bailey", + "reed", "kelly", "howard", "ramos", "kim", "cox", "ward", "richardson", + "watson", "brooks", "chavez", "wood", "james", "bennett", "gray", "mendoza", + "ruiz", "hughes", "price", "alvarez", "castillo", "sanders", "patel", "myers", + "long", "ross", "foster", "jimenez", +) +_NAME_SEPARATORS = ("", ".", "_") + + def generate_username(length=10): - chars = string.ascii_lowercase + string.digits - return "".join(secrets.choice(chars) for _ in range(length)) + """生成更像正常英文用户的邮箱名:姓名/词根 + 数字结尾。 + + length 仅作兼容参数(旧调用传 10),实际长度由名字与数字后缀决定,约 8–18。 + """ + first = secrets.choice(_FIRST_NAMES) + last = secrets.choice(_LAST_NAMES) + sep = secrets.choice(_NAME_SEPARATORS) + # 数字后缀:2–4 位更像真实用户(生日年份、学号尾号等) + digit_len = secrets.choice((2, 2, 3, 3, 3, 4)) + if digit_len == 2: + digits = f"{secrets.randbelow(90) + 10}" # 10-99 + elif digit_len == 3: + digits = f"{secrets.randbelow(900) + 100}" # 100-999 + else: + # 常见 19xx / 20xx 年份感,或纯 4 位 + if secrets.randbelow(100) < 45: + year = secrets.choice((19, 20)) + yy = secrets.randbelow(26) if year == 20 else secrets.randbelow(90) + 10 + digits = f"{year}{yy:02d}" + else: + digits = f"{secrets.randbelow(9000) + 1000}" + + style = secrets.randbelow(100) + if style < 40: + # firstlast + digits e.g. jameswilson87 + base = f"{first}{last}" + elif style < 65: + # first.sep.last + digits e.g. james.wilson87 / james_wilson42 + base = f"{first}{sep}{last}" if sep else f"{first}{last}" + elif style < 80: + # first + digits e.g. james87 + base = first + elif style < 92: + # first 首字母 + last + digits e.g. jwilson87 + base = f"{first[0]}{last}" + else: + # last + first 首字母 + digits e.g. wilsonj87 + base = f"{last}{first[0]}" + + local = f"{base}{digits}".lower() + # 邮箱 local 只保留 [a-z0-9._],去掉连续分隔符 + local = re.sub(r"[^a-z0-9._]", "", local) + local = re.sub(r"[._]{2,}", ".", local).strip("._") + if len(local) < 5: + local = f"{first}{digits}" + # 过长时截断名字部分,保留数字后缀 + if len(local) > 24: + local = f"{local[:-digit_len][: 24 - digit_len]}{digits}" + return local or f"user{digits}" def pick_domain(api_key=None):