Yaelcode commited on
Commit
86966fa
·
verified ·
1 Parent(s): 3011c2c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -79
app.py CHANGED
@@ -7,7 +7,6 @@ import shutil
7
  import logging
8
  import requests
9
  import gc
10
- import json
11
  from flask import Flask, request, jsonify
12
  from huggingface_hub import HfApi
13
 
@@ -18,18 +17,11 @@ DATASET_REPO = os.environ.get("DATASET_REPO")
18
  HF_TOKEN = os.environ.get("HF_TOKEN")
19
  RENDER_URL = os.environ.get("RENDER_URL")
20
  ACCOUNTS_FILE = "accounts.txt"
21
- WARP_PORT = 40000
22
 
23
- api = HfApi(token=HF_TOKEN)
24
-
25
- # --- YARDIMCI KOMUTLAR ---
26
- def run_command(cmd):
27
- try:
28
- return subprocess.run(cmd, shell=True, capture_output=True, text=True)
29
- except Exception as e:
30
- print(f"⚠️ Komut Hatası: {e}", flush=True)
31
- return None
32
 
 
33
  def get_accounts():
34
  if not os.path.exists(ACCOUNTS_FILE): return []
35
  with open(ACCOUNTS_FILE, 'r') as f:
@@ -44,54 +36,21 @@ def report_to_render(status, message, task_id, download_url=None):
44
  }, timeout=10)
45
  except: pass
46
 
47
- # --- GÜVENLİ WARP YÖNETİMİ ---
48
  def rotate_warp_ip():
49
- """WARP IP'sini güvenli bir şekilde değiştirir (Çökmeden)"""
50
- print("\n♻️ IP ROTASYONU BAŞLATILIYOR...", flush=True)
51
  try:
52
- os.system("pkill wireproxy")
53
- os.system("pkill wgcf")
54
  time.sleep(2)
 
55
 
