


فلش 32 گیگ کینگ استار KingStar Fire KS222(t)
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
import os
from datetime import datetime
class TechnosanChecker:
def __init__(self, username, password):
self.username = username
self.password = password
self.driver = None
self.results = []
def login(self):
"""ورود به سایت تکنوسان"""
print("در حال ورود به سایت تکنوسان...")
service = Service(ChromeDriverManager().install())
self.driver = webdriver.Chrome(service=service)
self.driver.get("https://technosan.ir/login")
try:
wait = WebDriverWait(self.driver, 10)
username_field = wait.until(EC.presence_of_element_located((By.NAME, "username")))
password_field = self.driver.find_element(By.NAME, "password")
username_field.send_keys(self.username)
password_field.send_keys(self.password)
login_button = self.driver.find_element(By.XPATH, "//button[@type='submit']")
login_button.click()
time.sleep(3)
print("ورود موفقیتآمیز بود!")
return True
except Exception as e:
print(f"خطا در لاگین: {e}")
return False
def check_product(self, url, original_price, row_index):
"""بررسی یک محصول خاص"""
try:
print(f"در حال بررسی محصول {row_index + 1}: {url}")
self.driver.get(url)
time.sleep(2)
try:
price_element = WebDriverWait(self.driver, 5).until(
EC.presence_of_element_located((By.CLASS_NAME, "product-price"))
)
current_price_text = price_element.text.strip()
current_price = self.clean_price(current_price_text)
price_changed = False
if current_price != original_price:
price_changed = True
print(f"⚠️ تغییر قیمت! قیمت قبلی: {original_price} - قیمت جدید: {current_price}")
is_available = self.check_availability()
return {
'row': row_index + 1,
'url': url,
'original_price': original_price,
'current_price': current_price,
'price_changed': price_changed,
'is_available': is_available,
'status': 'موجود' if is_available else 'ناموجود'
}
except TimeoutException:
print(f"❌ محصول در آدرس {url} پیدا نشد!")
return {
'row': row_index + 1,
'url': url,
'original_price': original_price,
'current_price': None,
'price_changed': False,
'is_available': False,
'status': 'صفحه پیدا نشد'
}
except Exception as e:
print(f"خطا در بررسی محصول {url}: {e}")
return {
'row': row_index + 1,
'url': url,
'original_price': original_price,
'current_price': None,
'price_changed': False,
'is_available': False,
'status': f'خطا: {str(e)[:50]}'
}
def clean_price(self, price_text):
"""پاکسازی قیمت از کاراکترهای اضافی"""
import re
numbers = re.sub(r'[^\d.]', '', price_text)
if numbers:
return float(numbers)
return None
def check_availability(self):
"""بررسی موجود بودن محصول"""
try:
out_of_stock_indicators = [
"ناموجود",
"اتمام موجودی",
"موجود نیست",
"out of stock"
]
page_text = self.driver.page_source.lower()
for indicator in out_of_stock_indicators:
if indicator in page_text:
return False
try:
stock_element = self.driver.find_element(By.CLASS_NAME, "stock-status")
if "ناموجود" in stock_element.text:
return False
except:
pass
return True
except:
return True
def process_excel(self, excel_file):
"""پردازش فایل اکسل"""
try:
df = pd.read_excel(excel_file)
required_columns = ['لینک', 'قیمت']
for col in required_columns:
if col not in df.columns:
print(f"❌ ستون '{col}' در فایل اکسل پیدا نشد!")
print("ستونهای موجود:", df.columns.tolist())
return False
print(f"✅ {len(df)} محصول برای بررسی پیدا شد.")
for index, row in df.iterrows():
url = row['لینک']
original_price = float(row['قیمت'])
result = self.check_product(url, original_price, index)
self.results.append(result)
self.save_temp_results()
time.sleep(1)
return True
except Exception as e:
print(f"خطا در پردازش فایل اکسل: {e}")
return False
def save_temp_results(self):
"""ذخیره موقت نتایج"""
temp_df = pd.DataFrame(self.results)
temp_df.to_excel("temp_results.xlsx", index=False)
def generate_report(self):
"""گزارش نهایی"""
if not self.results:
print("هیچ نتیجهای برای گزارش وجود ندارد.")
return
df = pd.DataFrame(self.results)
report_filename = f"report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
with pd.ExcelWriter(report_filename) as writer:
df.to_excel(writer, sheet_name='همه محصولات', index=False)
price_changed = df[df['price_changed'] == True]
if not price_changed.empty:
price_changed.to_excel(writer, sheet_name='تغییر قیمت', index=False)
unavailable = df[df['is_available'] == False]
if not unavailable.empty:
unavailable.to_excel(writer, sheet_name='ناموجود', index=False)
summary = pd.DataFrame({
'شرح': ['کل محصولات', 'تغییر قیمت', 'ناموجود', 'موجود'],
'تعداد': [
len(df),
len(price_changed),
len(unavailable),
len(df[df['is_available'] == True])
]
})
summary.to_excel(writer, sheet_name='خلاصه', index=False)
print(f"\n✅ گزارش نهایی در فایل {report_filename} ذخیره شد.")
print("\n📊 خلاصه گزارش:")
print(f"کل محصولات: {len(df)}")
print(f"تغییر قیمت: {len(price_changed)}")
print(f"ناموجود: {len(unavailable)}")
print(f"موجود: {len(df[df['is_available'] == True])}")
if not price_changed.empty:
print("\n⚠️ محصولات با تغییر قیمت:")
for _, row in price_changed.iterrows():
print(f" - سطر {row['row']}: {row['original_price']} -> {row['current_price']}")
if not unavailable.empty:
print("\n❌ محصولات ناموجود:")
for _, row in unavailable.iterrows():
print(f" - سطر {row['row']}: {row['url']}")
def close(self):
if self.driver:
self.driver.quit()
def run(self, excel_file):
try:
if not self.login():
return False
if not self.process_excel(excel_file):
return False
self.generate_report()
return True
except Exception as e:
print(f"خطا در اجرای برنامه: {e}")
return False
finally:
self.close()
def main():
# ========== تنظیمات کاربر ==========
USERNAME = "Hamidsoliemanie@gmail.com"
PASSWORD = "soliemanie"
EXCEL_FILE = "products.xlsx"
# ==================================
if not os.path.exists(EXCEL_FILE):
print(f"❌ فایل {EXCEL_FILE} پیدا نشد!")
print("لطفا یک فایل اکسل با ستونهای 'لینک' و 'قیمت' ایجاد کنید.")
return
checker = TechnosanChecker(USERNAME, PASSWORD)
checker.run(EXCEL_FILE)
if __name__ == "__main__":
main()