Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -5,6 +5,7 @@ from flask import Flask, jsonify, make_response, request
|
|
| 5 |
from supabase import create_client
|
| 6 |
import urllib.request
|
| 7 |
import re
|
|
|
|
| 8 |
|
| 9 |
BOT_TOKEN = os.environ.get('BOT_TOKEN')
|
| 10 |
SUPABASE_URL = "https://yctirvnryrzygoxbpvoy.supabase.co"
|
|
@@ -21,7 +22,7 @@ bot = telebot.TeleBot(BOT_TOKEN)
|
|
| 21 |
supabase = create_client(SUPABASE_URL, SUPABASE_KEY)
|
| 22 |
app = Flask(__name__)
|
| 23 |
|
| 24 |
-
# ইন-মেমরি ক্যাশে
|
| 25 |
thumbnail_cache = {}
|
| 26 |
|
| 27 |
# ==========================================
|
|
@@ -30,7 +31,6 @@ thumbnail_cache = {}
|
|
| 30 |
|
| 31 |
@app.route(f'/{BOT_TOKEN}', methods=['POST'])
|
| 32 |
def webhook():
|
| 33 |
-
# Content-type একটু ফ্লেক্সিবল করা হলো টেলিগ্রামের জন্য
|
| 34 |
if 'application/json' in request.headers.get('content-type', ''):
|
| 35 |
json_string = request.get_data().decode('utf-8')
|
| 36 |
update = telebot.types.Update.de_json(json_string)
|
|
@@ -63,24 +63,43 @@ def get_telegram_thumbnail(channel, msg_id):
|
|
| 63 |
|
| 64 |
try:
|
| 65 |
url = f"https://t.me/{channel}/{msg_id}?embed=1"
|
| 66 |
-
|
| 67 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
match = re.search(r'<meta property="og:image" content="([^"]+)">', html)
|
| 69 |
if match:
|
| 70 |
img_url = match.group(1)
|
| 71 |
if "telegram_logo" not in img_url:
|
|
|
|
| 72 |
thumbnail_cache[cache_key] = img_url
|
| 73 |
return img_url
|
| 74 |
-
|
| 75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
|
| 77 |
-
#
|
| 78 |
fallback = f"https://placehold.co/300x200/222222/FF9900/png?text=Video+{msg_id}"
|
| 79 |
thumbnail_cache[cache_key] = fallback
|
|
|
|
| 80 |
return fallback
|
| 81 |
|
| 82 |
@app.route('/api/videos')
|
| 83 |
def api_videos():
|
|
|
|
| 84 |
videos_data = []
|
| 85 |
for msg_id in range(START_MESSAGE_ID, START_MESSAGE_ID + TOTAL_VIDEOS):
|
| 86 |
thumb = get_telegram_thumbnail(CHANNEL_USERNAME, msg_id)
|
|
@@ -100,7 +119,6 @@ def start(message):
|
|
| 100 |
referrer_id = None
|
| 101 |
if len(text) > 1:
|
| 102 |
try:
|
| 103 |
-
# Type error এড়াতে int এ কনভার্ট
|
| 104 |
referrer_id = int(text[1])
|
| 105 |
except ValueError:
|
| 106 |
referrer_id = None
|
|
@@ -108,7 +126,6 @@ def start(message):
|
|
| 108 |
try:
|
| 109 |
user_check = supabase.table('referrals').select('*').eq('user_id', user_id).execute()
|
| 110 |
|
| 111 |
-
# যদি ডাটাবেজে ইউজার না থাকে
|
| 112 |
if not user_check.data:
|
| 113 |
supabase.table('referrals').insert({
|
| 114 |
'user_id': user_id,
|
|
@@ -116,7 +133,6 @@ def start(message):
|
|
| 116 |
'referrer_id': referrer_id if referrer_id != user_id else None
|
| 117 |
}).execute()
|
| 118 |
|
| 119 |
-
# যদি নতুন ইউজার কোনো রেফারের মাধ্যমে জয়েন করে
|
| 120 |
if referrer_id and referrer_id != user_id:
|
| 121 |
referrer_data = supabase.table('referrals').select('referral_count').eq('user_id', referrer_id).execute()
|
| 122 |
if referrer_data.data:
|
|
@@ -125,15 +141,16 @@ def start(message):
|
|
| 125 |
|
| 126 |
try:
|
| 127 |
bot.send_message(referrer_id, "🎉 একজন আপনার লিংকে জয়েন করেছে! আপনার রেফারেল কাউন্ট বাড়লো।")
|
| 128 |
-
except Exception:
|
| 129 |
-
|
| 130 |
except Exception as e:
|
| 131 |
-
print("
|
|
|
|
| 132 |
|
| 133 |
markup = InlineKeyboardMarkup()
|
| 134 |
markup.add(InlineKeyboardButton("Play video 🔞", web_app=WebAppInfo(url=WEB_APP_URL)))
|
| 135 |
bot.reply_to(message, "ভাইরাল ভিডিও দেখতে নিচের বাটনে ক্লিক করো 👇", reply_markup=markup)
|
| 136 |
|
| 137 |
if __name__ == "__main__":
|
| 138 |
-
|
| 139 |
app.run(host="0.0.0.0", port=7860, threaded=True)
|
|
|
|
| 5 |
from supabase import create_client
|
| 6 |
import urllib.request
|
| 7 |
import re
|
| 8 |
+
import traceback # বিস্তারিত এরর (error) দেখার জন্য
|
| 9 |
|
| 10 |
BOT_TOKEN = os.environ.get('BOT_TOKEN')
|
| 11 |
SUPABASE_URL = "https://yctirvnryrzygoxbpvoy.supabase.co"
|
|
|
|
| 22 |
supabase = create_client(SUPABASE_URL, SUPABASE_KEY)
|
| 23 |
app = Flask(__name__)
|
| 24 |
|
| 25 |
+
# ইন-মেমরি ক্যাশে
|
| 26 |
thumbnail_cache = {}
|
| 27 |
|
| 28 |
# ==========================================
|
|
|
|
| 31 |
|
| 32 |
@app.route(f'/{BOT_TOKEN}', methods=['POST'])
|
| 33 |
def webhook():
|
|
|
|
| 34 |
if 'application/json' in request.headers.get('content-type', ''):
|
| 35 |
json_string = request.get_data().decode('utf-8')
|
| 36 |
update = telebot.types.Update.de_json(json_string)
|
|
|
|
| 63 |
|
| 64 |
try:
|
| 65 |
url = f"https://t.me/{channel}/{msg_id}?embed=1"
|
| 66 |
+
print(f"[LOG] Fetching URL: {url}") # সার্ভারে কোন লিংকের কাজ চলছে তা দেখাবে
|
| 67 |
+
|
| 68 |
+
# User-Agent যোগ করা হয়েছে যাতে টেলিগ্রাম রিকোয়েস্ট ব্লক না করে
|
| 69 |
+
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'})
|
| 70 |
+
|
| 71 |
+
# টাইমআউট ৫ সেকেন্ড করা হলো
|
| 72 |
+
html = urllib.request.urlopen(req, timeout=5).read().decode('utf-8')
|
| 73 |
+
|
| 74 |
match = re.search(r'<meta property="og:image" content="([^"]+)">', html)
|
| 75 |
if match:
|
| 76 |
img_url = match.group(1)
|
| 77 |
if "telegram_logo" not in img_url:
|
| 78 |
+
print(f"[SUCCESS] Image found for msg {msg_id}: {img_url}")
|
| 79 |
thumbnail_cache[cache_key] = img_url
|
| 80 |
return img_url
|
| 81 |
+
else:
|
| 82 |
+
print(f"[WARNING] msg {msg_id} তে শুধু টেলিগ্রামের ডিফল্ট লোগো পাওয়া গেছে (আসল ছবি নেই)।")
|
| 83 |
+
else:
|
| 84 |
+
print(f"[WARNING] msg {msg_id} এর HTML এ কোনো ছবি (og:image) পাওয়া যায়নি।")
|
| 85 |
+
|
| 86 |
+
except urllib.error.HTTPError as e:
|
| 87 |
+
print(f"[HTTP ERROR] msg {msg_id} লোড হতে ব্যর্থ: {e.code} {e.reason}")
|
| 88 |
+
except urllib.error.URLError as e:
|
| 89 |
+
print(f"[URL/NETWORK ERROR] msg {msg_id} নেটওয়ার্ক বা টাইমআউট সমস্যা: {e.reason}")
|
| 90 |
+
except Exception as e:
|
| 91 |
+
print(f"[UNKNOWN ERROR] msg {msg_id} স্ক্র্যাপ করার সময় অজানা সমস্যা:")
|
| 92 |
+
traceback.print_exc() # এটি এররের একদম বিস্তারিত লাইন নাম্বারসহ প্রিন্ট করবে
|
| 93 |
|
| 94 |
+
# কোনো কারণে ছবি না পেলে ফলিং ব্যাক (ডামি ইমেজ)
|
| 95 |
fallback = f"https://placehold.co/300x200/222222/FF9900/png?text=Video+{msg_id}"
|
| 96 |
thumbnail_cache[cache_key] = fallback
|
| 97 |
+
print(f"[FALLBACK] msg {msg_id} এর জন্য ডামি ছবি সেট করা হলো।")
|
| 98 |
return fallback
|
| 99 |
|
| 100 |
@app.route('/api/videos')
|
| 101 |
def api_videos():
|
| 102 |
+
print("[LOG] /api/videos API হিট হয়েছে!")
|
| 103 |
videos_data = []
|
| 104 |
for msg_id in range(START_MESSAGE_ID, START_MESSAGE_ID + TOTAL_VIDEOS):
|
| 105 |
thumb = get_telegram_thumbnail(CHANNEL_USERNAME, msg_id)
|
|
|
|
| 119 |
referrer_id = None
|
| 120 |
if len(text) > 1:
|
| 121 |
try:
|
|
|
|
| 122 |
referrer_id = int(text[1])
|
| 123 |
except ValueError:
|
| 124 |
referrer_id = None
|
|
|
|
| 126 |
try:
|
| 127 |
user_check = supabase.table('referrals').select('*').eq('user_id', user_id).execute()
|
| 128 |
|
|
|
|
| 129 |
if not user_check.data:
|
| 130 |
supabase.table('referrals').insert({
|
| 131 |
'user_id': user_id,
|
|
|
|
| 133 |
'referrer_id': referrer_id if referrer_id != user_id else None
|
| 134 |
}).execute()
|
| 135 |
|
|
|
|
| 136 |
if referrer_id and referrer_id != user_id:
|
| 137 |
referrer_data = supabase.table('referrals').select('referral_count').eq('user_id', referrer_id).execute()
|
| 138 |
if referrer_data.data:
|
|
|
|
| 141 |
|
| 142 |
try:
|
| 143 |
bot.send_message(referrer_id, "🎉 একজন আপনার লিংকে জয়েন করেছে! আপনার রেফারেল কাউন্ট বাড়লো।")
|
| 144 |
+
except Exception as e:
|
| 145 |
+
print(f"[BOT ERROR] রেফারারকে মেসেজ পাঠাতে সমস্যা: {e}")
|
| 146 |
except Exception as e:
|
| 147 |
+
print("[DATABASE ERROR] Supabase ডেটাবেজ এরর:")
|
| 148 |
+
traceback.print_exc()
|
| 149 |
|
| 150 |
markup = InlineKeyboardMarkup()
|
| 151 |
markup.add(InlineKeyboardButton("Play video 🔞", web_app=WebAppInfo(url=WEB_APP_URL)))
|
| 152 |
bot.reply_to(message, "ভাইরাল ভিডিও দেখতে নিচের বাটনে ক্লিক করো 👇", reply_markup=markup)
|
| 153 |
|
| 154 |
if __name__ == "__main__":
|
| 155 |
+
print("[LOG] Bot and Flask Server Started Successfully!")
|
| 156 |
app.run(host="0.0.0.0", port=7860, threaded=True)
|