56
- for f in ["wgcf-account.toml", "wgcf-profile.conf", "wireproxy.conf"]:
57
- if os.path.exists(f):
58
- try: os.remove(f)
59
- except: pass
60
-
61
- print("⚡ Cloudflare ile görüşülüyor...", flush=True)
62
- subprocess.run(["wgcf", "register", "--accept-tos"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=30)
63
- subprocess.run(["wgcf", "generate"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=30)
64
-
65
- if not os.path.exists("wgcf-profile.conf"):
66
- print("❌ WARP Config alınamadı!", flush=True)
67
- return False
68
-
69
- with open("wgcf-profile.conf", "r") as f:
70
- content = f.read()
71
-
72
- private_key = content.split("PrivateKey = ")[1].split("\n")[0].strip()
73
- address = content.split("Address = ")[1].split("\n")[0].strip()
74
-
75
- wp_conf = f"""[Interface]
76
- PrivateKey = {private_key}
77
- Address = {address}
78
- DNS = 1.1.1.1
79
- [Peer]
80
- PublicKey = bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
81
- AllowedIPs = 0.0.0.0/0
82
- Endpoint = engage.cloudflareclient.com:2408
83
- [Socks5]
84
- BindAddress = 127.0.0.1:{WARP_PORT}"""
85
-
86
- with open("wireproxy.conf", "w") as f:
87
- f.write(wp_conf)
88
-
89
- print(f"🚀 Tünel Açılıyor...", flush=True)
90
- subprocess.Popen(["wireproxy", "-c", "wireproxy.conf"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
91
- time.sleep(5)
92
  return True
93
  except Exception as e:
94
- print(f"❌ IP Rotasyonunda Hata: {e}", flush=True)
95
  return False
96
 
97
  def safe_mega_reset():
@@ -106,13 +65,13 @@ def safe_mega_reset():
106
  def login_with_proxy(account_str):
107
  try:
108
  email, password = account_str.split(":", 1)
109
- proxy_url = f"socks5://127.0.0.1:{WARP_PORT}"
 
110
  subprocess.run(["mega-proxy", proxy_url], capture_output=True)
111
 
112
- # --- EKLENEN KRİTİK KISIM: ZORLA ÇIKIŞ (LOGOUT) ---
113
  subprocess.run(["mega-logout"], capture_output=True, stderr=subprocess.DEVNULL)
114
  time.sleep(2)
115
- # --------------------------------------------------
116
 
117
  print(f"🔑 Giriş Deneniyor: {email[:3]}***", flush=True)
118
  res = subprocess.run(["mega-login", email, password], capture_output=True, text=True, timeout=45)
@@ -132,6 +91,7 @@ def get_mega_details():
132
  return res.stdout.strip()
133
  except: return ""
134
 
 
135
  def download_engine(link, task_id):
136
  try:
137
  print(f"\n⚙️ WORKER BAŞLADI: {task_id}", flush=True)
@@ -144,7 +104,10 @@ def download_engine(link, task_id):
144
  accounts = get_accounts()
145
  random.shuffle(accounts)
146
 
147
- if not accounts: return
 
 
 
148
  is_completed = False
149
 
150
  safe_mega_reset()
@@ -166,7 +129,6 @@ def download_engine(link, task_id):
166
  no_transfer_count = 0
167
  loop_counter = 0
168
 
169
- # 🔴 ZOMBİ VE HIZ KORUMASI V3 (Acımasız Mod)
170
  previous_active_transfers = []
171
  stuck_counter = 0
172
 
@@ -176,9 +138,9 @@ def download_engine(link, task_id):
176
  lower_output = output.lower()
177
  lines = output.split('\n')
178
 
179
- # 1. Klasik Limit ve Ban Kontrolü
180
  if "bandwidth quota exceeded" in lower_output or "paused" in lower_output or "retrying" in lower_output:
181
- print("\n🚨 KOTA/IP BAN TESPİT EDİLDİ! Tünel Değiştiriliyor...", flush=True)
182
  os.system("pkill mega-get")
183
  if rotate_warp_ip():
184
  safe_mega_reset()
@@ -186,30 +148,27 @@ def download_engine(link, task_id):
186
  time.sleep(60)
187
  break
188
 
189
- # 2. V3 Zombi ve Hız Koruması (Tamamen Harf ve Rakam Kontrolü)
190
- # Sadece ACTIVE olan satırları bul ve listele
191
  current_active_transfers = [line for line in lines if "ACTIVE" in line]
192
 
193
  if current_active_transfers:
194
- # Eğer ACTIVE olan indirmeler bir önceki saniyeyle HARFİ HARFİNE aynıysa (Yani 1 KB bile inmediyse veya 100%'de takıldıysa)
195
  if current_active_transfers == previous_active_transfers:
196
  stuck_counter += 1
197
- print(f"⚠️ HIZ SIFIR VEYA 100% BUG'I! (Tüneli patlatmaya son {6 - stuck_counter} adım)", flush=True)
198
- if stuck_counter >= 6: # 30 Saniye tık yoksa acıma
199
- print("\n💥 SİSTEM TIKANDI! Mega'nın kafasına sıkılıp Tünel değiştiriliyor...", flush=True)
200
  os.system("pkill mega-get")
201
  rotate_warp_ip()
202
  safe_mega_reset()
203
  stuck_counter = 0
204
- break # Tüneli yeniler ve mega-get'i taze iple tetikler
205
  else:
206
- # Eğer 1 KB bile indiyse rakam değişeceği için sayacı sıfırla
207
  stuck_counter = 0
208
  previous_active_transfers = current_active_transfers
209
  else:
210
  stuck_counter = 0
211
 
212
- # 3. İndirme Bitiş Kontrolü
213
  if "no active transfers" in lower_output:
214
  loop_counter += 1
215
  if loop_counter > 3:
@@ -224,7 +183,7 @@ def download_engine(link, task_id):
224
  else:
225
  no_transfer_count = 0
226
 
227
- # Terminale Temiz Log Basma
228
  for line in lines:
229
  if "TRANSFERRING" in line or "%" in line:
230
  print(f"📊 {line.strip()}", flush=True)
@@ -239,13 +198,16 @@ def download_engine(link, task_id):
239
  shutil.make_archive(f"{abs_base}/{task_id}", 'zip', download_folder)
240
 
241
  print("📤 YÜKLENİYOR...", flush=True)
242
- try:
243
- api.upload_file(
244
- path_or_fileobj=zip_file, repo_id=DATASET_REPO, repo_type="dataset", path_in_repo=f"uploads/{task_id}.zip"
245
- )
246
- print("✅ HUGGING FACE YÜKLEMESİ BAŞARILI!")
247
- except Exception as e:
248
- print(f"❌ Upload Hatası: {e}", flush=True)
 
 
 
249
 
250
  try:
251
  shutil.rmtree(download_folder, ignore_errors=True)
@@ -255,7 +217,8 @@ def download_engine(link, task_id):
255
 
256
  except Exception as e:
257
  print(f"🔥 KRİTİK HATA: {e}", flush=True)
258
-
 
259
  @app.route('/process', methods=['POST'])
260
  def process():
261
  data = request.json
@@ -267,7 +230,7 @@ def ui():
267
  return """
268
  <html>
269
  <body style="background-color: #1e1e1e; color: white; font-family: sans-serif; text-align: center; padding-top: 50px;">
270
- <h2>Yael Mega-Worker Paneli 🚀</h2>
271
  <div style="margin: 20px;">
272
  <input id="mega_link" type="text" placeholder="Mega.nz Linkini Buraya Yapıştır..." style="width: 80%; max-width: 500px; padding: 15px; border-radius: 8px; border: none; margin-bottom: 10px;"/><br>
273
  <input id="task_id" type="text" placeholder="Görev Adı (Örn: arsiv_1 - Boşluk Bırakma)" style="width: 80%; max-width: 500px; padding: 15px; border-radius: 8px; border: none; margin-bottom: 20px;"/><br>
 
7
  import logging
8
  import requests
9
  import gc
 
10
  from flask import Flask, request, jsonify
11
  from huggingface_hub import HfApi
12
 
 
17
  HF_TOKEN = os.environ.get("HF_TOKEN")
18
  RENDER_URL = os.environ.get("RENDER_URL")
19
  ACCOUNTS_FILE = "accounts.txt"
 
20
 
21
+ # Hugging Face token varsa API'yi başlat
22
+ api = HfApi(token=HF_TOKEN) if HF_TOKEN else None
 
 
 
 
 
 
 
23
 
24
+ # --- YARDIMCI FONKSİYONLAR ---
25
  def get_accounts():
26
  if not os.path.exists(ACCOUNTS_FILE): return []
27
  with open(ACCOUNTS_FILE, 'r') as f:
 
36
  }, timeout=10)
37
  except: pass
38
 
39
+ # --- TOR VE GİZLİLİK YÖNETİMİ (Ücretsiz Sınırsız IP) ---
40
  def rotate_warp_ip():
41
+ """Tor ağını yeniden başlatarak yepyeni bir IP (Çıkış Düğümü) alır"""
42
+ print("\n🧅 TOR AĞI: Yeni IP aranıyor...", flush=True)
43
  try:
44
+ os.system("pkill tor")
 
45
  time.sleep(2)
46
+ subprocess.Popen(["tor"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
47
 
48
+ print("⏳ Tor devresinin kurulması bekleniyor (15 sn)...", flush=True)
49
+ time.sleep(15)
50
+ print("🚀 TOR Tüneli Hazır! Yeni Kimlik Aktif.", flush=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  return True
52
  except Exception as e:
53
+ print(f"❌ Tor Başlatma Hatası: {e}", flush=True)
54
  return False
55
 
56
  def safe_mega_reset():
 
65
  def login_with_proxy(account_str):
66
  try:
67
  email, password = account_str.split(":", 1)
68
+
69
+ proxy_url = "socks5://127.0.0.1:9050"
70
  subprocess.run(["mega-proxy", proxy_url], capture_output=True)
71
 
72
+ # ESKİ HESABI ZORLA DIŞARI ATMA (Zincirleme patlamayı önler)
73
  subprocess.run(["mega-logout"], capture_output=True, stderr=subprocess.DEVNULL)
74
  time.sleep(2)
 
75
 
76
  print(f"🔑 Giriş Deneniyor: {email[:3]}***", flush=True)
77
  res = subprocess.run(["mega-login", email, password], capture_output=True, text=True, timeout=45)
 
91
  return res.stdout.strip()
92
  except: return ""
93
 
94
+ # --- ANA İNDİRME MOTORU ---
95
  def download_engine(link, task_id):
96
  try:
97
  print(f"\n⚙️ WORKER BAŞLADI: {task_id}", flush=True)
 
104
  accounts = get_accounts()
105
  random.shuffle(accounts)
106
 
107
+ if not accounts:
108
+ print("❌ HATA: accounts.txt boş veya bulunamadı!", flush=True)
109
+ return
110
+
111
  is_completed = False
112
 
113
  safe_mega_reset()
 
129
  no_transfer_count = 0
130
  loop_counter = 0
131
 
 
132
  previous_active_transfers = []
133
  stuck_counter = 0
134
 
 
138
  lower_output = output.lower()
139
  lines = output.split('\n')
140
 
141
+ # 1. Kota ve Ban Kontrolü
142
  if "bandwidth quota exceeded" in lower_output or "paused" in lower_output or "retrying" in lower_output:
143
+ print("\n🚨 KOTA TESPİT EDİLDİ! Tor Kimliği Değiştiriliyor...", flush=True)
144
  os.system("pkill mega-get")
145
  if rotate_warp_ip():
146
  safe_mega_reset()
 
148
  time.sleep(60)
149
  break
150
 
151
+ # 2. V3 Zombi ve Hız Koruması (Acımasız Mod)
 
152
  current_active_transfers = [line for line in lines if "ACTIVE" in line]
153
 
154
  if current_active_transfers:
 
155
  if current_active_transfers == previous_active_transfers:
156
  stuck_counter += 1
157
+ print(f"⚠️ HIZ SIFIR VEYA ZOMBİ BUG! (Tor'u patlatmaya son {6 - stuck_counter} adım)", flush=True)
158
+ if stuck_counter >= 6:
159
+ print("\n💥 SİSTEM TIKANDI! Mega'nın kafasına sıkılıp yeni Tor IP alınıyor...", flush=True)
160
  os.system("pkill mega-get")
161
  rotate_warp_ip()
162
  safe_mega_reset()
163
  stuck_counter = 0
164
+ break
165
  else:
 
166
  stuck_counter = 0
167
  previous_active_transfers = current_active_transfers
168
  else:
169
  stuck_counter = 0
170
 
171
+ # 3. Bitiş Kontrolü
172
  if "no active transfers" in lower_output:
173
  loop_counter += 1
174
  if loop_counter > 3:
 
183
  else:
184
  no_transfer_count = 0
185
 
186
+ # Log Basma
187
  for line in lines:
188
  if "TRANSFERRING" in line or "%" in line:
189
  print(f"📊 {line.strip()}", flush=True)
 
198
  shutil.make_archive(f"{abs_base}/{task_id}", 'zip', download_folder)
199
 
200
  print("📤 YÜKLENİYOR...", flush=True)
201
+ if api:
202
+ try:
203
+ api.upload_file(
204
+ path_or_fileobj=zip_file, repo_id=DATASET_REPO, repo_type="dataset", path_in_repo=f"uploads/{task_id}.zip"
205
+ )
206
+ print("✅ HUGGING FACE YÜKLEMESİ BAŞARILI!")
207
+ except Exception as e:
208
+ print(f"❌ Upload Hatası: {e}", flush=True)
209
+ else:
210
+ print("⚠️ HF_TOKEN bulunamadı, Hugging Face yüklemesi atlandı.")
211
 
212
  try:
213
  shutil.rmtree(download_folder, ignore_errors=True)
 
217
 
218
  except Exception as e:
219
  print(f"🔥 KRİTİK HATA: {e}", flush=True)
220
+
221
+ # --- WEB ARAYÜZÜ (PANEL) ---
222
  @app.route('/process', methods=['POST'])
223
  def process():
224
  data = request.json
 
230
  return """
231
  <html>
232
  <body style="background-color: #1e1e1e; color: white; font-family: sans-serif; text-align: center; padding-top: 50px;">
233
+ <h2>Yael Mega-Worker (Tor Edition) 🚀</h2>
234
  <div style="margin: 20px;">
235
  <input id="mega_link" type="text" placeholder="Mega.nz Linkini Buraya Yapıştır..." style="width: 80%; max-width: 500px; padding: 15px; border-radius: 8px; border: none; margin-bottom: 10px;"/><br>
236
  <input id="task_id" type="text" placeholder="Görev Adı (Örn: arsiv_1 - Boşluk Bırakma)" style="width: 80%; max-width: 500px; padding: 15px; border-radius: 8px; border: none; margin-bottom: 20px;"/><br>