Hana Celeste commited on
Commit
66f26de
·
verified ·
1 Parent(s): e348ea9

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +49 -42
main.py CHANGED
@@ -18,19 +18,47 @@ async def get_page(uid: str, fast_mode=False):
18
  page = await context.new_page()
19
 
20
  if fast_mode:
21
- await page.route("**/*", lambda route: route.abort() if route.request.resource_type in ["image", "media", "font", "stylesheet"] else route.continue_())
 
22
 
23
  url = f"https://enka.network/u/{uid}/"
24
- await page.goto(url, wait_until="domcontentloaded", timeout=60000)
25
  return browser, page
26
 
27
- # --- ENDPOINTS ---
28
-
29
  @app.get("/info")
30
  async def info(uid: str):
31
  start_time = time.time()
32
  browser, page = await get_page(uid, fast_mode=True)
33
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  data = await page.evaluate("""
35
  () => {
36
  const name = document.querySelector('.details h1')?.innerText;
@@ -70,49 +98,24 @@ async def info(uid: str):
70
  return { name: charName, level, icon: "https://enka.network" + icon_path };
71
  }).filter(i => i !== null);
72
 
73
- return { player: { name, ar, wl, signature, avatar: avatar_img ? "https://enka.network" + avatar_img : null, stats }, characters };
74
- }
75
- """)
76
- await browser.close()
77
- return {"execution_time": f"{round(time.time() - start_time, 2)}s", "uid": uid, **data}
78
- except Exception as e:
79
- await browser.close()
80
- return {"error": str(e)}
81
-
82
- @app.get("/namecard")
83
- async def namecard(uid: str):
84
- """Lấy link ảnh Danh Thiếp hiện tại"""
85
- start_time = time.time()
86
- # Fast mode = False vì cần click và chờ hiện element
87
- browser, page = await get_page(uid, fast_mode=False)
88
- try:
89
- # Click nút Danh Thiếp
90
- btn_selector = 'button[data-icon="cards"]'
91
- await page.wait_for_selector(btn_selector, timeout=15000)
92
- await page.click(btn_selector)
93
-
94
- # Đợi modal Danh Thiếp hiện ra và lấy background-image
95
- img_selector = '.Loda .bg'
96
- await page.wait_for_selector(img_selector, timeout=15000)
97
-
98
- namecard_url = await page.evaluate("""
99
- () => {
100
- const el = document.querySelector('.Loda .bg');
101
- if (!el) return null;
102
- const style = el.getAttribute('style');
103
- const match = style.match(/url\\(["']?(.*?)["']?\\)/);
104
- return match ? "https://enka.network" + match[1] : null;
105
  }
106
  """)
107
 
108
  await browser.close()
 
 
 
109
  return {
110
  "execution_time": f"{round(time.time() - start_time, 2)}s",
111
  "uid": uid,
112
- "namecard_url": namecard_url
113
  }
114
  except Exception as e:
115
- await browser.close()
116
  return {"error": str(e)}
117
 
118
  @app.get("/gen")
@@ -126,7 +129,7 @@ async def generate(uid: str, char: str = None):
126
  try:
127
  await page.wait_for_selector(char_selector, timeout=5000)
128
  await page.click(char_selector)
129
- await asyncio.sleep(1.5)
130
  except: pass
131
 
132
  await page.click('button[data-icon="image"]')
