|
import socket |
|
import requests |
|
from urllib.parse import urlparse |
|
from bs4 import BeautifulSoup |
|
import streamlit as st |
|
import matplotlib.pyplot as plt |
|
from reportlab.lib.pagesizes import letter |
|
from reportlab.pdfgen import canvas |
|
|
|
|
|
import geoip2.database |
|
|
|
def analyze_ip_free(url): |
|
try: |
|
domain = urlparse(url).netloc |
|
ip = socket.gethostbyname(domain) |
|
with geoip2.database.Reader('GeoLite2-City.mmdb') as reader: |
|
response = reader.city(ip) |
|
return { |
|
"ip": ip, |
|
"city": response.city.name or "Unknown", |
|
"region": response.subdivisions.most_specific.name or "Unknown", |
|
"country": response.country.name or "Unknown", |
|
"latitude": response.location.latitude or "Unknown", |
|
"longitude": response.location.longitude or "Unknown", |
|
} |
|
except Exception as e: |
|
return {"error": str(e)} |
|
|
|
|
|
def analyze_uptime_free(url): |
|
try: |
|
response = requests.get(url, timeout=5) |
|
return { |
|
"status": "Up" if response.status_code == 200 else "Down", |
|
"status_code": response.status_code, |
|
} |
|
except requests.exceptions.RequestException as e: |
|
return {"status": "Down", "error": str(e)} |
|
|
|
|
|
def analyze_seo_free(url): |
|
try: |
|
response = requests.get(url) |
|
soup = BeautifulSoup(response.text, 'html.parser') |
|
title = soup.title.string if soup.title else "No Title" |
|
meta_description = soup.find("meta", attrs={"name": "description"}) |
|
keywords = soup.find("meta", attrs={"name": "keywords"}) |
|
|
|
return { |
|
"title": title, |
|
"meta_description": meta_description["content"] if meta_description else "No Description", |
|
"keywords": keywords["content"] if keywords else "No Keywords", |
|
} |
|
except Exception as e: |
|
return {"error": str(e)} |
|
|
|
|
|
def analyze_carbon_free(url): |
|
try: |
|
response = requests.get(url) |
|
page_size = len(response.content) / 1024 |
|
co2_estimation = page_size * 0.02 |
|
return { |
|
"page_size_kb": round(page_size, 2), |
|
"estimated_co2_g": round(co2_estimation, 2), |
|
} |
|
except Exception as e: |
|
return {"error": str(e)} |
|
|
|
|
|
def draw_bar_chart(data, title, xlabel, ylabel): |
|
keys, values = list(data.keys()), list(data.values()) |
|
plt.figure(figsize=(8, 5)) |
|
plt.bar(keys, values, color='skyblue') |
|
plt.title(title) |
|
plt.xlabel(xlabel) |
|
plt.ylabel(ylabel) |
|
plt.tight_layout() |
|
plt.savefig('chart.png') |
|
plt.show() |
|
|
|
|
|
def export_to_pdf_free(results, file_path): |
|
c = canvas.Canvas(file_path, pagesize=letter) |
|
c.drawString(30, 750, "Website Analysis Report") |
|
c.drawString(30, 730, "=" * 50) |
|
y = 700 |
|
for section, content in results.items(): |
|
c.drawString(30, y, f"{section}:") |
|
y -= 20 |
|
for key, value in content.items(): |
|
c.drawString(50, y, f"- {key}: {value}") |
|
y -= 20 |
|
y -= 20 |
|
c.save() |
|
|
|
|
|
st.title("أداة تحليل المواقع") |
|
st.write("تحليل شامل للمواقع باستخدام أدوات مجانية") |
|
|
|
|
|
url = st.text_input("أدخل رابط الموقع:", "https://example.com") |
|
|
|
if url: |
|
st.subheader("1. تحليل عنوان IP والموقع الجغرافي") |
|
ip_data = analyze_ip_free(url) |
|
if "error" in ip_data: |
|
st.error(ip_data["error"]) |
|
else: |
|
st.json(ip_data) |
|
|
|
st.subheader("2. تحليل توافر الموقع") |
|
uptime_data = analyze_uptime_free(url) |
|
if "error" in uptime_data: |
|
st.error(uptime_data["error"]) |
|
else: |
|
st.json(uptime_data) |
|
|
|
st.subheader("3. تحليل تحسين محركات البحث (SEO)") |
|
seo_data = analyze_seo_free(url) |
|
if "error" in seo_data: |
|
st.error(seo_data["error"]) |
|
else: |
|
st.json(seo_data) |
|
|
|
st.subheader("4. تحليل الأثر البيئي") |
|
carbon_data = analyze_carbon_free(url) |
|
if "error" in carbon_data: |
|
st.error(carbon_data["error"]) |
|
else: |
|
st.json(carbon_data) |
|
|
|
|
|
st.subheader("رسم بياني لتحليل الأثر البيئي") |
|
co2_data = {"Page Size (KB)": carbon_data["page_size_kb"], "CO2 Emission (g)": carbon_data["estimated_co2_g"]} |
|
draw_bar_chart(co2_data, "Carbon Analysis", "Category", "Value") |
|
st.image("chart.png") |
|
|
|
st.subheader("5. تصدير التقرير إلى PDF") |
|
if st.button("تصدير التقرير"): |
|
results = { |
|
"IP Analysis": ip_data, |
|
"Uptime Analysis": uptime_data, |
|
"SEO Analysis": seo_data, |
|
"Carbon Analysis": carbon_data, |
|
} |
|
file_path = "website_analysis_report.pdf" |
|
export_to_pdf_free(results, file_path) |
|
st.success(f"تم تصدير التقرير إلى {file_path}") |
|
with open(file_path, "rb") as pdf_file: |
|
st.download_button("تحميل التقرير", data=pdf_file, file_name="website_analysis_report.pdf") |
|
|