EpsarUIUX / database_manager.py
MZ14E's picture
Update database_manager.py
e7de9b0 verified
Raw
History Blame Contribute Delete
3.55 kB
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()