import datetime import re # برای پردازش قیمت # import requests # فرض میکنیم که این کتابخانه در محیط شما موجود است # از lxml به جای xml.etree.ElementTree استفاده میکنیم برای سرعت و امکانات بیشتر from lxml import etree as ET from xml.dom import minidom # همچنان برای pretty print استفاده میشود # اگر requests در محیط شما موجود نیست، باید از urllib استفاده شود. # فعلا فرض میکنیم requests در دسترس است. try: import requests except ImportError: print("کتابخانه requests یافت نشد. لطفا آن را نصب کنید: pip install requests") # در صورت عدم وجود requests، کد زیر را فعال کنید و بخش requests را کامنت کنید # from urllib.request import urlopen # from urllib.error import URLError pass # استفاده از dict برای ذخیره محصولات و تبدیل به XML در انتها، میتواند حافظه را کمتر مصرف کند # اما برای سادگی، همچنان از ساختار ElementTree استفاده میکنیم. def create_torob_feed_optimized(): """ Optimized function to create a Torob feed XML from a given API. Uses lxml for faster XML processing and improved price handling. """ api_url = "https://lavasemkhangi.ir/api/torob/v3/products/" # نام فایل خروجی با فرمت تاریخ و زمان دقیقتر output_filename = f"torob_feed_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.xml" try: print(f"در حال دریافت اطلاعات از API: {api_url}") # استفاده از requests برای دریافت دادهها response = requests.get(api_url, timeout=30) # اضافه کردن timeout response.raise_for_status() # بررسی خطا در پاسخ API products_data = response.json() print(f"تعداد {len(products_data)} محصول دریافت شد.") if not products_data: print("هیچ محصولی از API دریافت نشد. فایل XML ایجاد نخواهد شد.") return None # 2. ایجاد ساختار XML پایه با استفاده از lxml # namespace برای سازگاری بهتر، اما برای ترب ممکن است لازم نباشد # root = ET.Element("products", nsmap={'': 'http://www.w3.org/2001/XMLSchema'}) # nsmap اختیاری است root = ET.Element("products") # 3. پردازش و تبدیل دادهها for product in products_data: product_element = ET.SubElement(root, "product") # -- استخراج و تبدیل فیلدهای مورد نیاز -- # این بخش باید بر اساس ساختار دقیق API شما و نیاز ترب تنظیم شود # شناسه محصول (ID) product_id = product.get('id') if product_id: ET.SubElement(product_element, "id").text = str(product_id) # نام محصول (Name) product_name = product.get('title') if product_name: ET.SubElement(product_element, "name").text = product_name # قیمت محصول (Price) # حذف کاراکترهای غیر عددی و اطمینان از اینکه قیمت به ریال است (اگر ترب نیاز به فرمت خاصی دارد) price = product.get('price') if price: try: # استفاده از regex برای حذف هرگونه کاراکتر غیر عددی # این روش قویتر از filter است اگر قیمت فرمتهای پیچیده داشته باشد price_str = re.sub(r'[^\d]', '', str(price)) if price_str: # اطمینان از اینکه قیمت به فرمت قابل قبول ترب است # مثال: اگر ترب نیاز به قیمت بدون جداکننده هزارگان دارد، این فرمت مناسب است ET.SubElement(product_element, "price").text = price_str except Exception as e: print(f"خطا در پردازش قیمت محصول {product_id if product_id else 'N/A'}: {e}") # میتوانید قیمت را خالی بگذارید یا یک مقدار پیشفرض مناسب قرار دهید pass # در صورت خطا، این فیلد برای محصول ایجاد نمیشود # لینک محصول (URL) product_url = product.get('url') if product_url: ET.SubElement(product_element, "url").text = product_url # لینک تصویر محصول (Image URL) image_url = product.get('image_url') if image_url: ET.SubElement(product_element, "image_url").text = image_url # توضیحات محصول (Description) - اختیاری description = product.get('description') if description: ET.SubElement(product_element, "description").text = description # افزودن فیلدهای دیگر در صورت نیاز (مانند برند، دستهبندی و...) # brand = product.get('brand') # if brand: # ET.SubElement(product_element, "brand").text = brand # 4. تولید فایل XML با فرمت خوانا # استفاده از lxml.etree.tostring و سپس minidom برای pretty print xml_bytes = ET.tostring(root, encoding='utf-8', xml_declaration=True) # pretty print با minidom dom = minidom.parseString(xml_bytes) pretty_xml_string = dom.toprettyxml(indent=" ", encoding='utf-8') with open(output_filename, "wb") as f: f.write(pretty_xml_string) print(f"فایل فید ترب بهینهسازی شده با موفقیت در مسیر زیر ایجاد شد: {output_filename}") return output_filename except requests.exceptions.Timeout: print(f"خطا: درخواست به API با timeout مواجه شد ({api_url})") return None except requests.exceptions.RequestException as e: print(f"خطا در دریافت اطلاعات از API: {e}") return None except ET.XMLSyntaxError as e: print(f"خطا در پردازش XML: {e}") return None except Exception as e: # خطای کلی برای موارد پیشبینی نشده print(f"خطای غیرمنتظره در پردازش و تولید فایل XML: {e}") return None # برای اجرای کد بهینهسازی شده: # create_torob_feed_optimized() import requests api_url = "https://lavasemkhangi.ir/api/torob/v3/products/" try: response = requests.get(api_url) response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx) products_data = response.json() print(products_data) # در اینجا میتوانید با دادههای دریافتی محصولات کار کنید # مثلاً آنها را در پایگاه داده خود ذخیره کنید یا به فرمت دیگری تبدیل کنید except requests.exceptions.RequestException as e: print(f"An error occurred: {e}") import requests import xml.etree.ElementTree as ET from xml.dom import minidom import datetime def create_torob_feed(): api_url = "https://lavasemkhangi.ir/api/torob/v3/products/" output_filename = f"torob_feed_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.xml" try: # 1. فراخوانی API print(f"در حال دریافت اطلاعات از API: {api_url}") response = requests.get(api_url) response.raise_for_status() # بررسی خطا در پاسخ API products_data = response.json() print(f"تعداد {len(products_data)} محصول دریافت شد.") # 2. ایجاد ساختار XML پایه برای ترب # این ساختار باید بر اساس مستندات ترب تنظیم شود # مثال زیر یک ساختار فرضی است root = ET.Element("products") # 3. پردازش و تبدیل دادهها for product in products_data: product_element = ET.SubElement(root, "product") # استخراج و تبدیل فیلدهای مورد نیاز - این بخش باید بر اساس ساختار API شما و نیاز ترب تنظیم شود # مثال: فرض کنید API شما 'id', 'title', 'price', 'url', 'image_url', 'description' دارد # شناسه محصول (اگر API شما شناسه منحصر به فردی دارد) if 'id' in product: ET.SubElement(product_element, "id").text = str(product['id']) # نام محصول if 'title' in product: ET.SubElement(product_element, "name").text = product['title'] # قیمت محصول (فرض میکنیم قیمت به ریال است و باید به فرمت عددی باشد) if 'price' in product: try: # حذف هرگونه کاراکتر غیر عددی و تبدیل به عدد صحیح price_str = ''.join(filter(str.isdigit, str(product['price']))) if price_str: ET.SubElement(product_element, "price").text = price_str except Exception as e: print(f"خطا در پردازش قیمت محصول {product.get('id', 'N/A')}: {e}") # میتوانید قیمت را خالی بگذارید یا یک مقدار پیشفرض قرار دهید pass # لینک محصول if 'url' in product: ET.SubElement(product_element, "url").text = product['url'] # لینک تصویر محصول if 'image_url' in product: ET.SubElement(product_element, "image_url").text = product['image_url'] # توضیحات محصول (اختیاری، اما برای سئو مفید است) if 'description' in product: ET.SubElement(product_element, "description").text = product['description'] # در صورت نیاز، فیلدهای دیگر مانند برند، دسته بندی و ... را اضافه کنید # if 'brand' in product: # ET.SubElement(product_element, "brand").text = product['brand'] # 4. تولید فایل XML با فرمت خوانا xml_string = ET.tostring(root, encoding='utf-8') # استفاده از minidom برای فرمتدهی زیباتر XML (indentation) dom = minidom.parseString(xml_string) pretty_xml_as_string = dom.toprettyxml(indent=" ", encoding='utf-8') with open(output_filename, "wb") as f: f.write(pretty_xml_as_string) print(f"فایل فید ترب با موفقیت در مسیر زیر ایجاد شد: {output_filename}") return output_filename except requests.exceptions.RequestException as e: print(f"خطا در دریافت اطلاعات از API: {e}") return None except Exception as e: print(f"خطا در پردازش و تولید فایل XML: {e}") return None # اجرای تابع برای ایجاد فید # create_torob_feed()
شماره سفارش: $order_id
مبلغ: $amount تومان
سفارش شما ثبت شد و در حال پردازش است.
در صورت کسر وجه، مبلغ طی 72 ساعت برگشت میخورد.
🎁 کد تخفیف ویژه اولین خرید: naniwa | ارسال سریع به سراسر کشور 🚀.