# learner.py - الإصدار المحدث import requests from bs4 import BeautifulSoup import json import os from difflib import get_close_matches from analyzer import fix_url, detect_media_type from memory import load_memory, save_memory, load_global_memory, save_global_memory LEARNING_FILE = "learned_links.json" SEARCH_QUERY = "websites to learn something new every day" SEARCH_ENGINE_URL = f"https://html.duckduckgo.com/html/?q={SEARCH_QUERY}" # الردود التلقائية الذكية - محدثة def auto_answer(message): message = message.strip().lower() # استعلامات البدء if message.startswith(("هل ابدأ", "ابدأ", "هل نبدأ", "ابدا", "نبدأ")): return "نعم ابدأ" # نعم/لا elif message in ["نعم", "لا", "نعم أو لا", "نعم او لا", "yes", "no"]: return "نعم" # خيارات (أو) elif "أو" in message or "او" in message or "or" in message: parts = message.split() for i, part in enumerate(parts): if part in ["أو", "او", "or"] and i > 0: return parts[i-1] # إرجاع الكلمة قبل "أو" return parts[0] if parts else "نعم" # استفسارات الرغبة elif message.startswith(("هل تريدني", "هل تود", "هل تبي", "اذا تبي", "هل ترغب")): return "نعم" # استفسارات الحاجة elif message.startswith("هل تحتاج"): return "نعم اكمل مع تفعيل الاجابات التلقائية" # استفسارات عامة elif message.startswith("ما هي") or message.startswith("ما هو"): return "ليس الآن، ركز على التعلم" # طلب التفاصيل elif "تفصيل" in message or "تفاصيل" in message or "detail" in message: return "ليس الآن، يمكنني البحث لاحقاً" # طلب المعلومات elif message.startswith("قول لي") or message.startswith("اخبرني") or message.startswith("tell me"): return "موافق، سأبحث عن المعلومة" # الجاهزية elif "جاهز" in message or "مستعد" in message or "ready" in message: return "ابدأ التعلم الآن" # استفسارات الرغبة المباشرة elif message.startswith("هل تريد") or message.startswith("do you want"): return "نعم" # متابعة العمل elif "هل تحتاج شيء آخر" in message or "هل تحتاج لشيء اخر" in message or "need anything else" in message: return "نعم اكمل مع تفعيل الاجابات التلقائية" # إضافة ردود جديدة elif any(word in message for word in ["شكرا", "thanks", "thank you", "متشكر"]): return "العفو، هل تريد المزيد من المساعدة؟" elif any(word in message for word in ["مرحبا", "hello", "hi", "السلام"]): return "مرحباً! كيف يمكنني مساعدتك في التعلم اليوم؟" elif any(word in message for word in ["وداعا", "bye", "مع السلامة", "غادر"]): return "إلى اللقاء! لا تنسى التعلم يومياً" return None # المجيب الذكي - محدث def generate_reply(message, username="مجهول"): global_memory = load_global_memory() # التحقق من الرد التلقائي أولاً auto = auto_answer(message) if auto: return auto # البحث في الذاكرة if message in global_memory: return global_memory[message] # البحث عن أقرب تطابق matches = get_close_matches(message, global_memory.keys(), n=1, cutoff=0.6) if matches: return global_memory[matches[0]] # معالجة الروابط if message.startswith(("http://", "https://", "www.")): # تصحيح الرابط إذا لزم الأمر corrected_url = fix_url(message) media_type = detect_media_type(corrected_url) if media_type == 'image': reply = f'صورة' elif media_type == 'video': reply = f'' elif media_type == 'audio': reply = f'' else: reply = f'رابط خارجي - اضغط هنا' # إضافة وصف للرابط reply += f"\n\nتم اكتشاف: {media_type}" else: # رد ذكي للمحتوى النصي if len(message) > 50: reply = f"رسالتك تحتوي على {len(message)} حرفاً. هل تريدني أن أبحث عن معلومات حول هذا الموضوع؟" else: # عكس النص كرد افتراضي مع تحسين reversed_text = message[::-1] reply = f"🤖 رد ذكي: {reversed_text}\n\nهل تريد شرحاً أكثر؟" # معالجة الروابط داخل النص if '//' in message and not message.startswith(('http://', 'https://')): words = message.split() corrected_words = [] for word in words: if '//' in word: corrected_word = fix_url(word) corrected_words.append(corrected_word) else: corrected_words.append(word) if corrected_words != words: reply += "\n\n🔗 الروابط المصححة: " + " ".join(corrected_words) # حفظ في الذاكرة إذا كان جديداً if message not in global_memory: global_memory[message] = reply save_global_memory(global_memory) return reply # تعليم تلقائي - محدث def fetch_learning_links(): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } try: print("🔍 جاري البحث عن مصادر تعليمية...") response = requests.get(SEARCH_ENGINE_URL, headers=headers, timeout=15) response.raise_for_status() soup = BeautifulSoup(response.text, "html.parser") print("✅ تم تحليل نتائج البحث بنجاح") except requests.exceptions.RequestException as e: print(f"❌ فشل في الاتصال بمصدر التعلم: {e}") return [] except Exception as e: print(f"❌ خطأ غير متوقع: {e}") return [] links = [] # البحث في نتائج البحث for a in soup.find_all("a", href=True, class_=True): href = a.get('href', '') if any(domain in href for domain in ['wikipedia', 'edx', 'coursera', 'khanacademy', 'ted.com', 'youtube.com/education']): clean_link = fix_url(href) if clean_link not in links: links.append(clean_link) print(f"📚 وجدت مصدر تعليمي: {clean_link}") # إذا لم نجد روابط تعليمية محددة، نأخذ أول 10 روابط if not links: for a in soup.find_all("a", href=True): href = a['href'] if href.startswith(('http://', 'https://', '//')): clean_link = fix_url(href) if clean_link not in links: links.append(clean_link) if len(links) >= 10: break return links[:10] def save_learned_links(links): try: data = { "timestamp": json.dumps(str(os.path.getctime(LEARNING_FILE)) if os.path.exists(LEARNING_FILE) else "new"), "links": links, "count": len(links) } with open(LEARNING_FILE, "w", encoding="utf-8") as f: json.dump(data, f, indent=2, ensure_ascii=False) print(f"💾 تم حفظ {len(links)} رابط في {LEARNING_FILE}") except Exception as e: print(f"❌ خطأ في حفظ الروابط: {e}") def load_learned_links(): try: if os.path.exists(LEARNING_FILE): with open(LEARNING_FILE, "r", encoding="utf-8") as f: data = json.load(f) return data.get("links", []) return [] except Exception as e: print(f"❌ خطأ في تحميل الروابط: {e}") return [] def auto_learn(): try: print("🚀 بدء عملية التعلم التلقائي...") # جلب الروابط الجديدة new_links = fetch_learning_links() if not new_links: print("⚠️ لم يتم العثور على روابط جديدة، استخدام الروابط المخزنة") new_links = load_learned_links() # حفظ الروابط save_learned_links(new_links) # تحديث الذاكرة العالمية memory = load_global_memory() links_added = 0 for link in new_links: if link not in memory: memory[link] = f"🎓 مصدر تعليمي: {link}" links_added += 1 save_global_memory(memory) print(f"✅ تم التعلّم التلقائي: {links_added} رابط جديد، {len(memory)} عنصر في الذاكرة") return new_links except Exception as e: print(f"❌ نورا: حدث خطأ أثناء التعلّم: {str(e)}") return [] # دالة مساعدة جديدة للبحث في الروابط المتعلمة def search_learned_links(keyword): """بحث في الروابط المتعلمة بناءً على كلمة مفتاحية""" links = load_learned_links() keyword = keyword.lower() matching_links = [] for link in links: if keyword in link.lower(): matching_links.append(link) return matching_links # دالة لاستعراض الروابط المتعلمة def list_learned_links(limit=5): """استعراض آخر الروابط المتعلمة""" links = load_learned_links() return links[:limit] if __name__ == "__main__": # اختبار الوحدة print("🧪 اختبار وحدة learner.py") # اختبار الردود التلقائية test_messages = ["هل ابدأ التعلم؟", "شكراً لك", "مرحبا", "ما هو أفضل موقع تعلم؟"] for msg in test_messages: response = generate_reply(msg) print(f"📨 '{msg}' → '{response}'") # اختبار التعلم التلقائي (اختياري) if input("🔍 هل تريد اختبار التعلم التلقائي؟ (نعم/لا): ").lower() in ["نعم", "yes", "y"]: links = auto_learn() print(f"📚 تم تعلم {len(links)} رابط")