AnesKAM commited on
Commit
b4cd4b3
·
verified ·
1 Parent(s): 612f036

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -47
app.py CHANGED
@@ -4,23 +4,26 @@ import random
4
 
5
  app = Flask(__name__)
6
 
7
- # --- إعدادات السيرفر ---
8
- # نصيحة: إذا استمر خطأ 429، قم بتغيير هذا الرابط برابط آخر من searx.space
9
- SEARXNG_URL = 'https://search.ethibox.fr/'
 
 
 
 
 
 
 
10
 
11
- # قائمة بـ User-Agents حقيقية لخداع السيرفرات ومنع الحظر (Anti-Bot)
12
  USER_AGENTS = [
13
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
14
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
15
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
16
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0",
17
- "Mozilla/5.0 (iPhone; CPU iPhone OS 17_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1",
18
- "Mozilla/5.0 (iPad; CPU OS 17_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1"
19
  ]
20
 
21
  @app.route('/')
22
  def home():
23
- # عرض الواجهة المخصصة الموجودة في templates/index.html
24
  return render_template('index.html')
25
 
26
  @app.route('/search')
@@ -29,46 +32,34 @@ def search():
29
  if not query:
30
  return jsonify({"error": "No query provided"}), 400
31
 
32
- try:
33
- # 1. اختيار User-Agent عشوائي لكل طلب لتقليل احتمالية الحظر (429)
34
- headers = {
35
- 'User-Agent': random.choice(USER_AGENTS),
36
- 'Accept': 'application/json',
37
- 'Accept-Language': 'en-US,en;q=0.9',
38
- }
39
-
40
- # 2. إعداد البارامترات
41
- params = {
42
- 'q': query,
43
- 'format': 'json',
44
- 'language': 'en-US'
45
- }
46
-
47
- # 3. إرسال الطلب من السيرفر (Backend) لتجاوز CORS
48
- response = requests.get(
49
- f"{SEARXNG_URL}/search",
50
- params=params,
51
- headers=headers,
52
- timeout=10 # زيادة المهلة لضمان وصول النتائج
53
- )
54
-
55
- # التعامل مع خطأ 429 (Too Many Requests)
56
- if response.status_code == 429:
57
- return jsonify({
58
- "error": "Server is overloaded (429). Please wait a moment or try again.",
59
- "suggestion": "If this persists, AnesNT recommends changing the SEARXNG_URL in app.py"
60
- }), 429
61
 
62
- if response.status_code == 200:
63
- return jsonify(response.json())
64
- else:
65
- return jsonify({"error": f"Search engine returned error {response.status_code}"}), response.status_code
 
 
66
 
67
- except requests.exceptions.Timeout:
68
- return jsonify({"error": "The search engine took too long to respond. Try again."}), 504
69
- except Exception as e:
70
- return jsonify({"error": f"An unexpected error occurred: {str(e)}"}), 500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
 
72
  if __name__ == '__main__':
73
- # تشغيل التطبيق على المنفذ المطلوب من Hugging Face
74
- app.run(host='0.0.0.0', port=7860)
 
4
 
5
  app = Flask(__name__)
6
 
7
+ # --- قائمة السيرفرات الرحيمة والمستقرة (التحالف الأوروبي) ---
8
+ # وضعنا عدة سيرفرات لضمان عدم توقف SurfGO أبداً
9
+ SEARXNG_INSTANCES = [
10
+ 'https://search.inetol.net', # إسبانيا
11
+ 'https://search.ethibox.fr', # فرنسا
12
+ 'https://search.rhscz.eu', # هولندا
13
+ 'https://searx.tiekoetter.com', # ألمانيا
14
+ 'https://search.datenkrake.ch', # سويسرا
15
+ 'https://search.zina.dev' # ألمانيا
16
+ ]
17
 
 
18
  USER_AGENTS = [
19
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
20
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
21
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
22
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0"
 
 
23
  ]
24
 
25
  @app.route('/')
26
  def home():
 
27
  return render_template('index.html')
28
 
29
  @app.route('/search')
 
32
  if not query:
33
  return jsonify({"error": "No query provided"}), 400
34
 
35
+ # خلط قائمة السيرفرات في كل طلب لضمان توزيع الضغط
36
+ random.shuffle(SEARXNG_INSTANCES)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
+ for url in SEARXNG_INSTANCES:
39
+ try:
40
+ headers = {'User-Agent': random.choice(USER_AGENTS)}
41
+ params = {'q': query, 'format': 'json'}
42
+
43
+ response = requests.get(f"{url}/search", params=params, headers=headers, timeout=5)
44
 
45
+ # إذا كان السيرفر يعمل (200)، أرجع النتائج فوراً
46
+ if response.status_code == 200:
47
+ return jsonify(response.json())
48
+
49
+ # إذا كان السيرفر يعطي 429، انتقل للسيرفر التالي في القائمة
50
+ if response.status_code == 429:
51
+ print(f"Server {url} is overloaded (429), trying next...")
52
+ continue
53
+
54
+ except Exception as e:
55
+ print(f"Error with {url}: {str(e)}")
56
+ continue
57
+
58
+ # إذا انتهت كل السيرفرات ولم ينجح أي منها
59
+ return jsonify({
60
+ "error": "All search engines are currently overloaded. Please try again in a few minutes.",
61
+ "suggestion": "This is a temporary IP block on Hugging Face. AnesNT is working on it!"
62
+ }), 503
63
 
64
  if __name__ == '__main__':
65
+ app.run(host='0.0.0.0', port=7860)