Alimcptv / src / streamlit_app.py
Alikhani099961's picture
Rename src/app.py to src/ streamlit_app.py
dc943e8 verified
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)