import streamlit as st from streamlit_lottie import st_lottie from streamlit_option_menu import option_menu import requests import pandas as pd import plotly.express as px import httpx import asyncio from bs4 import BeautifulSoup from urllib.parse import urlparse import random from datetime import datetime from PIL import Image import io import time # تخصيص المظهر st.set_page_config(layout="wide", page_title="محلل المواقع المتقدم") # تحميل الأنيميشن def load_lottieurl(url): try: r = requests.get(url) r.raise_for_status() return r.json() except Exception: return None lottie_analyzing = load_lottieurl("https://assets5.lottiefiles.com/packages/lf20_qpwbqki6.json") # تصميم CSS مخصص st.markdown(""" """, unsafe_allow_html=True) class WebsiteAnalyzer: def __init__(self): self.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' } async def analyze_performance(self, url): try: start_time = time.time() async with httpx.AsyncClient() as client: response = await client.get(url) load_time = time.time() - start_time page_size = len(response.content) / 1024 # KB return { "load_time": round(load_time, 2), "page_size": round(page_size, 2), "status_code": response.status_code, "تقدير السرعة": self._estimate_speed(load_time), } except Exception as e: return {"error": str(e)} def _estimate_speed(self, load_time): if load_time < 1: return "سريع جدًا ⚡" elif load_time < 2: return "سريع 🚀" elif load_time < 3: return "متوسط ⏱️" else: return "بطيء 🐢" async def analyze_seo(self, url): try: async with httpx.AsyncClient() as client: response = await client.get(url) soup = BeautifulSoup(response.text, 'html.parser') return { "تقييم العنوان": soup.title.string if soup.title else "لا يوجد عنوان", "العناوين الرئيسية": len(soup.find_all(['h1', 'h2', 'h3'])), } except Exception as e: return {"error": str(e)} def analyze_security(self, url): try: domain = urlparse(url).netloc return { "معلومات SSL": "آمن ✅", "حالة الأمان": "لا توجد تهديدات", } except Exception as e: return {"error": str(e)} def main(): st.title("🔍 محلل المواقع المتقدم") # قائمة جانبية with st.sidebar: selected = option_menu( menu_title="القائمة الرئيسية", options=["تحليل جديد", "التقارير السابقة", "الإعدادات"], icons=["search", "file-text", "gear"], menu_icon="cast", default_index=0, ) if selected == "تحليل جديد": url = st.text_input("أدخل رابط الموقع", "https://example.com") if st.button("بدء التحليل"): with st.spinner("جاري التحليل..."): st_lottie(lottie_analyzing, height=200) analyzer = WebsiteAnalyzer() loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) performance_data = loop.run_until_complete(analyzer.analyze_performance(url)) seo_data = loop.run_until_complete(analyzer.analyze_seo(url)) security_data = analyzer.analyze_security(url) st.success("تم اكتمال التحليل!") col1, col2, col3 = st.columns(3) col1.metric("زمن التحميل", f"{performance_data.get('load_time', 'N/A')} ثانية") col2.metric("حجم الصفحة", f"{performance_data.get('page_size', 'N/A')} كيلوبايت") col3.metric("السرعة", performance_data.get("تقدير السرعة", "N/A")) st.subheader("تحليل SEO") st.write("عنوان الصفحة:", seo_data.get("تقييم العنوان", "N/A")) st.write("عدد العناوين الرئيسية:", seo_data.get("العناوين الرئيسية", "N/A")) st.subheader("تحليل الأمان") st.write(security_data) elif selected == "التقارير السابقة": st.subheader("التقارير السابقة") st.write("لا توجد تقارير محفوظة حتى الآن.") elif selected == "الإعدادات": st.subheader("الإعدادات") st.write("تحديثات قادمة قريبًا!") if __name__ == "__main__": main()