import gradio as gr import os import pandas as pd from datetime import datetime, timedelta from apify_client import ApifyClient from google import genai from huggingface_hub import HfApi, hf_hub_download from dotenv import load_dotenv # تحميل الإعدادات load_dotenv() # إعداد العملاء والمفاتيح (Secrets) client_apify = ApifyClient(os.getenv("APIFY_TOKEN")) client_gemini = genai.Client(api_key=os.getenv("GEMINI_API_KEY")) DATASET_ID = "MZ14E/epssar-database" FILE_NAME = "security_logs.csv" LOCAL_PATH = f"/tmp/{FILE_NAME}" HF_TOKEN = os.getenv("HF_TOKEN") def save_to_database(tweet_text, analysis_result, risk_level): """دالة حفظ النتائج في الهقنق فيس""" try: try: file_path = hf_hub_download(repo_id=DATASET_ID, filename=FILE_NAME, repo_type="dataset", token=HF_TOKEN) df = pd.read_csv(file_path) except: df = pd.DataFrame(columns=["date", "tweet", "analysis", "risk_level"]) new_entry = { "date": datetime.now().strftime("%Y-%m-%d %H:%M"), "tweet": tweet_text, "analysis": analysis_result, "risk_level": risk_level } df = pd.concat([df, pd.DataFrame([new_entry])], ignore_index=True) df.to_csv(LOCAL_PATH, index=False) api = HfApi() api.upload_file(path_or_fileobj=LOCAL_PATH, path_in_repo=FILE_NAME, repo_id=DATASET_ID, repo_type="dataset", token=HF_TOKEN) return True except Exception as e: print(f"Database Error: {e}") return False def start_scanning(period_days): today = datetime.now().strftime('%Y-%m-%d') start_date = (datetime.now() - timedelta(days=int(period_days))).strftime('%Y-%m-%d') yield "🔎 جاري سحب البيانات من تويتر وتحليلها..." run_input = { "searchTerms": ["خيانة الوطن", "إشاعة مغرضة", "المساس بالسيادة"], "start": start_date, "end": today, "maxItems": 5, "place": "Saudi Arabia" } try: run = client_apify.actor("apidojo/tweet-scraper").call(run_input=run_input) tweets = [item.get("full_text") for item in client_apify.dataset(run["defaultDatasetId"]).iterate_items()] if not tweets: yield "❌ لم يتم العثور على محتوى مشبوه." return all_tweets_text = "\n---\n".join(tweets) prompt = f"أنت محلل أمني سعودي. حلل هذه التغريدات واستخرج التهديدات: {all_tweets_text}" response = client_gemini.models.generate_content(model="gemini-2.0-flash", contents=prompt) analysis = response.text # حفظ التقرير في قاعدة البيانات تلقائياً save_to_database(all_tweets_text[:500], analysis, "Medium/High") yield f"✅ تم التحليل والحفظ بنجاح:\n\n{analysis}" except Exception as e: yield f"⚠️ خطأ: {str(e)}" # واجهة Gradio with gr.Blocks(title="إبصار - الرصد الأمني") as demo: gr.Markdown("# 🛡️ نظام إبصار (EPSSAR)") with gr.Row(): btn_1 = gr.Button("آخر 24 ساعة") btn_3 = gr.Button("آخر 3 أيام") output = gr.Markdown() btn_1.click(fn=start_scanning, inputs=[gr.State(1)], outputs=output) btn_3.click(fn=start_scanning, inputs=[gr.State(3)], outputs=output) if __name__ == "__main__": demo.launch()