Home
Softono
vietfuel-api

vietfuel-api

Open source MIT JavaScript
37
Stars
4
Forks
5
Issues
1
Watchers
2 weeks
Last Commit

About vietfuel-api

Real-time Vietnam fuel prices API, aggregating data from 11+ official distributors.

Platforms

Web Self-hosted

Languages

JavaScript

VietFuelAPI Banner

VietFuelAPI

API giá xăng dầu Việt Nam thời gian thực — 11 Nguồn dữ liệu, 63 Tỉnh thành, Phân vùng 1 & 2 chuẩn xác.

License Refresh Cycle Data Sources 63 Provinces PRs Welcome

VietFuelAPI Mockup Vietnamese


English version: README.en.md


📖 Mục lục


👋 Giới thiệu

VietFuelAPI là dịch vụ API chuyên cung cấp dữ liệu giá xăng dầu bán lẻ tại Việt Nam theo định dạng JSON. Dữ liệu được tổng hợp từ 11 nguồn uy tín (bao gồm Petrolimex và các mirror Petrolimex, PVOil, Mipec, COMECO, Saigon Petro, PetroTimes, WebGia, GiaXangHomNay) và cập nhật tự động theo lịch điều hành (Nghị định 80/2023).

Hệ thống hỗ trợ tra cứu giá theo 63 tỉnh thành với phân biệt rõ ràng Vùng 1 (giá chuẩn) và Vùng 2 (giá cao hơn tối đa 2%) theo đúng quy định hiện hành.

[!IMPORTANT] Dự án này là dự án cộng đồng phục vụ học tập và nghiên cứu kỹ thuật, không đại diện cho bất kỳ tổ chức, doanh nghiệp hoặc cơ quan nhà nước nào.

✨ Tính năng nổi bật

  • 🚀 Hiệu năng cực cao: Dữ liệu phục vụ từ RAM (In-memory cache), độ trễ < 10ms.

  • 🔄 Cập nhật tự động: Adaptive Cron thông minh bắt nhịp chính xác chu kỳ điều chỉnh giá của nhà nước.

  • 🔗 11 nguồn dữ liệu: Tích hợp công nghệ Bot Stealth Fallback thông minh, vượt rào chống bot.

  • 🗺️ 63 Tỉnh thành: Tra cứu giá theo từng tỉnh/thành, bao gồm thông tin Vùng 1/2.

  • 🛡️ Phân vùng chính xác: Phân loại đúng 15 tỉnh Vùng 2 toàn tỉnh, 4 tỉnh bán phần (partial).

  • 🔒 Rate Limiting: Bảo vệ API khỏi lạm dụng (60 req/phút cho source quốc gia, 20 req/phút cho tỉnh thành).

  • 🌍 Cache-Control chuẩn HTTP: Hỗ trợ CDN caching, giúp người dùng cuối nhận data siêu nhanh.

  • 🔑 Không cần Auth: Mở cửa cho mọi nhà phát triển, hỗ trợ CORS đầy đủ.

🚀 Bắt đầu nhanh

# Clone repository
git clone https://github.com/TranQui004/vietfuel-api.git
cd vietfuel-api

# Cài đặt dependencies backend
cd backend
npm install

# Khởi chạy server (development)
npm run dev

Server mặc định tại: http://localhost:3000

Giao diện web được phục vụ cùng cổng backend:

  • Trang chủ: http://localhost:3000/
  • Live Data: http://localhost:3000/live

Nếu chạy từ thư mục gốc project:

npm --prefix backend run dev

🚀 Triển Khai Production (PM2)

Dự án đã bao gồm file ecosystem.config.js để triển khai với PM2 – tiêu chuẩn vận hành Node.js trên Server thật:

# Cài PM2 toàn cục (nếu chưa có)
npm install -g pm2

# Khởi động với PM2
pm2 start ecosystem.config.js --env production

# Quản lý tiến trình
pm2 status
pm2 logs vietfuel-api
pm2 restart vietfuel-api

📡 Danh sách Endpoint

Nhóm Quốc gia

Phương thức Endpoint Mô tả
GET /api/fuel-prices (Khuyên dùng) Trả về dữ liệu gộp từ các nguồn chuẩn xác nhất
GET /api/fuel-prices/:source Nguồn cụ thể: petrolimex, pvoil, mipec, comeco, saigonpetro, petrotimes, webgia, giaxanghomnay, ...

Tỉnh thành (on-demand)

Phương thức Endpoint Mô tả
GET /api/provinces Danh sách 63 tỉnh thành với id, slug, region
GET /api/provinces?region=2 Lọc chỉ tỉnh thuộc Vùng 2
GET /api/fuel-prices/province/:slug Giá xăng dầu theo tỉnh (VD: /api/fuel-prices/province/ha-noi)

Hệ thống

Phương thức Endpoint Mô tả
GET /api/health Trạng thái sức khoẻ toàn bộ 11 nguồn dữ liệu
GET /api/sources Danh sách 11 nguồn dữ liệu kèm trạng thái cache

Giao diện web

URL Mô tả
/ Trang chủ — tổng quan API
/live Live Dashboard — xem giá thực tế 11 nguồn
/endpoints API Reference — tài liệu đầy đủ
/playground API Playground — test endpoint trực tiếp trên trình duyệt

🗺️ Phân vùng giá xăng dầu

Theo quy định, giá xăng dầu tại Việt Nam được phân thành 2 vùng:

Vùng Mô tả Số tỉnh
Vùng 1 Địa bàn gần kho đầu mối, hạ tầng thuận lợi. Giá tiêu chuẩn. 43 tỉnh (toàn tỉnh)
Vùng 2 Địa bàn xa cảng, xa kho đầu mối, vùng sâu, vùng xa. Giá cao hơn tối đa 2%. 15 tỉnh (toàn tỉnh) + 4 tỉnh bán phần

