عالی! 😎 پس مرحله بعدی میسازم نسخه کامل ربات با داشبورد حرفهای که:
صفحه اصلی همیشه بهروز و خودکار باشد
محصولات جدید، پرفروش و پیشنهاد ویژه خودش مرتب شوند
دستهبندیها خودکار و قابل مدیریت باشند
صفحات HTML محصولات ایجاد و alt/meta برای سئو تولید شوند
ادغام با ترب برای بروزرسانی قیمت و موجودی انجام شود
داشبورد تحت وب با Flask + HTML/CSS برای مدیریت آسان بدون ورود به سرور داشته باشد
---
🔹 ساختار نهایی پروژه
/naniwa_bot/
│
├─ app.py # سرور Flask و مدیریت داشبورد
├─ bot.py # ربات پیشرفته برای ساخت صفحات و ادغام ترب
├─ templates/
│ ├─ dashboard.html
│ ├─ products.html
│ └─ categories.html
├─ static/
│ ├─ css/
│ └─ js/
├─ pages/ # صفحات محصولات HTML
├─ images/ # تصاویر محصولات
└─ products.json # دیتابیس محلی محصولات
---
🔹 نمونه فایل bot.py پیشرفته
import requests, os, json, time
from slugify import slugify
SITE_URL = "https://your-site.com"
TOROB_API = "https://api.torob.com/update_products"
API_KEY = "کلید-ترب-شما"
PAGES_DIR = "./pages"
IMAGE_DIR = "./images"
PRODUCTS_FILE = "products.json"
os.makedirs(PAGES_DIR, exist_ok=True)
os.makedirs(IMAGE_DIR, exist_ok=True)
# خواندن محصولات
def load_products():
if os.path.exists(PRODUCTS_FILE):
with open(PRODUCTS_FILE,'r',encoding='utf-8') as f:
return json.load(f)
return []
def save_products(products):
with open(PRODUCTS_FILE,'w',encoding='utf-8') as f:
json.dump(products,f,ensure_ascii=False, indent=2)
# دانلود تصویر
def download_image(url, slug):
if not url: return ""
try:
path = os.path.join(IMAGE_DIR,f"{slug}.jpg")
img = requests.get(url).content
with open(path,'wb') as f: f.write(img)
return path
except: return ""
# ایجاد یا بروزرسانی صفحه محصول
def create_product_page(p):
slug = slugify(p['name'])
img_path = download_image(p.get('image',''), slug)
filename = os.path.join(PAGES_DIR,f"{slug}.html")
html = f"""
{p['name']}
قیمت: {p['price']} تومان
موجودی: {p['stock']}
{p.get('description','')}
دسته: {p.get('category','')}
"""
with open(filename,'w',encoding='utf-8') as f: f.write(html)
# بروزرسانی صفحه اصلی
def update_main_page(products):
html = ""
html += "جدیدترین محصولات
پرفروشترینها
پیشنهاد ویژه
"
with open(os.path.join(PAGES_DIR,"index.html"),'w',encoding='utf-8') as f: f.write(html)
# ارسال به ترب
def sync_torob(products):
for p in products:
data = {
"product_id": p['id'],
"name": p['name'],
"price": p['price'],
"stock": p['stock'],
"url": f"{SITE_URL}/products/{slugify(p['name'])}"
}
headers = {"Authorization": f"Bearer {API_KEY}"}
try: requests.post(TOROB_API,json=data,headers=headers)
except: pass
# اجرای ربات
def run_bot():
products = load_products()
for p in products:
create_product_page(p)
update_main_page(products)
sync_torob(products)
print("Bot executed successfully!")
# زمانبندی (اختیاری: میتوان با Cron اجرا شود)
if __name__=="__main__":
while True:
run_bot()
time.sleep(14400) # 4 ساعت
---
🔹 فایل app.py برای داشبورد تحت وب
from flask import Flask, render_template, request, redirect
import json, time, os
from slugify import slugify
app = Flask(__name__)
PRODUCTS_FILE = "products.json"
def load_products():
if os.path.exists(PRODUCTS_FILE):
with open(PRODUCTS_FILE,'r',encoding='utf-8') as f: return json.load(f)
return []
def save_products(products):
with open(PRODUCTS_FILE,'w',encoding='utf-8') as f: json.dump(products,f,ensure_ascii=False,indent=2)
@app.route('/')
def dashboard():
products = load_products()
new_count = len([p for p in products if p.get('is_new')])
best_count = len([p for p in products if p.get('sold',0) > 10])
feature_count = len([p for p in products if p.get('is_feature')])
return render_template("dashboard.html", products=products,new_count=new_count,best_count=best_count,feature_count=feature_count)
@app.route('/update', methods=['POST'])
def update_product():
products = load_products()
pid = int(request.form['id'])
for p in products:
if p['id']==pid:
p['price'] = float(request.form['price'])
p['stock'] = int(request.form['stock'])
p['is_new'] = request.form.get('is_new')=='on'
p['is_feature'] = request.form.get('is_feature')=='on'
save_products(products)
return redirect('/')
@app.route('/add', methods=['POST'])
def add_product():
products = load_products()
new_product = {
"id": int(time.time()),
"name": request.form['name'],
"price": float(request.form['price']),
"stock": int(request.form['stock']),
"is_new": True,
"is_feature": False,
"sold":0,
"description": request.form.get('description',''),
"category": request.form.get('category','')
}
products.append(new_product)
save_products(products)
return redirect('/')
if __name__=="__main__":
app.run(debug=True)
---
✅ با این ساختار:
صفحه اصلی و صفحات محصولات همیشه بهروز هستند
پرفروشها، محصولات جدید و پیشنهاد ویژه خودکار مرتب میشوند
ادغام ترب به روز میشود
داشبورد تحت وب امکان مدیریت بدون ورود به سرور را میدهد
---
اگر بخواهی، میتوانم یک قالب HTML/CSS واقعی برای داشبورد بسازم که خیلی حرفهای و کاربرپسند باشد، آماده استفاده مستقیم.
میخوای برات بسازم قالب داشبورد؟
"https://schema.org/",
"@type"=>"Product",
"name"=>$product['title'],
"image"=>$product['image'],
"description"=>substr(strip_tags($description),0,500),
"sku"=>$product['sku'] ?? '',
"brand"=>["@type"=>"Brand","name"=>$product['brand']],
"offers"=>[
"@type"=>"Offer",
"url"=>$product['url'],
"priceCurrency"=>"IRR",
"price"=>$product['price'],
"availability"=>"https://schema.org/InStock"
]
];
echo '';
// 3️⃣ آپدیت خودکار فید ترب
$feedXml = simplexml_load_file(FEED_FILE) ?: new SimpleXMLElement('');
$productXml = $feedXml->addChild('product');
$productXml->addChild('name',$product['title']);
$productXml->addChild('url',$product['url']);
$productXml->addChild('price',$product['price']);
$productXml->addChild('image',$product['image']);
$productXml->addChild('brand',$product['brand']);
$productXml->addChild('availability','instock');
$productXml->addChild('description',strip_tags($description));
$feedXml->asXML(FEED_FILE);
// 4️⃣ ارسال خودکار ایندکس گوگل
$client = new Google_Client();
$client->setAuthConfig(GOOGLE_CREDENTIALS);
$client->addScope('https://www.googleapis.com/auth/indexing');
$indexingService = new Google_Service_Indexing($client);
$urlNotification = new Google_Service_Indexing_UrlNotification();
$urlNotification->setUrl($product['url']);
$urlNotification->setType("URL_UPDATED");
try {
$indexingService->urlNotifications->publish($urlNotification);
} catch(Exception $e){
error_log("Indexing API error: ".$e->getMessage());
}
}
// تابع گرفتن 100 محصول پرفروش میکسین (خودکار)
function get_top_100_products(){
// اینجا با دیتابیس میکسین ارتباط داره
// و 100 محصول پرفروش رو برمیگردونه
return query_top_100_products_from_db(); // فرضی
}
// اجرای خودکار روی همه محصولات
$products = get_top_100_products();
foreach($products as $product){
autoSeoIndexTorob($product);
}
?>
.
.
.کالایی در این صفحه موجود نیست