@@ -146,11 +149,15 @@ async def generate(uid: str, char: str = None):
146
  """)
147
  await browser.close()
148
  res = requests.post("https://api.imgbb.com/1/upload", data={"key": IMGBB_API_KEY, "image": img_base64})
149
- return {"execution_time": f"{round(time.time() - start_time, 2)}s", "uid": uid, "card_url": res.json().get('data', {}).get('url')}
 
 
 
 
150
  except Exception as e:
151
- await browser.close()
152
  return {"error": str(e)}
153
 
154
  @app.get("/")
155
  def home():
156
- return {"status": "Enka API Ultimate Live", "endpoints": ["/info", "/gen", "/namecard"]}
 
18
  page = await context.new_page()
19
 
20
  if fast_mode:
21
+ # Chặn bớt tài nguyên nhưng vẫn để lại Images cần link Namecard và Stats icon
22
+ await page.route("**/*", lambda route: route.abort() if route.request.resource_type in ["media", "font"] else route.continue_())
23
 
24
  url = f"https://enka.network/u/{uid}/"
25
+ await page.goto(url, wait_until="networkidle", timeout=60000)
26
  return browser, page
27
 
 
 
28
  @app.get("/info")
29
  async def info(uid: str):
30
  start_time = time.time()
31
  browser, page = await get_page(uid, fast_mode=True)
32
  try:
33
+ # BƯỚC MỚI: Click lấy Namecard
34
+ namecard_url = None
35
+ try:
36
+ # Tìm nút Danh Thiếp qua data-icon="cards"
37
+ card_btn = 'button[data-icon="cards"]'
38
+ await page.wait_for_selector(card_btn, timeout=5000)
39
+ await page.click(card_btn)
40
+
41
+ # Đợi panel Loda hiện lên
42
+ namecard_selector = '.Loda .bg'
43
+ await page.wait_for_selector(namecard_selector, timeout=5000)
44
+
45
+ # Lấy link ảnh từ background-image
46
+ namecard_url = await page.evaluate("""
47
+ () => {
48
+ const bgDiv = document.querySelector('.Loda .bg');
49
+ if (!bgDiv) return null;
50
+ const style = bgDiv.style.backgroundImage;
51
+ const match = style.match(/url\\(["']?(.*?)["']?\\)/);
52
+ return match ? "https://enka.network" + match[1] : null;
53
+ }
54
+ """)
55
+
56
+ # Đóng panel để tránh block UI (không bắt buộc nhưng nên làm)
57
+ await page.keyboard.press("Escape")
58
+ except Exception as e:
59
+ print(f"Lỗi lấy Namecard: {e}")
60
+
61
+ # LẤY CÁC THÔNG TIN CÒN LẠI
62
  data = await page.evaluate("""
63
  () => {
64
  const name = document.querySelector('.details h1')?.innerText;
 
98
  return { name: charName, level, icon: "https://enka.network" + icon_path };
99
  }).filter(i => i !== null);
100
 
101
+ return {
102
+ player: { name, ar, wl, signature, avatar: avatar_img ? "https://enka.network" + avatar_img : null, stats },
103
+ characters: characters
104
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  }
106
  """)
107
 
108
  await browser.close()
109
+ # Gộp Namecard vào JSON kết quả
110
+ data['player']['namecard'] = namecard_url
111
+
112
  return {
113
  "execution_time": f"{round(time.time() - start_time, 2)}s",
114
  "uid": uid,
115
+ **data
116
  }
117
  except Exception as e:
118
+ if 'browser' in locals(): await browser.close()
119
  return {"error": str(e)}
120
 
121
  @app.get("/gen")
 
129
  try:
130
  await page.wait_for_selector(char_selector, timeout=5000)
131
  await page.click(char_selector)
132
+ await asyncio.sleep(1)
133
  except: pass
134
 
135
  await page.click('button[data-icon="image"]')
 
149
  """)
150
  await browser.close()
151
  res = requests.post("https://api.imgbb.com/1/upload", data={"key": IMGBB_API_KEY, "image": img_base64})
152
+ return {
153
+ "execution_time": f"{round(time.time() - start_time, 2)}s",
154
+ "uid": uid,
155
+ "card_url": res.json().get('data', {}).get('url')
156
+ }
157
  except Exception as e:
158
+ if 'browser' in locals(): await browser.close()
159
  return {"error": str(e)}
160
 
161
  @app.get("/")
162
  def home():
163
+ return {"status": "Enka API Pro Max is Live"}