Hana Celeste commited on
Commit
3d564fc
·
verified ·
1 Parent(s): b4a150e

Update app/discord_logic.py

Browse files
Files changed (1) hide show
  1. app/discord_logic.py +33 -19
app/discord_logic.py CHANGED
@@ -1,22 +1,31 @@
1
  import httpx
2
  import os
3
- import asyncio
 
4
 
5
  class DiscordApp:
6
  def __init__(self):
7
  self.token = os.getenv("DISCORD_TOKEN")
8
- self.base_url = "https://discord.com/api/v10"
9
  self.client = None
10
 
 
 
 
 
 
 
 
 
 
 
 
11
  async def start(self):
12
- # Khởi tạo HTTPX Client với cấu hình bỏ qua lỗi DNS tạm thời
13
  if not self.client:
14
  self.client = httpx.AsyncClient(
15
- timeout=15.0,
16
- follow_redirects=True,
17
- verify=False # Tạm thời bỏ qua xác thực SSL nếu mạng chập chờn
18
  )
19
- print("✅ [Discord] HTTPX Client started.")
20
 
21
  async def stop(self):
22
  if self.client:
@@ -24,22 +33,29 @@ class DiscordApp:
24
 
25
  async def get_user_info(self, uid: str):
26
  if not self.token:
27
- return {"status": "error", "message": "Missing DISCORD_TOKEN"}
28
 
29
- if not self.client:
30
- await self.start()
 
 
 
 
 
 
 
 
 
 
31
 
32
- headers = {"Authorization": f"Bot {self.token}"}
33
-
34
  try:
35
- # Gọi trực tiếp API
36
- resp = await self.client.get(f"{self.base_url}/users/{uid}", headers=headers)
37
-
38
  if resp.status_code == 200:
39
  data = resp.json()
40
  user_id = data.get("id")
41
  avatar_hash = data.get("avatar")
42
 
 
43
  if avatar_hash:
44
  fmt = "gif" if avatar_hash.startswith("a_") else "png"
45
  avatar_url = f"https://cdn.discordapp.com/avatars/{user_id}/{avatar_hash}.{fmt}?size=1024"
@@ -55,8 +71,6 @@ class DiscordApp:
55
  "avatar": avatar_url,
56
  }
57
  }
58
- return {"status": "error", "message": f"Discord status: {resp.status_code}"}
59
-
60
  except Exception as e:
61
- # Nếu vẫn lỗi DNS, thử dùng link dự phòng (Alternative API)
62
- return {"status": "error", "message": f"Mạng lỗi: {str(e)}"}
 
1
  import httpx
2
  import os
3
+ import dns.resolver
4
+ import socket
5
 
6
  class DiscordApp:
7
  def __init__(self):
8
  self.token = os.getenv("DISCORD_TOKEN")
 
9
  self.client = None
10
 
11
+ def resolve_dns(self, hostname):
12
+ """Tự tìm IP của hostname nếu hệ thống bị lỗi DNS"""
13
+ try:
14
+ # Thử dùng DNS của Google để tìm IP
15
+ resolver = dns.resolver.Resolver()
16
+ resolver.nameservers = ['8.8.8.8', '1.1.1.1']
17
+ answers = resolver.resolve(hostname, 'A')
18
+ return str(answers[0])
19
+ except Exception:
20
+ return None
21
+
22
  async def start(self):
 
23
  if not self.client:
24
  self.client = httpx.AsyncClient(
25
+ timeout=20.0,
26
+ verify=False # Bỏ qua SSL check để tránh lỗi mismatch khi gọi bằng IP
 
27
  )
28
+ print("✅ [Discord] HTTPX Client started with DNS Fix.")
29
 
30
  async def stop(self):
31
  if self.client:
 
33
 
34
  async def get_user_info(self, uid: str):
35
  if not self.token:
36
+ return {"status": "error", "message": "Missing TOKEN"}
37
 
38
+ # Thử lấy IP của discord.com
39
+ ip = self.resolve_dns("discord.com")
40
+ if ip:
41
+ url = f"https://{ip}/api/v10/users/{uid}"
42
+ headers = {
43
+ "Authorization": f"Bot {self.token}",
44
+ "Host": "discord.com" # Quan trọng: Phải giữ Host header là discord.com
45
+ }
46
+ else:
47
+ # Nếu không tìm được IP thì dùng URL mặc định
48
+ url = f"https://discord.com/api/v10/users/{uid}"
49
+ headers = {"Authorization": f"Bot {self.token}"}
50
 
 
 
51
  try:
52
+ resp = await self.client.get(url, headers=headers)
 
 
53
  if resp.status_code == 200:
54
  data = resp.json()
55
  user_id = data.get("id")
56
  avatar_hash = data.get("avatar")
57
 
58
+ # Link avatar dùng CDN (thường CDN ít bị lỗi DNS hơn)
59
  if avatar_hash:
60
  fmt = "gif" if avatar_hash.startswith("a_") else "png"
61
  avatar_url = f"https://cdn.discordapp.com/avatars/{user_id}/{avatar_hash}.{fmt}?size=1024"
 
71
  "avatar": avatar_url,
72
  }
73
  }
74
+ return {"status": "error", "message": f"Discord trả về lỗi: {resp.status_code}"}
 
75
  except Exception as e:
76
+ return {"status": "error", "message": f"Lỗi kết nối cuối cùng: {str(e)}"}