|
|
import gradio as gr |
|
|
from selenium import webdriver |
|
|
from selenium.webdriver.chrome.options import Options |
|
|
from selenium.webdriver.common.by import By |
|
|
from selenium.webdriver.support.ui import WebDriverWait |
|
|
from selenium.webdriver.support import expected_conditions as EC |
|
|
from selenium.common.exceptions import TimeoutException |
|
|
import time |
|
|
import random |
|
|
import string |
|
|
import logging |
|
|
import re |
|
|
|
|
|
|
|
|
logging.basicConfig( |
|
|
level=logging.INFO, |
|
|
format='%(asctime)s - %(levelname)s - %(message)s' |
|
|
) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
def setup_driver(): |
|
|
"""设置 Chrome 驱动""" |
|
|
chrome_options = Options() |
|
|
chrome_options.add_argument('--no-sandbox') |
|
|
chrome_options.add_argument('--disable-dev-shm-usage') |
|
|
chrome_options.add_argument('--disable-gpu') |
|
|
chrome_options.add_argument('--disable-software-rasterizer') |
|
|
chrome_options.add_argument('--headless') |
|
|
chrome_options.add_argument('--disable-blink-features=AutomationControlled') |
|
|
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) |
|
|
chrome_options.add_experimental_option('useAutomationExtension', False) |
|
|
|
|
|
driver = webdriver.Chrome(options=chrome_options) |
|
|
return driver |
|
|
|
|
|
def get_verification_code(driver, email, max_retries=10, delay=2): |
|
|
"""获取验证码""" |
|
|
email_url = f'https://linshiyou.com/#/{email}' |
|
|
|
|
|
try: |
|
|
driver.get(email_url) |
|
|
|
|
|
for attempt in range(max_retries): |
|
|
try: |
|
|
driver.refresh() |
|
|
time.sleep(delay) |
|
|
|
|
|
body_content = driver.find_element(By.CLASS_NAME, "body").get_attribute('outerHTML') |
|
|
logger.info(f"获取到邮件内容: {body_content}") |
|
|
|
|
|
match = re.search(r'\b\d{6}\b', body_content) |
|
|
if match: |
|
|
verification_code = match.group(0) |
|
|
logger.info(f"获取到验证码: {verification_code}") |
|
|
return verification_code |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"第 {attempt + 1} 次获取验证码失败: {str(e)}") |
|
|
|
|
|
logger.info(f"等待验证码,重试第 {attempt + 1} 次") |
|
|
time.sleep(delay) |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"打开邮箱页面失败: {str(e)}") |
|
|
|
|
|
return None |
|
|
|
|
|
def generate_random_email(): |
|
|
"""生成随机邮箱地址""" |
|
|
try: |
|
|
random_prefix = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) |
|
|
email = f"{random_prefix}@youxiang.dev" |
|
|
logger.info(f"生成随机邮箱: {email}") |
|
|
return {"status": "success", "email": email} |
|
|
except Exception as e: |
|
|
logger.error(f"生成邮箱失败: {str(e)}") |
|
|
return {"status": "error", "message": str(e)} |
|
|
|
|
|
def get_email_code(email: str): |
|
|
"""获取指定邮箱的验证码""" |
|
|
if not email: |
|
|
return {"status": "error", "message": "邮箱地址不能为空"} |
|
|
|
|
|
logger.info(f"开始获取邮箱验证码: {email}") |
|
|
driver = None |
|
|
|
|
|
try: |
|
|
driver = setup_driver() |
|
|
code = get_verification_code(driver, email) |
|
|
|
|
|
if code: |
|
|
logger.info(f"成功获取验证码: {code}") |
|
|
return {"status": "success", "code": code} |
|
|
else: |
|
|
logger.error("未能获取验证码") |
|
|
return {"status": "error", "message": "未能获取验证码"} |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"获取验证码过程出错: {str(e)}") |
|
|
return {"status": "error", "message": str(e)} |
|
|
finally: |
|
|
if driver: |
|
|
try: |
|
|
driver.quit() |
|
|
except: |
|
|
pass |
|
|
|
|
|
|
|
|
with gr.Blocks(title="邮箱验证码服务") as demo: |
|
|
gr.Markdown(""" |
|
|
# 邮箱验证码服务 |
|
|
|
|
|
提供两个主要功能: |
|
|
1. 生成随机临时邮箱 |
|
|
2. 获取邮箱验证码 |
|
|
""") |
|
|
|
|
|
with gr.Tab("生成随机邮箱"): |
|
|
with gr.Row(): |
|
|
email_btn = gr.Button("生成邮箱", variant="primary") |
|
|
email_output = gr.JSON(label="结果") |
|
|
|
|
|
with gr.Tab("获取验证码"): |
|
|
with gr.Row(): |
|
|
email_input = gr.Textbox( |
|
|
label="邮箱地址", |
|
|
placeholder="请输入要获取验证码的邮箱地址", |
|
|
info="支持 @youxiang.dev 域名的邮箱" |
|
|
) |
|
|
with gr.Row(): |
|
|
code_btn = gr.Button("获取验证码", variant="primary") |
|
|
code_output = gr.JSON(label="结果") |
|
|
|
|
|
|
|
|
email_btn.click( |
|
|
fn=generate_random_email, |
|
|
inputs=[], |
|
|
outputs=email_output, |
|
|
api_name="generate_email" |
|
|
) |
|
|
|
|
|
code_btn.click( |
|
|
fn=get_email_code, |
|
|
inputs=email_input, |
|
|
outputs=code_output, |
|
|
api_name="get_code" |
|
|
) |
|
|
|
|
|
|
|
|
demo.queue() |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch(server_name="0.0.0.0", server_port=7860) |