Standalone autoposter cho Facebook Pages — upload ảnh/video + caption → lên lịch hoặc đăng ngay.
Tách ra từ Design Super Powers, không generate ảnh. User cung cấp media sẵn.
| Layer | Tech |
|---|---|
| Backend | FastAPI (Python 3.11+), SQLAlchemy v2, APScheduler |
| Frontend | React 18, Vite, TypeScript, Tailwind v4, shadcn/ui, Zustand, TanStack Query |
| DB | Share với Design Super Powers (Postgres/SQLite) |
| Auth | Single-user JWT (dev hardcode) |
| Storage | Local filesystem (backend/uploads/) |
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env # điền giá trị
python ../scripts/migrate.py # tạo bảng post_jobs + seed brand
uvicorn app.main:app --reload --port 8001Backend chạy ở http://localhost:8001.
cd frontend
npm install
cp .env.example .env.local
npm run dev # http://localhost:5201Project này dùng CÙNG DB với Design Super Powers gốc.
- Bảng share:
facebook_pages(đọc/ghi 2 chiều). Schema phải identical. - Bảng mới:
post_jobs(chỉ autopost dùng). - Brand placeholder: Khi autopost connect FB Page mới, gán
brand_id = "autopost-default". Migration sẽ seed brand này. - 2 scheduler không xung đột vì query 2 bảng khác nhau (
content_itemsvspost_jobs).
Nếu Design Super Powers thay đổi schema facebook_pages, phải đồng bộ ở project này.
| Method | Path | Mô tả |
|---|---|---|
| POST | /api/auth/login |
JWT login (single user) |
| GET | /api/facebook/pages |
Danh sách FB Page đã connect |
| POST | /api/facebook/connect |
Connect Page bằng token thủ công |
| POST | /api/facebook/discover-pages |
Lấy danh sách Page từ user token |
| POST | /api/facebook/bulk-connect |
Connect nhiều Page cùng lúc |
| GET | /api/facebook/oauth-url |
Lấy URL OAuth |
| GET | /api/facebook/oauth-callback |
Callback OAuth |
| POST | /api/upload |
Upload ảnh/video, trả về URL |
| GET | /api/jobs |
List post jobs (filter status, page) |
| POST | /api/jobs |
Tạo job (publish-now hoặc schedule) |
| GET | /api/jobs/{id} |
Detail |
| PATCH | /api/jobs/{id} |
Update job (chỉ khi queued) |
| POST | /api/jobs/{id}/publish-now |
Force publish ngay |
| DELETE | /api/jobs/{id} |
Hủy job |
| Loại | Endpoint FB Graph | Giới hạn |
|---|---|---|
| Ảnh đơn | /{page-id}/photos |
4MB, max 2048px |
| Carousel (ảnh) | /{page-id}/photos (unpublished) + /feed (attached_media) |
Tối đa 10 ảnh |
| Video feed | /{page-id}/videos |
1GB, mp4/mov |
| Reel | /{page-id}/video_reels (resumable upload) |
3-90s, 9:16, 1GB |
opa-autopost/
├── backend/
│ ├── app/
│ │ ├── main.py
│ │ ├── config.py
│ │ ├── database.py
│ │ ├── models/ # facebook_page, post_job
│ │ ├── schemas/ # auth, facebook, post_job
│ │ ├── routers/ # auth, facebook, upload, post
│ │ ├── services/ # facebook_publisher, scheduler, storage
│ │ └── utils/ # encryption, auth (JWT)
│ ├── uploads/
│ ├── requirements.txt
│ └── .env.example
├── frontend/ # Vite React TS
└── scripts/
└── migrate.py