File size: 3,554 Bytes
e7de9b0
 
924bed0
e7de9b0
 
 
924bed0
e7de9b0
 
 
 
924bed0
e7de9b0
 
 
924bed0
 
e7de9b0
 
924bed0
 
e7de9b0
924bed0
 
e7de9b0
924bed0
e7de9b0
924bed0
 
 
 
 
 
 
 
 
 
 
 
e7de9b0
924bed0
 
e7de9b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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()