Files
botAffilate/serverPython/main.py
T

110 lines
4.0 KiB
Python

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
from automation import ShopeeBot
from typing import Optional
import logging
import os
import sys
import urllib.request
import uuid
import threading
from collections import defaultdict
from facebook_bot import FacebookBot
# Quản lý hàng đợi (Lock) cho từng thiết bị
device_locks = defaultdict(threading.Lock)
# Cấu hình logging: ghi log ra cả màn hình (console) và file (shopee_bot.log)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler("shopee_bot.log", encoding="utf-8"),
logging.StreamHandler(sys.stdout)
]
)
app = FastAPI(title="n8n Shopee Bridge API")
class CommissionRequest(BaseModel):
link: str
# Cho phép truyền IP linh hoạt từ n8n.
device_ip: Optional[str] = Field(default=None, description="IP:Port của điện thoại, ví dụ 192.168.1.100:5555 (WiFi) hoặc 10.8.0.5:5555 (VPN)")
from typing import Optional, Any
class FacebookCommentRequest(BaseModel):
device_ip: Optional[str] = Field(default=None, description="IP:Port của điện thoại (Cấu hình trên n8n)")
group_id: Any
content: str
image_url: Optional[str] = None
@app.post("/get_commission")
def get_commission_endpoint(req: CommissionRequest):
if not req.link:
raise HTTPException(status_code=400, detail="Thiếu link sản phẩm")
try:
# Lấy IP theo độ ưu tiên
raw_ip = req.device_ip or os.environ.get("DEVICE_IP") or ""
lock_key = raw_ip if raw_ip else "default_device"
# Dùng Lock để xếp hàng: Nếu điện thoại đang bận, request sau phải chờ
with device_locks[lock_key]:
logging.info(f"Đã khóa thiết bị {lock_key} để chạy tác vụ Shopee.")
bot = ShopeeBot(device_ip=raw_ip)
result = bot.get_commission_rate(req.link)
# Nếu đã có status thì gộp thẳng các thuộc tính của result vào JSON trả về
if isinstance(result, dict) and "status" in result:
return result
return {
"status": "success",
"commission": result
}
except Exception as e:
logging.error(f"Lỗi API: {str(e)}")
raise HTTPException(status_code=500, detail=str(e))
@app.post("/post_facebook_comment")
def post_facebook_comment(req: FacebookCommentRequest):
try:
raw_ip = req.device_ip or os.environ.get("DEVICE_IP") or ""
lock_key = raw_ip if raw_ip else "default_device"
with device_locks[lock_key]:
logging.info(f"Đã khóa thiết bị {lock_key} để chạy tác vụ Facebook.")
bot = FacebookBot(device_ip=raw_ip)
local_image_path = None
if req.image_url:
# Tải ảnh về máy chủ Python tạm thời
local_image_path = f"temp_fb_{uuid.uuid4().hex}.jpg"
urllib.request.urlretrieve(str(req.image_url), local_image_path)
logging.info(f"Đã tải ảnh tạm thời: {local_image_path}")
result = bot.post_comment(str(req.group_id), str(req.content), local_image_path)
# Dọn dẹp ảnh tạm sau khi xong
if local_image_path and os.path.exists(local_image_path):
os.remove(local_image_path)
logging.info(f"Đã xóa ảnh tạm: {local_image_path}")
if isinstance(result, dict) and "status" in result:
if result["status"] == "error":
raise HTTPException(status_code=500, detail=result.get("message"))
return result
return {"status": "success", "message": "Hoàn tất"}
except Exception as e:
logging.error(f"Lỗi API Facebook: {str(e)}")
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
import uvicorn
# Chạy server API ở cổng 8000
uvicorn.run(app, host="0.0.0.0", port=8000)