MyanmarSwe commited on
Commit
387910a
·
verified ·
1 Parent(s): 1149572

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +27 -48
main.py CHANGED
@@ -9,11 +9,8 @@ import uvicorn
9
 
10
  app = FastAPI()
11
 
12
- # --- Configurations ---
13
  ACCESS_KEY = os.getenv("ACCESS_KEY", "786969")
14
- GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY", "")
15
-
16
- # OAuth Credentials (Hugging Face Secrets ထဲမှာ ထည့်ထားပေးပါ)
17
  CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID")
18
  CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET")
19
  REFRESH_TOKEN = os.getenv("GOOGLE_REFRESH_TOKEN")
@@ -23,57 +20,51 @@ def index():
23
  return {"message": "Proxy is Online!", "usage": "/download?url=[LINK]&key=[YOUR_KEY]"}
24
 
25
  def get_google_access_token():
26
- """Refresh Token ကိုသုံးပြီး Access Token အသစတောင်းယူခြင်း"""
27
  if not (CLIENT_ID and CLIENT_SECRET and REFRESH_TOKEN):
28
  return None
29
  try:
30
  url = "https://oauth2.googleapis.com/token"
31
- data = {
32
  "client_id": CLIENT_ID,
33
  "client_secret": CLIENT_SECRET,
34
  "refresh_token": REFRESH_TOKEN,
35
  "grant_type": "refresh_token",
36
  }
37
- r = requests.post(url, data=data, timeout=10)
38
  return r.json().get("access_token")
39
  except:
40
  return None
41
 
42
  def get_direct_url(url):
43
- """Link အမျိုးအစားအလိုက် Direct Link နှင့် လိုအပ်ပါက Bearer Token န်ပေးခြင်း"""
44
- token = None
45
-
46
  if "drive.google.com" in url:
47
  fid = re.search(r'/(?:d|file/d|open\?id=)/([a-zA-Z0-9_-]+)', url)
48
  if fid:
49
  file_id = fid.group(1)
50
- # OAuth သုံးနိုင်လျှင် (Private Files အတွက် အကောင်းဆုံး)
51
- access_token = get_google_access_token()
52
- if access_token:
53
- return f"https://www.googleapis.com/drive/v3/files/{file_id}?alt=media", access_token
54
-
55
- # API Key ရှိလျှင် (Public Files အတွက)
56
- if GOOGLE_API_KEY and GOOGLE_API_KEY != "YOUR_GOOGLE_API_KEY_HERE":
57
- return f"https://www.googleapis.com/drive/v3/files/{file_id}?alt=media&key={GOOGLE_API_KEY}", None
58
-
59
- # API Key မရှိလျှင် ရိုးရိုး Direct Link
60
- return f"https://drive.google.com/uc?export=download&id={file_id}", None
61
-
62
  elif "mediafire.com" in url:
63
  try:
64
  r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=10)
65
  soup = BeautifulSoup(r.text, 'html.parser')
66
  btn = soup.find('a', {'id': 'downloadButton'})
67
- return btn.get('href') if btn else None, None
68
- except: return None, None
69
-
70
  elif "dropbox.com" in url:
71
  return url.replace("?dl=0", "").split("?")[0] + "?dl=1", None
72
-
73
  elif "1drv.ms" in url or "onedrive.live.com" in url:
74
  encoded_url = base64.b64encode(bytes(url, 'utf-8')).decode('utf-8').replace('=', '').replace('/', '_').replace('+', '-')
75
  return f"https://api.onedrive.com/v1.0/shares/u!{encoded_url}/root/content", None
76
-
77
  return None, None
78
 
79
  @app.get("/download")
@@ -82,42 +73,30 @@ async def download_proxy(request: Request, url: str, key: str = None):
82
  if key != ACCESS_KEY:
83
  raise HTTPException(status_code=403, detail="Access Denied")
84
 
85
- # Direct Link နှင့် Token ရယူခြင်း
86
  target_link, token = get_direct_url(url)
87
  if not target_link:
88
  raise HTTPException(status_code=400, detail="Invalid Link")
89
 
90
- # Header များ ပြင်ဆင်ခြင်း
91
  headers = {}
92
  range_header = request.headers.get('range')
93
  if range_header:
94
  headers['Range'] = range_header
95
 
96
- # OAuth Token ရှိလျှင် Authorization Header ထည့်မည်
97
  if token:
98
  headers['Authorization'] = f"Bearer {token}"
99
 
100
  session = requests.Session()
 
101
  r = session.get(target_link, headers=headers, stream=True, allow_redirects=True)
102
 
103
- # ---------------------------------------------------------
104
- # GDrive Virus Scan Bypass (OAuth မသုံးထားသော Public Links များအတွက်)
105
- # ---------------------------------------------------------
106
- if "drive.google.com" in url and not token:
107
- content_type = r.headers.get('Content-Type', '').lower()
108
- if 'text/html' in content_type:
109
- # HTML ဖြစ်ှသ r.text ကိုဖတ်မည် (RAM မပြညေရန်)
110
- if "Google Drive - Virus scan warning" in r.text or "confirm=" not in target_link:
111
- confirm_token = None
112
- for c_key, c_val in session.cookies.items():
113
- if c_key.startswith("download_warning"):
114
- confirm_token = c_val
115
- break
116
- if confirm_token:
117
- new_link = f"{target_link}&confirm={confirm_token}"
118
- r = session.get(new_link, headers=headers, stream=True, allow_redirects=True)
119
-
120
- # Header များကို Proxy လုပ်၍ ပြန်ပို့ခြင်း
121
  excluded = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
