Spaces:
Running
Running
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
def fetch_all(limit=50):
|
2 |
+
"""
|
3 |
+
Vercel API v10/projects๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค.
|
4 |
+
"""
|
5 |
+
try:
|
6 |
+
# API ํ๋ผ๋ฏธํฐ ์ค์
|
7 |
+
params = {"limit": limit}
|
8 |
+
if TEAM:
|
9 |
+
params["teamId"] = TEAM
|
10 |
+
|
11 |
+
print(f"Vercel API ํธ์ถ (ํ๋ก์ ํธ): {API}/v10/projects (params={params})")
|
12 |
+
|
13 |
+
resp = requests.get(f"{API}/v10/projects",
|
14 |
+
headers=HEAD, params=params, timeout=30)
|
15 |
+
|
16 |
+
print(f"API ์๋ต ์ํ ์ฝ๋: {resp.status_code}")
|
17 |
+
if resp.status_code != 200:
|
18 |
+
print(f"API ์๋ต ์ค๋ฅ: {resp.status_code}, {resp.text[:200] if hasattr(resp, 'text') else ''}")
|
19 |
+
return []
|
20 |
+
|
21 |
+
data = resp.json()
|
22 |
+
|
23 |
+
if "projects" not in data:
|
24 |
+
print(f"API ์๋ต์ projects ํ๋๊ฐ ์์ต๋๋ค: {str(data)[:200]}...")
|
25 |
+
return []
|
26 |
+
|
27 |
+
projects = data.get("projects", [])
|
28 |
+
print(f"{len(projects)}๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์ฐพ์์ต๋๋ค")
|
29 |
+
|
30 |
+
# ๊ฐ ํ๋ก์ ํธ์ ์ต์ ๋ฐฐํฌ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
|
31 |
+
games = []
|
32 |
+
for project in projects:
|
33 |
+
project_id = project.get("id")
|
34 |
+
project_name = project.get("name", "(์ ๋ชฉ ์์)")
|
35 |
+
|
36 |
+
# ํ๋ก์ ํธ๋ณ ์ต์ ๋ฐฐํฌ ๊ฐ์ ธ์ค๊ธฐ (projectId ํํฐ ์ถ๊ฐ)
|
37 |
+
try:
|
38 |
+
deploy_params = {
|
39 |
+
"limit": 1,
|
40 |
+
"projectId": project_id, # ์ค์: ํด๋น ํ๋ก์ ํธ์ ๋ฐฐํฌ๋ง ํํฐ๋ง
|
41 |
+
"state": "READY"
|
42 |
+
}
|
43 |
+
|
44 |
+
if TEAM:
|
45 |
+
deploy_params["teamId"] = TEAM
|
46 |
+
|
47 |
+
print(f"ํ๋ก์ ํธ {project_id} ({project_name}) ๋ฐฐํฌ ์กฐํ ์ค...")
|
48 |
+
|
49 |
+
deploy_resp = requests.get(
|
50 |
+
f"{API}/v6/deployments",
|
51 |
+
headers=HEAD,
|
52 |
+
params=deploy_params,
|
53 |
+
timeout=30
|
54 |
+
)
|
55 |
+
|
56 |
+
if deploy_resp.status_code == 200:
|
57 |
+
deploy_data = deploy_resp.json()
|
58 |
+
deployments = deploy_data.get("deployments", [])
|
59 |
+
|
60 |
+
if deployments:
|
61 |
+
deployment = deployments[0]
|
62 |
+
url = deployment.get("url", "")
|
63 |
+
if url:
|
64 |
+
games.append({
|
65 |
+
"title": project_name,
|
66 |
+
"url": f"https://{url}",
|
67 |
+
"ts": int(deployment.get("created", time.time() * 1000) / 1000),
|
68 |
+
"projectId": project_id
|
69 |
+
})
|
70 |
+
print(f"ํ๋ก์ ํธ {project_name}์ ๋ฐฐํฌ URL: https://{url}")
|
71 |
+
else:
|
72 |
+
print(f"ํ๋ก์ ํธ {project_name}์ ๋ฐฐํฌ๋ ๋ฒ์ ์ด ์์ต๋๋ค.")
|
73 |
+
except Exception as e:
|
74 |
+
print(f"ํ๋ก์ ํธ {project_id}์ ๋ฐฐํฌ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ ์คํจ: {e}")
|
75 |
+
continue
|
76 |
+
|
77 |
+
print(f"์ด {len(games)}๊ฐ์ ์ ํจํ ๋ฐฐํฌ๋ฅผ ์ฐพ์์ต๋๋ค")
|
78 |
+
return sorted(games, key=lambda x: x["ts"], reverse=True)
|
79 |
+
|
80 |
+
except Exception as e:
|
81 |
+
print(f"Vercel API ์ค๋ฅ: {str(e)}")
|
82 |
+
import traceback
|
83 |
+
traceback.print_exc()
|
84 |
+
return []
|
85 |
+
|
86 |
+
|
87 |
+
|