bobocup commited on
Commit
45dc1fe
·
verified ·
1 Parent(s): a056700

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +65 -83
app.py CHANGED
@@ -1,17 +1,15 @@
1
- from fastapi import FastAPI, HTTPException
2
  from selenium import webdriver
3
- from selenium.webdriver.chrome.service import Service
4
  from selenium.webdriver.chrome.options import Options
5
  from selenium.webdriver.common.by import By
6
  from selenium.webdriver.support.ui import WebDriverWait
7
  from selenium.webdriver.support import expected_conditions as EC
 
8
  import time
9
  import random
10
  import string
11
- import re
12
- from pydantic import BaseModel
13
- from typing import Optional
14
  import logging
 
15
 
16
  # 配置日志
17
  logging.basicConfig(
@@ -20,51 +18,35 @@ logging.basicConfig(
20
  )
21
  logger = logging.getLogger(__name__)
22
 
23
- app = FastAPI()
24
-
25
- class EmailResponse(BaseModel):
26
- email: str
27
- verification_code: Optional[str] = None
28
- error: Optional[str] = None
29
-
30
  def setup_driver():
 
31
  chrome_options = Options()
32
  chrome_options.add_argument('--no-sandbox')
33
- chrome_options.add_argument('--headless')
34
  chrome_options.add_argument('--disable-dev-shm-usage')
35
  chrome_options.add_argument('--disable-gpu')
 
 
 
 
 
36
 
37
- # 明确指定 ChromeDriver 路径
38
- service = Service('/usr/local/bin/chromedriver')
39
-
40
- try:
41
- driver = webdriver.Chrome(service=service, options=chrome_options)
42
- return driver
43
- except Exception as e:
44
- logger.error(f"创建 Chrome driver 失败: {str(e)}")
45
- raise
46
-
47
- def generate_email():
48
- """生成随机邮箱地址"""
49
- random_prefix = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
50
- return f"{random_prefix}@youxiang.dev"
51
 
52
  def get_verification_code(driver, email, max_retries=10, delay=2):
 
 
 
53
  try:
54
- email_url = f'https://linshiyou.com/#/{email}'
55
-
56
- # 打开新标签页并访问邮箱
57
- driver.execute_script(f"window.open('{email_url}', '_blank')")
58
- driver.switch_to.window(driver.window_handles[-1])
59
- logger.info(f"已打开邮箱页面: {email}")
60
 
61
  for attempt in range(max_retries):
62
  try:
63
- # 刷新页面
64
  driver.refresh()
65
- time.sleep(2)
66
 
67
- # 获取邮件内容
68
  body_content = driver.find_element(By.CLASS_NAME, "body").get_attribute('outerHTML')
69
  logger.info(f"获取到邮件内容: {body_content}")
70
 
@@ -72,68 +54,68 @@ def get_verification_code(driver, email, max_retries=10, delay=2):
72
  match = re.search(r'\b\d{6}\b', body_content)
73
  if match:
74
  verification_code = match.group(0)
75
- logger.info(f"成功获取验证码: {verification_code}")
76
-
77
- # 关闭邮箱标签页
78
- driver.close()
79
- driver.switch_to.window(driver.window_handles[0])
80
-
81
  return verification_code
82
 
83
  except Exception as e:
84
- logger.error(f"第 {attempt + 1} 次尝试失败: {str(e)}")
85
- if attempt == max_retries - 1:
86
- raise
87
 
88
- time.sleep(delay)
89
  logger.info(f"等待验证码,重试第 {attempt + 1} 次")
90
-
91
- # 如果获取失败,确保回到主标签页
92
- try:
93
- driver.close()
94
- driver.switch_to.window(driver.window_handles[0])
95
- except:
96
- pass
97
 
98
- return None
99
-
100
  except Exception as e:
101
- logger.error(f"获取验证码时发生错误: {str(e)}")
102
- # 确保清理标签页
103
- try:
104
- driver.close()
105
- driver.switch_to.window(driver.window_handles[0])
106
- except:
107
- pass
108
- raise
109
-
110
- @app.get("/")
111
- def read_root():
112
- return {"message": "临时邮箱服务运行中"}
113
 
114
- @app.post("/generate-email")
115
- def create_email():
116
- email = generate_email()
117
- logger.info(f"生成新邮箱: {email}")
118
- return EmailResponse(email=email)
 
119
 
120
- @app.get("/get-verification-code/{email}")
121
- def get_code(email: str):
122
- driver = None
123
  try:
124
- logger.info(f"开始获取邮箱验证码: {email}")
125
  driver = setup_driver()
126
  code = get_verification_code(driver, email)
 
 
127
  if code:
128
- return EmailResponse(email=email, verification_code=code)
129
- raise HTTPException(status_code=404, detail="未找到验证码")
 
 
 
 
130
  except Exception as e:
131
- logger.error(f"获取验证码失败: {str(e)}")
132
- raise HTTPException(status_code=500, detail=str(e))
133
  finally:
134
- if driver:
135
  driver.quit()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
 
137
  if __name__ == "__main__":
138
- import uvicorn
139
- uvicorn.run(app, host="0.0.0.0", port=7860)
 
1
+ import gradio as gr
2
  from selenium import webdriver
 
3
  from selenium.webdriver.chrome.options import Options
4
  from selenium.webdriver.common.by import By
5
  from selenium.webdriver.support.ui import WebDriverWait
6
  from selenium.webdriver.support import expected_conditions as EC
7
+ from selenium.common.exceptions import TimeoutException
8
  import time
9
  import random
10
  import string
 
 
 
11
  import logging
12
+ import re
13
 
14
  # 配置日志
15
  logging.basicConfig(
 
18
  )
19
  logger = logging.getLogger(__name__)
20
 
 
 
 
 
 
 
 
21
  def setup_driver():
22
+ """设置 Chrome 驱动"""
23
  chrome_options = Options()
24
  chrome_options.add_argument('--no-sandbox')
 
25
  chrome_options.add_argument('--disable-dev-shm-usage')
26
  chrome_options.add_argument('--disable-gpu')
27
+ chrome_options.add_argument('--disable-software-rasterizer')
28
+ chrome_options.add_argument('--headless') # 无头模式
29
+ chrome_options.add_argument('--disable-blink-features=AutomationControlled')
30
+ chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
31
+ chrome_options.add_experimental_option('useAutomationExtension', False)
32
 
33
+ driver = webdriver.Chrome(options=chrome_options)
34
+ return driver
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
  def get_verification_code(driver, email, max_retries=10, delay=2):
37
+ """获取验证码"""
38
+ email_url = f'https://linshiyou.com/#/{email}'
39
+
40
  try:
41
+ driver.get(email_url)
 
 
 
 
 
42
 
43
  for attempt in range(max_retries):
44
  try:
45
+ # 刷新页面获取最新邮件
46
  driver.refresh()
47
+ time.sleep(delay)
48
 
49
+ # 尝试获取邮件内容
50
  body_content = driver.find_element(By.CLASS_NAME, "body").get_attribute('outerHTML')
51
  logger.info(f"获取到邮件内容: {body_content}")
52
 
 
54
  match = re.search(r'\b\d{6}\b', body_content)
55
  if match:
56
  verification_code = match.group(0)
57
+ logger.info(f"获取到验证码: {verification_code}")
 
 
 
 
 
58
  return verification_code
59
 
60
  except Exception as e:
61
+ logger.error(f"第 {attempt + 1} 次获取验证码失败: {str(e)}")
 
 
62
 
 
63
  logger.info(f"等待验证码,重试第 {attempt + 1} 次")
64
+ time.sleep(delay)
 
 
 
 
 
 
65
 
 
 
66
  except Exception as e:
67
+ logger.error(f"打开邮箱页面失败: {str(e)}")
68
+
69
+ return None
 
 
 
 
 
 
 
 
 
70
 
71
+ def generate_random_email():
72
+ """生成随机邮箱地址"""
73
+ random_prefix = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
74
+ email = f"{random_prefix}@youxiang.dev"
75
+ logger.info(f"生成随机邮箱: {email}")
76
+ return {"email": email}
77
 
78
+ def get_email_code(email: str):
79
+ """获取指定邮箱的验证码"""
80
+ logger.info(f"开始获取邮箱验证码: {email}")
81
  try:
 
82
  driver = setup_driver()
83
  code = get_verification_code(driver, email)
84
+ driver.quit()
85
+
86
  if code:
87
+ logger.info(f"成功获取验证码: {code}")
88
+ return {"code": code}
89
+ else:
90
+ logger.error("未能获取验证码")
91
+ return {"error": "未能获取验证码"}
92
+
93
  except Exception as e:
94
+ logger.error(f"获取验证码过程出错: {str(e)}")
95
+ return {"error": str(e)}
96
  finally:
97
+ try:
98
  driver.quit()
99
+ except:
100
+ pass
101
+
102
+ # Gradio 接口
103
+ demo = gr.Interface(
104
+ [generate_random_email, get_email_code],
105
+ [
106
+ None, # generate_random_email 不需要输入
107
+ gr.Textbox(label="邮箱地址") # get_email_code 需要邮箱输入
108
+ ],
109
+ [
110
+ gr.JSON(label="生成的邮箱"), # 返回 JSON 格式的邮箱
111
+ gr.JSON(label="验证码结果") # 返回 JSON 格式的验证码
112
+ ],
113
+ title="邮箱验证码服务",
114
+ description="提供随机邮箱生成和验证码获取服务"
115
+ )
116
+
117
+ # 启用队列处理请求
118
+ demo.queue()
119
 
120
  if __name__ == "__main__":
121
+ demo.launch(server_name="0.0.0.0", server_port=7860)