// npm install puppeteer node-fetch const puppeteer = require('puppeteer'); const fetch = require('node-fetch'); // ⚙️ تنظیمات const SITE_URL = 'https://yoursite.com/admin/products'; // صفحه محصولات میکسین const USERNAME = 'username_اینجا'; const PASSWORD = 'password_اینجا'; const API_KEY = "API_KEY_خودت_اینجا"; const SHOP_ID = "SHOP_ID_خودت_اینجا"; const API_URL = "https://api.trebsale.com/v1/products"; // تابع ارسال محصول به ترب async function sendProduct(product) { try { const response = await fetch(API_URL, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(product) }); const data = await response.json(); if (response.ok) { console.log(`✅ محصول '${product.title}' ارسال شد`, data); return true; } else { console.error(`❌ خطا در ارسال '${product.title}':`, data); return false; } } catch (err) { console.error(`❌ خطای شبکه برای '${product.title}':`, err); return false; } } // تابع اصلی Puppeteer async function run() { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); // ورود به پنل میکسین await page.goto(SITE_URL, { waitUntil: 'networkidle2' }); await page.type('#username', USERNAME); // جایگزین با selector واقعی await page.type('#password', PASSWORD); await page.click('#login-button'); // جایگزین با selector واقعی await page.waitForNavigation({ waitUntil: 'networkidle2' }); // گرفتن محصولات جدید از جدول const products = await page.evaluate(() => { // ⚠️ باید selector واقعی جدول محصولات سایت شما جایگزین شود const rows = Array.from(document.querySelectorAll('table#products tbody tr')); return rows.map(row => ({ title: row.querySelector('.product-title').innerText.trim(), price: parseInt(row.querySelector('.product-price').innerText.replace(/\D/g,'')), sku: row.querySelector('.product-sku').innerText.trim(), stock: parseInt(row.querySelector('.product-stock').innerText), description: row.querySelector('.product-description').innerText.trim() })); }); console.log(`محصولات پیدا شده: ${products.length}`); // ارسال هر محصول به ترب for (const product of products) { await sendProduct(product); } await browser.close(); console.log("✅ ارسال خودکار تمام شد!"); } // اجرا هر 5 دقیقه run(); setInterval(run, 5 * 60 * 1000); . {{ product.name }} from flask import Flask, request, jsonify, render_template import requests import json from jinja2 import Template # ======== Load config ======== with open("config.json") as f: config = json.load(f) ACCESS_TOKEN = config["access_token"] SITE_URL = config["site_url"] BRAND_NAME = config["brand_name"] INDEXING_API_URL = "https://indexing.googleapis.com/v3/urlNotifications:publish" app = Flask(__name__, template_folder="templates") def notify_google(product_url): headers = { "Content-Type": "application/json", "Authorization": f"Bearer {ACCESS_TOKEN}" } data = { "url": product_url, "type": "URL_UPDATED" } response = requests.post(INDEXING_API_URL, headers=headers, json=data) return response.status_code, response.text # ======== Webhook endpoint ======== @app.route("/google-indexing", methods=["POST"]) def google_indexing(): data = request.json product_slug = data.get("slug") if not product_slug: return jsonify({"error": "No product slug provided"}), 400 product_data = { "name": data.get("name"), "short_description": data.get("short_description"), "description": data.get("description"), "sku": data.get("sku"), "price": data.get("price"), "image_url": data.get("image_url"), "tags": data.get("tags", []), "url": f"{SITE_URL}/product/{product_slug}" } # Render template HTML (Optional: برای ایندکس بهتر گوگل) template = render_template("product_template.html", product=product_data, brand_name=BRAND_NAME) with open(f"rendered_products/{product_slug}.html", "w", encoding="utf-8") as f: f.write(template) # Notify Google Indexing API status, result = notify_google(product_data["url"]) return jsonify({"status": status, "result": result}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000) /* شبکه محصولات 4 ستونه شفاف */ .products, .product-list, .products-grid { display: grid !important; grid-template-columns: repeat(4, 1fr); gap: 18px; } /* موبایل و تبلت */ @media (max-width: 992px) { .products, .product-list, .products-grid { grid-template-columns: repeat(2, 1fr); } } /* کارت محصول */ .product, .product-card { background: #ffffff; border: 1px solid #eeeeee; border-radius: 12px; padding: 12px; } /* عکس محصول */ .product img, .product-card img { width: 100%; border-radius: 10px; } /* قیمت */ .price { font-size: 18px; font-weight: bold; color: #1b5e20; } /* دکمه خرید */ .add-to-cart, button[type="submit"] { background-color: #2e7d32; color: #ffffff; border-radius: 8px; padding: 10px; } …سایر محتوا…
جستجو در محصولات
کالایی در این صفحه موجود نیست
    پروفایلسبد خریددسته‌بندیخانه