Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import time | |
| import threading | |
| import json | |
| import smtplib | |
| import requests | |
| from email.mime.text import MimeText | |
| from email.mime.multipart import MimeMultipart | |
| from selenium import webdriver | |
| from selenium.webdriver.chrome.options import Options | |
| from selenium.webdriver.common.by import By | |
| from selenium.webdriver.support.ui import WebDriverWait | |
| from selenium.webdriver.support import expected_conditions as EC | |
| from webdriver_manager.chrome import ChromeDriverManager | |
| from selenium.webdriver.chrome.service import Service | |
| from transformers import AutoTokenizer, AutoModelForCausalLM | |
| import torch | |
| from streamlit_option_menu import option_menu | |
| from streamlit_chat import message | |
| import pandas as pd | |
| import schedule | |
| # وارد کردن ماژولهای سفارشی | |
| try: | |
| from chatbot import get_chatbot, get_conversation_manager | |
| from web_automation import get_web_automation, get_web_commands | |
| from tradingview_monitor import get_tradingview_monitor | |
| except ImportError: | |
| st.error("خطا در وارد کردن ماژولها. لطفاً مطمئن شوید که تمام فایلها موجود هستند.") | |
| # تنظیمات صفحه | |
| st.set_page_config( | |
| page_title="سیستم اتوماسیون وب هوشمند", | |
| page_icon="🤖", | |
| layout="wide", | |
| initial_sidebar_state="expanded" | |
| ) | |
| # CSS سفارشی برای بهبود ظاهر | |
| st.markdown(""" | |
| <style> | |
| .main-header { | |
| background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); | |
| padding: 1rem; | |
| border-radius: 10px; | |
| color: white; | |
| text-align: center; | |
| margin-bottom: 2rem; | |
| } | |
| .chat-container { | |
| background-color: #f8f9fa; | |
| border-radius: 10px; | |
| padding: 1rem; | |
| margin: 1rem 0; | |
| } | |
| .notification-container { | |
| background-color: #e8f5e8; | |
| border-radius: 10px; | |
| padding: 1rem; | |
| margin: 1rem 0; | |
| border-left: 4px solid #28a745; | |
| } | |
| .browser-container { | |
| background-color: #fff3cd; | |
| border-radius: 10px; | |
| padding: 1rem; | |
| margin: 1rem 0; | |
| border-left: 4px solid #ffc107; | |
| } | |
| .stButton > button { | |
| background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); | |
| color: white; | |
| border: none; | |
| border-radius: 5px; | |
| padding: 0.5rem 1rem; | |
| font-weight: bold; | |
| } | |
| .stButton > button:hover { | |
| background: linear-gradient(90deg, #764ba2 0%, #667eea 100%); | |
| } | |
| .status-card { | |
| background-color: #f8f9fa; | |
| border-radius: 10px; | |
| padding: 1rem; | |
| margin: 0.5rem 0; | |
| border-left: 4px solid #007bff; | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| # راهاندازی session state | |
| if "chatbot" not in st.session_state: | |
| st.session_state.chatbot = None | |
| if "web_automation" not in st.session_state: | |
| st.session_state.web_automation = None | |
| if "tradingview_monitor" not in st.session_state: | |
| st.session_state.tradingview_monitor = None | |
| if "conversation_manager" not in st.session_state: | |
| st.session_state.conversation_manager = None | |
| # هدر اصلی | |
| st.markdown(""" | |
| <div class="main-header"> | |
| <h1>🤖 سیستم اتوماسیون وب هوشمند</h1> | |
| <p>سیستم کاملی برای اتوماسیون وب، چتبات هوشمند و نظارت بر TradingView</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # منوی اصلی | |
| selected = option_menu( | |
| menu_title=None, | |
| options=["🏠 خانه", "🌐 مرورگر", "💬 چتبات", "📊 TradingView", "⚙️ تنظیمات"], | |
| icons=["house", "globe", "chat-dots", "graph-up", "gear"], | |
| menu_icon="cast", | |
| default_index=0, | |
| orientation="horizontal", | |
| styles={ | |
| "container": {"padding": "0!important", "background-color": "#fafafa"}, | |
| "icon": {"color": "orange", "font-size": "25px"}, | |
| "nav-link": { | |
| "font-size": "16px", | |
| "text-align": "center", | |
| "margin": "0px", | |
| "--hover-color": "#eee", | |
| }, | |
| "nav-link-selected": {"background-color": "#667eea"}, | |
| } | |
| ) | |
| # بخش خانه | |
| if selected == "🏠 خانه": | |
| col1, col2 = st.columns([2, 1]) | |
| with col1: | |
| st.markdown("## 🎯 قابلیتهای سیستم") | |
| st.markdown(""" | |
| ### 🌐 مرورگر اتوماتیک | |
| - مرور خودکار وبسایتها با Selenium | |
| - انجام عملیات پیچیده بر روی صفحات وب | |
| - تفسیر دستورات فارسی | |
| - تست خودکار عملیات | |
| ### 💬 چتبات هوشمند | |
| - پشتیبانی کامل از زبان فارسی | |
| - استفاده از مدل Gemma2_Farsi | |
| - درک دستورات پیچیده اتوماسیون | |
| - راهنمایی گام به گام | |
| ### 📊 نظارت بر TradingView | |
| - نظارت بر 5 اندیکاتور همزمان (RSI, MACD, EMA, Bollinger, Stochastic) | |
| - تشخیص همگرایی سیگنالها | |
| - ارسال اعلان فوری | |
| - پشتیبانی از ایمیل و وبهوک | |
| ### ⚙️ تنظیمات پیشرفته | |
| - تنظیمات SMTP برای ایمیل | |
| - پیکربندی وبهوک JSON | |
| - دکمههای تست برای همه قابلیتها | |
| - نظارت 24 ساعته با کرونجاب | |
| """) | |
| with col2: | |
| st.markdown("## 📈 آمار سیستم") | |
| # وضعیت چتبات | |
| if st.session_state.chatbot is None: | |
| chatbot_status = "آماده راهاندازی" | |
| chatbot_color = "🟡" | |
| else: | |
| chatbot_status = "آنلاین" | |
| chatbot_color = "🟢" | |
| # وضعیت مرورگر | |
| if st.session_state.web_automation is None: | |
| browser_status = "آماده راهاندازی" | |
| browser_color = "🟡" | |
| else: | |
| browser_status = "آنلاین" | |
| browser_color = "🟢" | |
| # وضعیت TradingView | |
| if st.session_state.tradingview_monitor is None: | |
| tv_status = "آماده راهاندازی" | |
| tv_color = "🟡" | |
| else: | |
| tv_status = "آنلاین" | |
| tv_color = "🟢" | |
| st.markdown('<div class="status-card">', unsafe_allow_html=True) | |
| st.metric("وضعیت چتبات", chatbot_status, chatbot_color) | |
| st.metric("وضعیت مرورگر", browser_status, browser_color) | |
| st.metric("وضعیت TradingView", tv_status, tv_color) | |
| st.markdown('</div>', unsafe_allow_html=True) | |
| # دکمه راهاندازی سریع | |
| if st.button("🚀 راهاندازی سریع همه سیستمها"): | |
| with st.spinner("در حال راهاندازی..."): | |
| try: | |
| # راهاندازی چتبات | |
| if st.session_state.chatbot is None: | |
| st.session_state.chatbot = get_chatbot() | |
| # راهاندازی اتوماسیون وب | |
| if st.session_state.web_automation is None: | |
| st.session_state.web_automation = get_web_automation() | |
| # راهاندازی مانیتور TradingView | |
| if st.session_state.tradingview_monitor is None: | |
| st.session_state.tradingview_monitor = get_tradingview_monitor() | |
| st.success("✅ همه سیستمها با موفقیت راهاندازی شدند!") | |
| st.rerun() | |
| except Exception as e: | |
| st.error(f"خطا در راهاندازی: {str(e)}") | |
| # بخش مرورگر | |
| elif selected == "🌐 مرورگر": | |
| st.markdown('<div class="browser-container">', unsafe_allow_html=True) | |
| st.markdown("## 🌐 مرورگر اتوماتیک") | |
| # راهاندازی اتوماسیون وب | |
| if st.session_state.web_automation is None: | |
| if st.button("🔧 راهاندازی مرورگر"): | |
| with st.spinner("در حال راهاندازی مرورگر..."): | |
| st.session_state.web_automation = get_web_automation() | |
| st.success("مرورگر آماده است!") | |
| st.rerun() | |
| else: | |
| # ورودی URL | |
| url = st.text_input("🔗 آدرس وبسایت را وارد کنید:", placeholder="https://example.com") | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| if st.button("🚀 باز کردن وبسایت"): | |
| if url: | |
| success, message = st.session_state.web_automation.navigate_to_url(url) | |
| if success: | |
| st.success(message) | |
| else: | |
| st.error(message) | |
| else: | |
| st.error("لطفاً آدرس وبسایت را وارد کنید") | |
| with col2: | |
| if st.button("📸 عکس از صفحه"): | |
| image, message = st.session_state.web_automation.take_screenshot() | |
| if image: | |
| st.success(message) | |
| st.image(image, caption="اسکرینشات صفحه", use_column_width=True) | |
| else: | |
| st.error(message) | |
| with col3: | |
| if st.button("🔄 بازخوانی صفحه"): | |
| if url: | |
| success, message = st.session_state.web_automation.navigate_to_url(url) | |
| if success: | |
| st.success("صفحه بازخوانی شد") | |
| else: | |
| st.error(message) | |
| else: | |
| st.info("ابتدا آدرس وبسایت را وارد کنید") | |
| # بخش دستورات | |
| st.markdown("### 🎯 دستورات اتوماسیون") | |
| command = st.text_input("دستور خود را به فارسی وارد کنید:", | |
| placeholder="مثال: روی دکمه ورود کلیک کن") | |
| if st.button("▶️ اجرای دستور"): | |
| if command: | |
| web_commands = get_web_commands(st.session_state.web_automation) | |
| result = web_commands.execute_command(command) | |
| if len(result) == 3: # اگر عکس هم برگردانده شده | |
| success, message, image = result | |
| if success: | |
| st.success(message) | |
| if image: | |
| st.image(image, caption="نتیجه دستور", use_column_width=True) | |
| else: | |
| st.error(message) | |
| else: | |
| success, message = result | |
| if success: | |
| st.success(message) | |
| else: | |
| st.error(message) | |
| else: | |
| st.error("لطفاً دستور خود را وارد کنید") | |
| # نمایش وبسایت (iframe) | |
| if url: | |
| st.markdown("### 👀 نمایش وبسایت:") | |
| try: | |
| st.components.v1.iframe(url, height=600, scrolling=True) | |
| except: | |
| st.warning("امکان نمایش این وبسایت در iframe وجود ندارد") | |
| st.markdown('</div>', unsafe_allow_html=True) | |
| # بخش چتبات | |
| elif selected == "💬 چتبات": | |
| st.markdown('<div class="chat-container">', unsafe_allow_html=True) | |
| st.markdown("## 💬 چتبات هوشمند") | |
| # راهاندازی چتبات | |
| if st.session_state.chatbot is None: | |
| if st.button("🔧 راهاندازی چتبات"): | |
| with st.spinner("در حال راهاندازی چتبات..."): | |
| st.session_state.chatbot = get_chatbot() | |
| st.session_state.conversation_manager = get_conversation_manager() | |
| st.success("چتبات آماده است!") | |
| st.rerun() | |
| else: | |
| # Initialize chat history | |
| if "messages" not in st.session_state: | |
| st.session_state.messages = [] | |
| st.session_state.messages.append({ | |
| "role": "assistant", | |
| "content": "سلام! من دستیار هوشمند شما هستم. چه کاری میتوانم برایتان انجام دهم؟\n\n🌐 **دستورات مرورگر:**\n- وبسایت [آدرس] را باز کن\n- روی دکمه [نام] کلیک کن\n- عکس از صفحه بگیر\n\n📊 **دستورات TradingView:**\n- نظارت بر [نماد] را شروع کن\n- وضعیت اندیکاتورها را نشان بده\n\n⚙️ **تنظیمات:**\n- ایمیل را تنظیم کن\n- وبهوک را تست کن" | |
| }) | |
| # Display chat messages | |
| for i, message_data in enumerate(st.session_state.messages): | |
| if message_data["role"] == "user": | |
| message(message_data["content"], is_user=True, key=f"user_{i}") | |
| else: | |
| message(message_data["content"], key=f"bot_{i}") | |
| # Chat input | |
| user_input = st.chat_input("پیام خود را اینجا بنویسید...") | |
| if user_input: | |
| # Add user message to chat history | |
| st.session_state.messages.append({"role": "user", "content": user_input}) | |
| # Generate bot response | |
| try: | |
| bot_response = st.session_state.chatbot.chat(user_input) | |
| # اگر دستور مربوط به اتوماسیون وب است | |
| if any(word in user_input.lower() for word in ['وبسایت', 'کلیک', 'مرورگر']): | |
| if st.session_state.web_automation: | |
| web_commands = get_web_commands(st.session_state.web_automation) | |
| result = web_commands.execute_command(user_input) | |
| if len(result) >= 2: | |
| success, message = result[:2] | |
| if success: | |
| bot_response += f"\n\n✅ عملیات انجام شد: {message}" | |
| else: | |
| bot_response += f"\n\n❌ خطا در انجام عملیات: {message}" | |
| else: | |
| bot_response += "\n\n⚠️ مرورگر راهاندازی نشده است. لطفاً ابتدا به بخش مرورگر بروید." | |
| except Exception as e: | |
| bot_response = f"متأسفم، خطایی رخ داد: {str(e)}" | |
| # Add bot response to chat history | |
| st.session_state.messages.append({"role": "assistant", "content": bot_response}) | |
| # Update conversation manager | |
| if st.session_state.conversation_manager: | |
| st.session_state.conversation_manager.add_message("user", user_input) | |
| st.session_state.conversation_manager.add_message("assistant", bot_response) | |
| # Rerun to update the chat | |
| st.rerun() | |
| # دکمه پاک کردن تاریخچه | |
| if st.button("🗑️ پاک کردن تاریخچه"): | |
| st.session_state.messages = [] | |
| if st.session_state.conversation_manager: | |
| st.session_state.conversation_manager.clear_history() | |
| st.rerun() | |
| st.markdown('</div>', unsafe_allow_html=True) | |
| # بخش TradingView | |
| elif selected == "📊 TradingView": | |
| st.markdown("## 📊 نظارت بر TradingView") | |
| # راهاندازی مانیتور | |
| if st.session_state.tradingview_monitor is None: | |
| if st.button("🔧 راهاندازی مانیتور TradingView"): | |
| with st.spinner("در حال راهاندازی..."): | |
| st.session_state.tradingview_monitor = get_tradingview_monitor() | |
| st.success("مانیتور TradingView آماده است!") | |
| st.rerun() | |
| else: | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.markdown("### ⚙️ تنظیمات نظارت") | |
| # انتخاب نماد | |
| symbol = st.text_input("📈 نماد مورد نظر:", value="BTCUSDT", placeholder="BTCUSDT") | |
| # انتخاب تایم فریم | |
| timeframe = st.selectbox("⏰ تایم فریم:", ["1m", "5m", "15m", "1h", "4h", "1d"]) | |
| # فاصله بررسی | |
| check_interval = st.number_input("🔄 فاصله بررسی (ثانیه):", min_value=30, max_value=3600, value=60) | |
| # تنظیمات اندیکاتورها | |
| st.markdown("#### 🔧 اندیکاتورها:") | |
| indicators = {} | |
| indicators["RSI"] = st.checkbox("RSI (Relative Strength Index)", value=True) | |
| indicators["MACD"] = st.checkbox("MACD", value=True) | |
| indicators["EMA"] = st.checkbox("EMA (Exponential Moving Average)", value=True) | |
| indicators["Bollinger"] = st.checkbox("Bollinger Bands", value=True) | |
| indicators["Stochastic"] = st.checkbox("Stochastic Oscillator", value=True) | |
| # دکمههای کنترل | |
| col_start, col_stop = st.columns(2) | |
| with col_start: | |
| if st.button("🚀 شروع نظارت"): | |
| success, message = st.session_state.tradingview_monitor.start_monitoring( | |
| symbol, timeframe, check_interval | |
| ) | |
| if success: | |
| st.success(message) | |
| else: | |
| st.error(message) | |
| with col_stop: | |
| if st.button("⏹️ توقف نظارت"): | |
| success, message = st.session_state.tradingview_monitor.stop_monitoring() | |
| if success: | |
| st.success(message) | |
| else: | |
| st.error(message) | |
| with col2: | |
| st.markdown("### 📊 وضعیت فعلی") | |
| # دریافت وضعیت | |
| status = st.session_state.tradingview_monitor.get_status() | |
| # نمایش وضعیت کلی | |
| if status["is_monitoring"]: | |
| st.success("🟢 نظارت فعال است") | |
| else: | |
| st.info("🟡 نظارت غیرفعال است") | |
| # نمایش وضعیت اندیکاتورها (نمونه) | |
| st.markdown("#### 📈 وضعیت اندیکاتورها:") | |
| # جمعآوری اندیکاتورها برای نمایش | |
| if st.button("🔄 بررسی فوری اندیکاتورها"): | |
| indicators_data = st.session_state.tradingview_monitor.collect_all_indicators() | |
| if indicators_data: | |
| for indicator, data in indicators_data.items(): | |
| signal = data.get("signal", "نامشخص") | |
| if signal == "خرید": | |
| color = "🟢" | |
| elif signal == "فروش": | |
| color = "🔴" | |
| else: | |
| color = "🟡" | |
| st.markdown(f"{color} **{indicator}**: {signal}") | |
| # بررسی همگرایی | |
| convergence, conv_message = st.session_state.tradingview_monitor.check_signal_convergence() | |
| if convergence: | |
| st.success(f"🎯 همگرایی سیگنال: {conv_message}") | |
| else: | |
| st.info(f"📊 وضعیت: {conv_message}") | |
| else: | |
| st.warning("اطلاعات اندیکاتورها در دسترس نیست") | |
| # نمایش آخرین بررسی | |
| st.markdown("#### ⏰ آخرین بررسی:") | |
| st.info(f"آخرین بررسی: {time.strftime('%Y-%m-%d %H:%M:%S')}") | |
| # نمایش آخرین سیگنالها | |
| if status["last_signals"]: | |
| st.markdown("#### 📋 آخرین سیگنالها:") | |
| for symbol_name, signal_data in status["last_signals"].items(): | |
| st.markdown(f"**{symbol_name}**: {signal_data['message']}") | |
| st.caption(f"زمان: {signal_data['timestamp']}") | |
| # بخش تنظیمات | |
| elif selected == "⚙️ تنظیمات": | |
| st.markdown('<div class="notification-container">', unsafe_allow_html=True) | |
| st.markdown("## ⚙️ تنظیمات سیستم") | |
| # راهاندازی مانیتور برای تنظیمات | |
| if st.session_state.tradingview_monitor is None: | |
| st.session_state.tradingview_monitor = get_tradingview_monitor() | |
| tab1, tab2, tab3 = st.tabs(["📧 تنظیمات ایمیل", "🔗 تنظیمات وبهوک", "🧪 تست اعلانها"]) | |
| with tab1: | |
| st.markdown("### 📧 تنظیمات SMTP ایمیل") | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| smtp_server = st.text_input("🌐 سرور SMTP:", value="smtp.gmail.com") | |
| smtp_port = st.number_input("🔌 پورت SMTP:", value=587, min_value=1, max_value=65535) | |
| email_user = st.text_input("👤 نام کاربری ایمیل:", placeholder="your-email@gmail.com") | |
| with col2: | |
| email_password = st.text_input("🔐 رمز عبور ایمیل:", type="password") | |
| recipient_email = st.text_input("📬 ایمیل گیرنده:", placeholder="recipient@gmail.com") | |
| email_subject = st.text_input("📝 موضوع ایمیل:", value="اعلان TradingView") | |
| # فعال/غیرفعال کردن ایمیل | |
| email_enabled = st.checkbox("📧 فعال کردن اعلانهای ایمیل", value=False) | |
| # دکمههای عمل | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| if st.button("📧 تست ارسال ایمیل"): | |
| if email_user and email_password and recipient_email: | |
| # بهروزرسانی تنظیمات | |
| email_settings = { | |
| "email": { | |
| "enabled": True, | |
| "smtp_server": smtp_server, | |
| "smtp_port": smtp_port, | |
| "username": email_user, | |
| "password": email_password, | |
| "recipient": recipient_email, | |
| "subject": email_subject | |
| } | |
| } | |
| st.session_state.tradingview_monitor.update_notification_settings(email_settings) | |
| # تست ارسال | |
| success, message = st.session_state.tradingview_monitor.test_email_notification() | |
| if success: | |
| st.success("✅ ایمیل تست با موفقیت ارسال شد!") | |
| st.info("لطفاً صندوق ورودی خود را بررسی کنید.") | |
| else: | |
| st.error(f"❌ خطا در ارسال ایمیل: {message}") | |
| else: | |
| st.error("لطفاً تمام فیلدهای ضروری را پر کنید.") | |
| with col2: | |
| if st.button("💾 ذخیره تنظیمات ایمیل"): | |
| email_settings = { | |
| "email": { | |
| "enabled": email_enabled, | |
| "smtp_server": smtp_server, | |
| "smtp_port": smtp_port, | |
| "username": email_user, | |
| "password": email_password, | |
| "recipient": recipient_email, | |
| "subject": email_subject | |
| } | |
| } | |
| success, message = st.session_state.tradingview_monitor.update_notification_settings(email_settings) | |
| if success: | |
| st.success("✅ تنظیمات ایمیل ذخیره شد!") | |
| else: | |
| st.error(f"❌ خطا در ذخیره: {message}") | |
| with tab2: | |
| st.markdown("### 🔗 تنظیمات وبهوک") | |
| webhook_url = st.text_input("🌐 آدرس وبهوک:", placeholder="https://your-webhook-url.com/webhook") | |
| webhook_method = st.selectbox("📡 روش ارسال:", ["POST", "GET", "PUT"]) | |
| st.markdown("#### 📋 محتوای JSON:") | |
| webhook_payload = st.text_area("📄 محتوای پیام JSON:", | |
| value='{\n "message": "سیگنال TradingView دریافت شد",\n "symbol": "BTCUSDT",\n "timestamp": "2024-01-01 12:00:00"\n}', | |
| height=150) | |
| # فعال/غیرفعال کردن وبهوک | |
| webhook_enabled = st.checkbox("🔗 فعال کردن اعلانهای وبهوک", value=False) | |
| # دکمههای عمل | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| if st.button("🔗 تست ارسال وبهوک"): | |
| if webhook_url: | |
| try: | |
| payload = json.loads(webhook_payload) | |
| except: | |
| payload = {} | |
| # بهروزرسانی تنظیمات | |
| webhook_settings = { | |
| "webhook": { | |
| "enabled": True, | |
| "url": webhook_url, | |
| "method": webhook_method, | |
| "payload": payload | |
| } | |
| } | |
| st.session_state.tradingview_monitor.update_notification_settings(webhook_settings) | |
| # تست ارسال | |
| success, message = st.session_state.tradingview_monitor.test_webhook_notification() | |
| if success: | |
| st.success("✅ وبهوک تست با موفقیت ارسال شد!") | |
| st.info("لطفاً سرور مقصد خود را بررسی کنید.") | |
| else: | |
| st.error(f"❌ خطا در ارسال وبهوک: {message}") | |
| else: | |
| st.error("لطفاً آدرس وبهوک را وارد کنید.") | |
| with col2: | |
| if st.button("💾 ذخیره تنظیمات وبهوک"): | |
| try: | |
| payload = json.loads(webhook_payload) | |
| except: | |
| payload = {} | |
| webhook_settings = { | |
| "webhook": { | |
| "enabled": webhook_enabled, | |
| "url": webhook_url, | |
| "method": webhook_method, | |
| "payload": payload | |
| } | |
| } | |
| success, message = st.session_state.tradingview_monitor.update_notification_settings(webhook_settings) | |
| if success: | |
| st.success("✅ تنظیمات وبهوک ذخیره شد!") | |
| else: | |
| st.error(f"❌ خطا در ذخیره: {message}") | |
| with tab3: | |
| st.markdown("### 🧪 تست اعلانها") | |
| st.markdown("#### 📧 تست سریع ایمیل:") | |
| test_email_message = st.text_area("پیام تست ایمیل:", value="این یک پیام تست است.") | |
| if st.button("📧 ارسال ایمیل تست"): | |
| success, message = st.session_state.tradingview_monitor.test_email_notification() | |
| if success: | |
| st.success("✅ ایمیل تست ارسال شد!") | |
| else: | |
| st.error(f"❌ خطا: {message}") | |
| st.markdown("#### 🔗 تست سریع وبهوک:") | |
| test_webhook_message = st.text_area("پیام تست وبهوک:", value='{"test": "این یک پیام تست است"}') | |
| if st.button("🔗 ارسال وبهوک تست"): | |
| success, message = st.session_state.tradingview_monitor.test_webhook_notification() | |
| if success: | |
| st.success("✅ وبهوک تست ارسال شد!") | |
| else: | |
| st.error(f"❌ خطا: {message}") | |
| st.markdown("#### 📊 تست کامل سیستم:") | |
| if st.button("🧪 تست کامل همه قابلیتها"): | |
| with st.spinner("در حال تست تمام قابلیتها..."): | |
| results = [] | |
| # تست چتبات | |
| try: | |
| if st.session_state.chatbot: | |
| results.append("✅ تست چتبات: موفق") | |
| else: | |
| results.append("⚠️ تست چتبات: راهاندازی نشده") | |
| except: | |
| results.append("❌ تست چتبات: خطا") | |
| # تست مرورگر | |
| try: | |
| if st.session_state.web_automation: | |
| results.append("✅ تست مرورگر: موفق") | |
| else: | |
| results.append("⚠️ تست مرورگر: راهاندازی نشده") | |
| except: | |
| results.append("❌ تست مرورگر: خطا") | |
| # تست ایمیل | |
| try: | |
| success, _ = st.session_state.tradingview_monitor.test_email_notification() | |
| if success: | |
| results.append("✅ تست ایمیل: موفق") | |
| else: | |
| results.append("❌ تست ایمیل: خطا") | |
| except: | |
| results.append("❌ تست ایمیل: خطا") | |
| # تست وبهوک | |
| try: | |
| success, _ = st.session_state.tradingview_monitor.test_webhook_notification() | |
| if success: | |
| results.append("✅ تست وبهوک: موفق") | |
| else: | |
| results.append("❌ تست وبهوک: خطا") | |
| except: | |
| results.append("❌ تست وبهوک: خطا") | |
| time.sleep(2) | |
| # نمایش نتایج | |
| for result in results: | |
| if "✅" in result: | |
| st.success(result) | |
| elif "⚠️" in result: | |
| st.warning(result) | |
| else: | |
| st.error(result) | |
| st.success("🎉 تست کامل سیستم انجام شد!") | |
| st.markdown('</div>', unsafe_allow_html=True) | |
| # فوتر | |
| st.markdown("---") | |
| st.markdown(""" | |
| <div style="text-align: center; color: #666; padding: 1rem;"> | |
| <p>🤖 سیستم اتوماسیون وب هوشمند | ساخته شده برای Hugging Face Spaces</p> | |
| <p>نسخه 1.0 | پشتیبانی کامل از زبان فارسی | مجهز به چتبات Gemma2_Farsi</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |