new-term-radar
Daily radar for new AI terms: names of new models, products and repos, caught on X, Hugging Face, GitHub and sitemaps before keyword tools list them.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
MX Ad Spy — MVP theo dõi quảng cáo Facebook/Instagram đa thị trường Công cụ nội bộ, quy mô nhỏ, dùng để hỗ trợ nghiên cứu creative đối thủ. Bắt đầu từ thị trường Mexico, từ 16/09/2026 mở rộng thêm Mỹ, Hàn Quốc, Thái Lan, Malaysia (danh sách đầy đủ nằm trong MARKETS ở server/src/config/keywords.js — thêm/bớt thị trường chỉ cần sửa đúng 1 file này, xem ghi chú trong file). ⚠️ CẬP NHẬT QUAN TRỌNG — đổi nguồn dữ liệu (đọc trước khi làm gì khác)查看完整 README ↗
Công cụ nội bộ, quy mô nhỏ, dùng để hỗ trợ nghiên cứu creative đối thủ. Bắt đầu từ thị trường Mexico,
từ 16/09/2026 mở rộng thêm Mỹ, Hàn Quốc, Thái Lan, Malaysia, rồi từ 26/10/2026 thu hẹp lại chỉ còn
Mexico và Mỹ, chỉ ngành Mỹ phẩm & Làm đẹp (danh sách đầy đủ nằm trong MARKETS ở
server/src/config/keywords.js — thêm/bớt thị trường chỉ cần sửa đúng 1 file này, xem ghi chú trong
file). Dữ liệu cũ của KR/TH/MY và ngành Thời trang vẫn còn trong DB, chỉ không quét mới nữa.
Bản thiết kế ban đầu dùng Meta Ad Library API chính thức để lấy dữ liệu. Sau khi triển khai
thật và test trực tiếp qua Graph API Explorer, phát hiện: theo tài liệu chính thức tại
facebook.com/ads/library/api, API này chỉ trả dữ liệu cho (1) quảng cáo về vấn đề xã hội/bầu
cử/chính trị ở bất kỳ đâu, hoặc (2) quảng cáo bất kỳ loại nào nhưng chỉ nếu phân phối đến
EU/UK. Mexico không thuộc EU/UK, và mỹ phẩm không phải quảng cáo chính trị — nên với đúng mục
tiêu ban đầu của dự án, API chính thức luôn trả lỗi/rỗng, bất kể tài khoản có được Meta duyệt
quyền ads_read hay hoàn tất xác minh danh tính hay không. Đây là giới hạn sản phẩm cố định của
Meta, không phải lỗi cấu hình.
Giải pháp đang dùng: scrape trực tiếp trang facebook.com/ads/library (trang public, không
cần đăng nhập) bằng Playwright — xem server/src/lib/adLibraryScraper.js. META_ACCESS_TOKEN
không còn cần thiết cho luồng lấy dữ liệu chính nữa (vẫn giữ trong secrets phòng khi cần dùng lại
Graph API — ví dụ nếu mở rộng sang EU/UK).
Điều khoản dịch vụ của Meta cấm truy cập/scrape tự động ngoài API chính thức được cấp phép, kể cả với trang public không cần đăng nhập. Rủi ro thực tế:
fetch_runs), không mất dữ liệu đã có, nhưng sẽ ngừng cập nhật cho đến khi xử lý.Đây là quyết định đánh đổi có chủ đích giữa nhóm dự án — chấp nhận rủi ro thấp để đổi lấy dữ liệu thật tại thị trường Mexico, vì không có con đường hợp pháp/chính thức nào khác cho use case này. Nếu job bắt đầu lỗi liên tục, đó là tín hiệu để tạm dừng cron và xem lại, không phải để cố né bằng cách đổi proxy/User-Agent.
Với quảng cáo thương mại thông thường (không phải chính trị/xã hội), Meta không công khai qua bất kỳ kênh nào — kể cả trang public: spend, impressions (lượt hiển thị), reach, CTR, conversion, ROAS. Đây là giới hạn chính sách của Meta — áp dụng cho MỌI tool, kể cả PiPiADS/BigSpy. Không có cách nào lấy được các số này của đối thủ, hợp pháp hay không.
Những gì tool này lấy được, và mức độ tin cậy:
| Dữ liệu | Nguồn | Độ tin cậy |
|---|---|---|
| Creative (text), tên Page, ngày bắt đầu chạy | Scrape trang Ad Library public (Playwright) | Best-effort — parse theo cấu trúc/vị trí văn bản, không có selector ổn định, có thể hỏng khi Meta đổi giao diện |
| Like / Comment / Share / Lượt xem video | Render trang snapshot công khai bằng Playwright | Best-effort — chỉ có khi ad gắn với 1 bài post công khai; Meta đổi giao diện có thể làm parser hỏng bất kỳ lúc nào |
| Spend, Impressions, ROAS | — | Không khả dụng, không cố lấy |
days_active (độ bền chạy) là tín hiệu proxy quan trọng nhất: quảng cáo chạy càng lâu thường
đồng nghĩa đang có lời — vì không ai giữ một quảng cáo lỗ chạy mãi.
GitHub Actions (cron hàng ngày)
└─ fetchAds.js
├─ Playwright → scrape facebook.com/ads/library công khai → creative + ngày bắt đầu (mọi ad)
└─ Playwright → like/comment/share (chỉ ad MỚI, giới hạn số lượng/lần chạy)
└─ ghi vào Postgres (Supabase/Neon)
Render/Railway (backend Express, read-only API)
└─ đọc từ Postgres, trả JSON cho frontend
Vercel (frontend Next.js)
└─ gọi backend API, hiển thị bảng lọc được
Không có bước nào tự lưu trữ lại video/ảnh creative — chỉ lưu link snapshot_url trỏ về đúng
trang gốc của Meta. Điều này vừa giảm chi phí storage, vừa tránh rủi ro tái phân phối bản quyền
creative của người khác.
Từ khi chuyển sang scrape trang public (xem mục "CẬP NHẬT QUAN TRỌNG" ở đầu file), bước này
không còn cần thiết để job chạy được — fetchAds.js không gọi Graph API nữa. Chỉ làm bước
này nếu sau này quay lại dùng metaAdLibrary.js (ví dụ mở rộng sang EU/UK):
META_ACCESS_TOKEN.
Lưu ý: token tạo từ Graph API Explorer thường hết hạn sau ~1-2 giờ (dùng để test). Khi vận hành
thật, cần đổi sang long-lived token hoặc token của System User trong Business Settings để
không phải đổi token mỗi ngày — bước này có thể cần xác minh thêm quy trình App Review tùy chính
sách Meta tại thời điểm bạn triển khai, vì chính sách có thể thay đổi.cd server
cp .env.example .env # điền DATABASE_URL vừa lấy
npm install
npm run migrate
server/ lên một GitHub repo.server.npm install — Start command: npm start.DATABASE_URL, META_ACCESS_TOKEN, CORS_ORIGIN (điền sau khi có domain frontend ở Bước 4).https://ten-app.onrender.com — không cần mua domain riêng.web/ lên GitHub repo (có thể cùng repo, khác thư mục).web.NEXT_PUBLIC_API_BASE = domain backend ở Bước 3.https://ten-app.vercel.app.CORS_ORIGIN = domain Vercel vừa có, redeploy backend.DATABASE_URL và META_ACCESS_TOKEN.server/src/config/keywords.js.ads trong Supabase có dữ liệu hợp lệ, TRƯỚC KHI để lịch tự động chạy hàng ngày.Về thời gian chạy sau khi thu hẹp phạm vi (26/10/2026): tổng số lượt quét hiện tại là 56 lượt
(MX 37, US 19, toàn bộ ngành Mỹ phẩm & Làm đẹp) — giảm từ ~124 lượt trước đó (MX 48, US 30,
KR 15, TH 15, MY 16). Job chạy tuần tự, giãn cách 4 giây/lượt
(DELAY_BETWEEN_KEYWORDS_MS trong fetchAds.js) cộng thêm thời gian scrape thật mỗi lượt (biến động
theo tải Meta lúc đó) — ước tính RUNTIME TỔNG sẽ tăng tương ứng theo tỷ lệ số lượt (~30%). Số phút
CHÍNH XÁC chỉ biết được sau khi xem log thời gian thực tế ở tab Actions (mỗi lần chạy đều ghi rõ
thời gian bắt đầu/kết thúc) — nếu vượt quá giới hạn 6 giờ/lần chạy của GitHub Actions free tier (rất
khó xảy ra ở quy mô này) hoặc job bắt đầu timeout, đó là dấu hiệu cần giảm MAX_PAGES_PER_KEYWORD
hoặc tách job theo thị trường thay vì chạy gộp 1 lần.
Vì sao cần tính năng này: ô tìm kiếm trên web chỉ lọc TRONG số quảng cáo đã quét sẵn từ danh
sách từ khóa cố định ở server/src/config/keywords.js (job fetch-daily.yml chạy mỗi sáng) — KHÔNG
tìm trực tiếp trên Meta Ad Library. Nếu bạn gõ 1 từ khóa/thương hiệu chưa từng nằm trong danh sách đó
(VD: "Seyoul", hoặc 1 đối thủ mới xuất hiện), ô tìm kiếm sẽ luôn ra 0 kết quả — KHÔNG PHẢI lỗi hay
do dữ liệu chưa nạp xong. Dùng workflow dưới đây để quét thử 1 lần, không cần sửa code.
Lưu ý: không tức thời như search thật — cần vào GitHub thao tác tay, mất khoảng 1-3 phút. Đây là
lựa chọn CHỦ ĐỘNG (không tự động hoàn toàn trong app) — vì backend đang chạy trên Render free tier
không cài được trình duyệt để tự quét, và không muốn thêm token bảo mật mới chỉ để làm việc đó (xem
thêm lý do trong server/src/jobs/fetchOneKeyword.js).
Từ 15/09/2026 — có sẵn trợ giúp ngay trong web: khi gõ vào ô tìm kiếm mà không ra kết quả, trang web tự hiện 1 khung "Không thấy...?" ngay bên dưới, đã điền sẵn từ khóa + tự đoán ngành hàng (dựa vào các từ mô tả trong từ khóa, VD gõ "sérum facial" sẽ tự đoán ra "Mỹ phẩm & Làm đẹp" — tên thương hiệu không có từ mô tả như "Seyoul" thì để trống, bạn tự chọn) — chỉ cần bấm "Sao chép thông tin cần điền" rồi "Mở trang chạy quét trên GitHub", dán vào 3 ô của form là xong, đỡ phải tự gõ lại từ đầu như hướng dẫn thủ công bên dưới.
Các bước (làm thủ công, hoặc theo khung gợi ý ở trên):
Seyoul).MX, US).server/src/lib/guessCategory.js), hoặc
chọn tay ngành hàng duy nhất đang theo dõi (Mỹ phẩm & Làm đẹp) nếu muốn chắc chắn. Chỉ ảnh hưởng
cách hiển thị/phân loại, không ảnh hưởng kết quả quét.Về lâu dài: nếu 1 từ khóa/thương hiệu quét thử ra kết quả tốt và bạn muốn theo dõi THƯỜNG XUYÊN
(không phải chỉ tra 1 lần), hãy thêm hẳn vào danh sách cố định ở server/src/config/keywords.js để
nó được quét lại mỗi ngày cùng job chính — workflow này chỉ dành cho tra cứu phát sinh, không thay
thế danh sách theo dõi thường xuyên.
.env nằm trong .gitignore — secret không bao giờ commit vào git.GET — không có endpoint ghi/xóa dữ liệu công khai.$1, $2...) — không nối chuỗi, không có SQL injection.zod trước khi chạm DB (đã test: gửi tham số sai kiểu/vượt giới hạn bị chặn với lỗi rõ ràng, không crash server).helmet() + cors() giới hạn đúng domain frontend (không để *).try/catch riêng — 1 từ khóa lỗi không làm sập cả job, lỗi được ghi vào bảng fetch_runs để chẩn đoán thay vì mất dấu vết.MAX_PAGES_PER_KEYWORD, MAX_NEW_ADS_FOR_ENGAGEMENT_PER_RUN) — tránh vượt rate limit Meta và tránh job chạy quá lâu.npm audit: backend đã sửa hết (0 vulnerability). Frontend còn 1 vulnerability trung gian (PostCSS, qua dependency của Next.js) — xem mục "Vấn đề đã biết" bên dưới.npm audit ở web/ báo 1 lỗ hổng PostCSS (đọc file .map ngoài ý muốn qua sourceMappingURL) nằm
sâu trong dependency của Next.js 14. Bản vá đầy đủ yêu cầu nâng lên Next.js 16 (breaking change, cần
test lại toàn bộ trước khi áp dụng nên tôi chưa tự ý nâng). Rủi ro thực tế cho app này thấp vì đây là
dashboard nội bộ không nhận CSS từ người dùng bên ngoài — không có đường tấn công trực tiếp. Khuyến
nghị: chạy lại npm audit định kỳ, cân nhắc nâng cấp Next.js khi có thời gian test kỹ.
Vì đây là best-effort parse HTML (không phải API chính thức), tỷ lệ thành công sẽ dao động và có thể
giảm dần nếu Meta đổi giao diện. Theo dõi cột engagement_parse_ok trong bảng ads — nếu tỷ lệ
false tăng đột biến, đó là dấu hiệu cần cập nhật lại selector trong snapshotParser.js.
mx-ad-spy/
├── server/ # backend: fetch job + API
│ ├── src/db/ # schema.sql, kết nối DB
│ ├── src/lib/ # gọi Meta API, parse engagement
│ ├── src/jobs/ # job chạy theo lịch
│ ├── src/api/ # Express API
│ └── src/config/ # danh sách từ khóa cần theo dõi
├── web/ # frontend Next.js
└── .github/workflows/ # lịch chạy tự động (GitHub Actions)