15 tỉnh thuần Vùng 2: Hà Giang, Cao Bằng, Bắc Kạn, Tuyên Quang, Lào Cai, Điện Biên, Lai Châu, Sơn La, Yên Bái, Lạng Sơn, Kon Tum, Gia Lai, Đắk Lắk, Đắk Nông, Lâm Đồng.

4 tỉnh bán phần (một số huyện thuộc Vùng 2):

Tỉnh Huyện Vùng 2
Quảng Ninh Vân Đồn, Cô Tô, Hải Hà
Bình Thuận Phú Quý
Bà Rịa - Vũng Tàu Côn Đảo
Kiên Giang Phú Quốc, Kiên Hải

API trả về thêm field partialRegion: truevung2Districts cho 4 tỉnh này.

🛠️ Công nghệ sử dụng

  • Backend: Node.js v22+, Express, express-rate-limit, helmet, compression.
  • Scraping: node-fetch + cheerioHTTP-only, không Playwright/headless browser.
  • Cache: node-cache (In-memory) + disk persistence (cache.json).
  • Scheduler: node-cron — lịch thích ứng 3 chế độ theo Nghị định 80/2023/NĐ-CP:
    • T2–T4: 4 tiếng/lần (Checking)
    • T5, 14:30–16:00: 15 phút/lần (Hunting — khung giờ điều chỉnh giá)
    • T6–CN: 6 tiếng/lần (Maintenance)
  • Frontend: EJS templates + Vanilla CSS/JS — serve trực tiếp bởi Express (không framework JS riêng).
  • API Testing: API Playground tùy chỉnh tại /playground (thay thế Swagger UI).
  • Logging: Winston.

📁 Cấu trúc dự án

├── backend/
│   ├── index.js              # Entry point Express + static serving
│   ├── config/
│   │   └── index.js          # Cấu hình chung (port, URLs, cron, cache TTL)
│   ├── data/
│   │   └── provinces.json    # Từ điển 63 tỉnh thành (slug, region, districts)
│   ├── routes/
│   │   └── fuel.js           # Toàn bộ REST API endpoints
│   ├── services/
│   │   ├── scrapers/         # Mỗi file là một engine HTTP-only độc lập
│   │   │   ├── utils.js          # Hàm core dùng chung (parsePrice, UA pool, ...)
│   │   │   ├── petrolimex.js     # Petrolimex — Tier 0: VIEApps REST API
│   │   │   ├── pvoil.js          # PVOil — Tier 0: IP origin bypass Cloudflare
│   │   │   ├── pvoil-parser.js   # Parser HTML/text cho PVOil
│   │   │   ├── mipec.js          # Mipec — HTTP + cheerio
│   │   │   ├── comeco.js         # COMECO — HTTP + cheerio
│   │   │   ├── saigonpetro.js    # Saigon Petro — dynamic API
│   │   │   ├── petrotimes.js     # Petro Times — internal API
│   │   │   ├── webgia.js         # WebGia — HTTP + cheerio
│   │   │   └── giaxanghomnay.js  # GiaXangHomNay — HTTP + cheerio
│   │   ├── scraper.js        # Index tổng hợp — xuất tất cả scraper functions
│   │   └── cache.js          # In-memory cache (node-cache) + disk fallback
│   ├── workers/
│   │   └── jobs.js           # Adaptive Cron scheduler (3 chế độ)
│   ├── utils/
│   │   ├── logger.js         # Winston logger
│   │   └── fuel-helpers.js   # Helper tổng hợp: merge, normalize, sort
│   └── tests/
│       ├── scrapers/         # Smoke tests cho từng scraper
│       ├── api/              # API integration tests
│       └── run-all.js        # Chạy toàn bộ test suite
├── frontend/
│   ├── views/                # EJS templates (serve bởi Express)
│   │   ├── index.ejs         # Trang chủ
│   │   ├── live.ejs          # Live Data Dashboard
│   │   ├── endpoints.ejs     # API Reference
│   │   ├── playground.ejs    # API Playground (test endpoint tương tác)
│   │   └── partials/         # Header, Footer components
│   ├── css/
│   │   ├── style.css         # Global CSS
│   │   └── playground.css    # CSS riêng cho Playground
│   ├── js/
│   │   ├── live.js           # Live Data Dashboard logic
│   │   ├── playground.js     # API Playground logic
│   │   └── lang.js           # i18n (VI/EN)
│   └── brand/                # Logo, banner assets
├── docs/
│   ├── assets/               # Ảnh preview cho README
│   ├── vi/                   # Tài liệu tiếng Việt
│   └── en/                   # Tài liệu tiếng Anh
├── cache.json                # Disk persistence cache (root)
└── ecosystem.config.js       # Cấu hình PM2 cho production

📚 Tài liệu chi tiết

🤝 Pháp lý & Cộng đồng

Tài nguyên nên push lên GitHub

  • Toàn bộ mã nguồn backend/, frontend/, docs/
  • Các file markdown cộng đồng/pháp lý
  • Cấu hình chạy production (ecosystem.config.js)

Tài nguyên không nên push

  • node_modules/, logs/, file dump debug, cache runtime
  • Mọi file chứa credential hoặc thông tin nhạy cảm (.env)

⚖️ Giấy phép

Phân phối dưới giấy phép MIT. Xem LICENSE để biết thêm chi tiết.


VietFuelAPI Footer

© 2026 TranQui - GitHub: TranQui004
Built with ❤️ by Developers for Developers.