Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -4,6 +4,7 @@ import threading
|
|
| 4 |
import requests
|
| 5 |
import asyncio
|
| 6 |
import re
|
|
|
|
| 7 |
from flask import Flask, jsonify, make_response, request
|
| 8 |
from supabase import create_client
|
| 9 |
from pyrogram import Client, filters, enums
|
|
@@ -25,6 +26,9 @@ app = Flask(__name__)
|
|
| 25 |
supabase = create_client(SUPABASE_URL, SUPABASE_KEY)
|
| 26 |
admin_states = {}
|
| 27 |
|
|
|
|
|
|
|
|
|
|
| 28 |
# Pyrogram Client Setup
|
| 29 |
bot = Client(
|
| 30 |
"file_unlocker_bot",
|
|
@@ -53,7 +57,6 @@ def api_videos():
|
|
| 53 |
response.headers['Access-Control-Allow-Origin'] = '*'
|
| 54 |
return response
|
| 55 |
|
| 56 |
-
# যুক্ত করা হয়েছে - Frontend-এর জন্য Missing API Endpoint (CORS Handle সহ)
|
| 57 |
@app.route('/api/send_code', methods=['POST', 'OPTIONS'])
|
| 58 |
def api_send_code():
|
| 59 |
if request.method == 'OPTIONS':
|
|
@@ -61,8 +64,33 @@ def api_send_code():
|
|
| 61 |
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 62 |
res.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
|
| 63 |
return res
|
| 64 |
-
|
| 65 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 67 |
return res
|
| 68 |
|
|
@@ -73,7 +101,19 @@ def api_verify_code():
|
|
| 73 |
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 74 |
res.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
|
| 75 |
return res
|
| 76 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 78 |
return res
|
| 79 |
|
|
@@ -282,7 +322,6 @@ async def handle_media_upload(client, message):
|
|
| 282 |
try:
|
| 283 |
original_file = await message.download()
|
| 284 |
|
| 285 |
-
# যুক্ত করা হয়েছে - ফাইল ফেইল হলে ক্র্যাশ হ্যান্ডল
|
| 286 |
if not original_file:
|
| 287 |
await status_msg.edit_text("❌ মিডিয়া ফাইলটি ডাউনলোড করা সম্ভব হয়নি! (খুব বড় বা সার্ভার সমস্যা)")
|
| 288 |
return
|
|
@@ -560,7 +599,7 @@ async def catch_admin_steps(client, message):
|
|
| 560 |
|
| 561 |
# ================= RUNNER =================
|
| 562 |
def run_flask():
|
| 563 |
-
app.run(host="0.0.0.0", port=
|
| 564 |
|
| 565 |
if __name__ == "__main__":
|
| 566 |
threading.Thread(target=run_flask, daemon=True).start()
|
|
|
|
| 4 |
import requests
|
| 5 |
import asyncio
|
| 6 |
import re
|
| 7 |
+
import random
|
| 8 |
from flask import Flask, jsonify, make_response, request
|
| 9 |
from supabase import create_client
|
| 10 |
from pyrogram import Client, filters, enums
|
|
|
|
| 26 |
supabase = create_client(SUPABASE_URL, SUPABASE_KEY)
|
| 27 |
admin_states = {}
|
| 28 |
|
| 29 |
+
# টেম্পোরারিভাবে OTP সেভ রাখার জন্য একটি ডিকশনারি
|
| 30 |
+
temp_otps = {}
|
| 31 |
+
|
| 32 |
# Pyrogram Client Setup
|
| 33 |
bot = Client(
|
| 34 |
"file_unlocker_bot",
|
|
|
|
| 57 |
response.headers['Access-Control-Allow-Origin'] = '*'
|
| 58 |
return response
|
| 59 |
|
|
|
|
| 60 |
@app.route('/api/send_code', methods=['POST', 'OPTIONS'])
|
| 61 |
def api_send_code():
|
| 62 |
if request.method == 'OPTIONS':
|
|
|
|
| 64 |
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 65 |
res.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
|
| 66 |
return res
|
| 67 |
+
|
| 68 |
+
data = request.json
|
| 69 |
+
phone = data.get('phone')
|
| 70 |
+
user_id = data.get('user_id')
|
| 71 |
+
|
| 72 |
+
if not user_id:
|
| 73 |
+
res = make_response(jsonify({"status": "error", "msg": "User ID missing"}))
|
| 74 |
+
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 75 |
+
return res
|
| 76 |
+
|
| 77 |
+
# ৫ ডিজিটের একটি র্যান্ডম OTP তৈরি করা হচ্ছে
|
| 78 |
+
otp = str(random.randint(10000, 99999))
|
| 79 |
+
hash_val = str(random.randint(1000000, 9999999))
|
| 80 |
+
|
| 81 |
+
# OTP টি সেভ রাখা হচ্ছে
|
| 82 |
+
temp_otps[hash_val] = otp
|
| 83 |
+
|
| 84 |
+
# টেলিগ্রাম বট API-এর মাধ্যমে ইউজারের ইনবক্সে মেসেজ পাঠানো
|
| 85 |
+
url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
|
| 86 |
+
payload = {
|
| 87 |
+
"chat_id": user_id,
|
| 88 |
+
"text": f"🔐 আপনার Video Unlocker Pro এর Verification Code হচ্ছে: <b>{otp}</b>\n\nঅনুগ্রহ করে এটি কারো সাথে শেয়ার করবেন না।",
|
| 89 |
+
"parse_mode": "HTML"
|
| 90 |
+
}
|
| 91 |
+
requests.post(url, json=payload)
|
| 92 |
+
|
| 93 |
+
res = make_response(jsonify({"status": "ok", "hash": hash_val}))
|
| 94 |
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 95 |
return res
|
| 96 |
|
|
|
|
| 101 |
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 102 |
res.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
|
| 103 |
return res
|
| 104 |
+
|
| 105 |
+
data = request.json
|
| 106 |
+
hash_val = data.get('hash')
|
| 107 |
+
user_otp = data.get('otp')
|
| 108 |
+
|
| 109 |
+
# ইউজারের দেওয়া OTP এর সাথে মেলানো হচ্ছে
|
| 110 |
+
if temp_otps.get(hash_val) == user_otp:
|
| 111 |
+
# ভেরিফিকেশন সফল হলে ডাটা ডিলিট করে দিন
|
| 112 |
+
del temp_otps[hash_val]
|
| 113 |
+
res = make_response(jsonify({"status": "ok"}))
|
| 114 |
+
else:
|
| 115 |
+
res = make_response(jsonify({"status": "error", "msg": "Invalid OTP!"}))
|
| 116 |
+
|
| 117 |
res.headers['Access-Control-Allow-Origin'] = '*'
|
| 118 |
return res
|
| 119 |
|
|
|
|
| 322 |
try:
|
| 323 |
original_file = await message.download()
|
| 324 |
|
|
|
|
| 325 |
if not original_file:
|
| 326 |
await status_msg.edit_text("❌ মিডিয়া ফাইলটি ডাউনলোড করা সম্ভব হয়নি! (খুব বড় বা সার্ভার সমস্যা)")
|
| 327 |
return
|
|
|
|
| 599 |
|
| 600 |
# ================= RUNNER =================
|
| 601 |
def run_flask():
|
| 602 |
+
app.run(host="0.0.0.0", port=7860)
|
| 603 |
|
| 604 |
if __name__ == "__main__":
|
| 605 |
threading.Thread(target=run_flask, daemon=True).start()
|