122
  response_headers = {n: v for n, v in r.headers.items() if n.lower() not in excluded}
123
  response_headers['Accept-Ranges'] = 'bytes'
 
9
 
10
  app = FastAPI()
11
 
12
+ # --- Configurations (Hugging Face Secrets မှ ဆွဲယူမည်) ---
13
  ACCESS_KEY = os.getenv("ACCESS_KEY", "786969")
 
 
 
14
  CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID")
15
  CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET")
16
  REFRESH_TOKEN = os.getenv("GOOGLE_REFRESH_TOKEN")
 
20
  return {"message": "Proxy is Online!", "usage": "/download?url=[LINK]&key=[YOUR_KEY]"}
21
 
22
  def get_google_access_token():
23
+ """OAuth Token ကို Refresh လုပ်ခြင်း"""
24
  if not (CLIENT_ID and CLIENT_SECRET and REFRESH_TOKEN):
25
  return None
26
  try:
27
  url = "https://oauth2.googleapis.com/token"
28
+ payload = {
29
  "client_id": CLIENT_ID,
30
  "client_secret": CLIENT_SECRET,
31
  "refresh_token": REFRESH_TOKEN,
32
  "grant_type": "refresh_token",
33
  }
34
+ r = requests.post(url, data=payload, timeout=10)
35
  return r.json().get("access_token")
36
  except:
37
  return None
38
 
39
  def get_direct_url(url):
40
+ """Link အမျိုးအစားအလိုက် Direct URL နှင့် Token ခွဲခထုတ်ယူခြင်း"""
 
 
41
  if "drive.google.com" in url:
42
  fid = re.search(r'/(?:d|file/d|open\?id=)/([a-zA-Z0-9_-]+)', url)
43
  if fid:
44
  file_id = fid.group(1)
45
+ token = get_google_access_token()
46
+ if token:
47
+ # OAuth သုံး၍ Google Drive API v3 မှ ဆွဲထုတ်ခြင်း
48
+ return f"https://www.googleapis.com/drive/v3/files/{file_id}?alt=media", token
49
+ else:
50
+ # Token ရှိပါက ရိုးရိုး URL သုံးမည
51
+ return f"https://drive.google.com/uc?export=download&id={file_id}", None
52
+
 
 
 
 
53
  elif "mediafire.com" in url:
54
  try:
55
  r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=10)
56
  soup = BeautifulSoup(r.text, 'html.parser')
57
  btn = soup.find('a', {'id': 'downloadButton'})
58
+ if btn: return btn.get('href'), None
59
+ except: pass
60
+
61
  elif "dropbox.com" in url:
62
  return url.replace("?dl=0", "").split("?")[0] + "?dl=1", None
63
+
64
  elif "1drv.ms" in url or "onedrive.live.com" in url:
65
  encoded_url = base64.b64encode(bytes(url, 'utf-8')).decode('utf-8').replace('=', '').replace('/', '_').replace('+', '-')
66
  return f"https://api.onedrive.com/v1.0/shares/u!{encoded_url}/root/content", None
67
+
68
  return None, None
69
 
70
  @app.get("/download")
 
73
  if key != ACCESS_KEY:
74
  raise HTTPException(status_code=403, detail="Access Denied")
75
 
 
76
  target_link, token = get_direct_url(url)
77
  if not target_link:
78
  raise HTTPException(status_code=400, detail="Invalid Link")
79
 
80
+ # Header ပြင်ဆင်ခြင်း
81
  headers = {}
82
  range_header = request.headers.get('range')
83
  if range_header:
84
  headers['Range'] = range_header
85
 
 
86
  if token:
87
  headers['Authorization'] = f"Bearer {token}"
88
 
89
  session = requests.Session()
90
+ # Google/Target Server ထံသို့ Request ပို့ခြင်း
91
  r = session.get(target_link, headers=headers, stream=True, allow_redirects=True)
92
 
93
+ # Error Handling (404 ဖြစ်ပါက Public link ဖြင့် Bypass လုပ်ကြည့်မည်)
94
+ if r.status_code == 404 and "drive.google.com" in url:
95
+ file_id = re.search(r'/files/([a-zA-Z0-9_-]+)', target_link).group(1)
96
+ fallback_url = f"https://drive.google.com/uc?export=download&id={file_id}"
97
+ r = session.get(fallback_url, headers=headers, stream=True, allow_redirects=True)
98
+
99
+ # Headerကို ပြန်လည်းပို့ရန် ပြင်ဆင်ခြင်း
 
 
 
 
 
 
 
 
 
 
 
100
  excluded = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
101
  response_headers = {n: v for n, v in r.headers.items() if n.lower() not in excluded}
102
  response_headers['Accept-Ranges'] = 'bytes'