Spaces:
Build error
Build error
| 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() |