name: brand-monitoring description: Workflow for designing and deploying automated brand health and crisis monitoring systems.
Workflow for designing and deploying automated brand health and crisis monitoring systems.
Use this skill when a user wants to track mentions, reputation, or crisis signals for one or more brands across public web sources.
brands/<brand_id>/.Avoid private APIs or logged-in content. Focus on public accessibility.
| Tier | Source Type | Method | Example |
|---|---|---|---|
| Tier A | Aggregators | RSS / Search RSS | Google News RSS (use site: operator to fetch domains blocked by WAF) |
| Tier B | High-Authority News | Tag pages / RSS | VietnamPlus, Tuổi Trẻ, VnExpress |
| Tier C | Public Social/Web | Scrape / Public API | YouTube public, FB public pages |
| Tier D | Academic/Formal | REST API / Search | OpenAlex, SSRN |
Feasibility & WAF (Azure/Cloudflare 403):
- Official university/brand websites often aggressively block direct scrapers.
- Solution: Do not attempt direct scraping or bypass. Use Google News RSS query with the site:domain.edu.vn operator. Google crawls them easily, and the RSS output exposes title, source, publication date, and link without WAF risk.
- VietnamPlus RSS: Standard RSS endpoint may return 404. Fall back to parsing the public tag pages directly (vietnamplus.vn/tags/<tag>.vnp), which return a stable 200 OK.
- VnExpress search: Can block custom headers with 406. Fall back to parsing the general RSS feeds.
Social platforms (Facebook, Threads, TikTok) do not offer free public keyword-search APIs. Use Google News RSS with the site: operator as a workaround.
Approach:
- Query format: https://news.google.com/rss/search?q=site:{platform_domain}+{keyword}&hl=vi&gl=VN&ceid=VN:vi
- Keywords must be URL-encoded with urllib.parse.quote() — Vietnamese characters and spaces break feedparser otherwise.
- Use platform-specific keyword lists: broader for Facebook, stricter for TikTok.
Platform Behaviour:
| Platform | Query Domain | Result Quality | Notes |
|:---|:---|:---|:---|
| Facebook | site:facebook.com | Good | Google indexes many public Facebook posts. Filter Vietnam-specific content with keyword matching on title+snippet. |
| TikTok | site:tiktok.com | Fair — noisy | Returns TikTok video pages but mixed with unrelated hashtag content. Apply strict title+country filters (e.g. require "Việt Nam" or "FUV" in title). |
| Threads | site:threads.net | Poor — no results | Google does not meaningfully index Threads content as of mid-2026. No workaround available without dedicated scraping. |
Content Filtering (Vietnam-specific):
- Global "Fulbright" mentions dominate Facebook/TikTok (scholarship programs worldwide).
- Always combine with a VN_KEYWORDS list: ["việt nam", "vietnam", "tphcm", "hcmc", "saigon", "hồ chí minh", "fuv", "fsppm", "đại học fulbright"]
- Apply the filter by checking if any keyword appears in the lowercase title + " " + snippet combined string.
- Hub posts (short titles with #Hashtag patterns) should also be rejected.
Pitfall: facebook-scraper library fails on modern Facebook:
- The facebook-scraper Python package depends on requests-html which in turn depends on lxml.html.clean, now split into a separate lxml_html_clean package. Expect ImportError on fresh installs.
- Even after fixing the import, the library may return zero results due to Facebook API changes and aggressive bot detection.
- Conclusion: Do not rely on facebook-scraper. The Google News RSS workaround is the only reliably working method for keyword-based Facebook monitoring without API credentials.
Source Intake -> Normalize -> Deduplicate -> Relevance Score -> Sentiment Score -> Crisis Gate -> Deliver.
Crisis management is the primary goal, not just coverage.
Sentiment == Negative AND Relevance >= 70 OR Crisis Trigger is present.# or containing tin tức, hình ảnh, video clip mới nhất về) to maintain quality.chat_id and thread_id directly in the project config file (e.g. report.yaml) and use hermes send --to telegram:<chat_id>:<thread_id> to dispatch alerts. Use descriptive channel icons (like 📣) to differentiate from active work threads.deliver = local or equivalent silent mode so logs stay out of chat; only the final dispatcher/report sender speaks.chat_id and thread_id directly in the project config file (e.g. report.yaml) and use hermes send --to telegram:<chat_id>:<thread_id> to dispatch alerts. Use descriptive channel icons (like 📣) to differentiate from active work threads./docs/ folder.kanban_complete) without explicit CEO approval. When a task has completed its execution, update its result comments, block it with a status explaining it is awaiting approval, and assign it to the CEO (ceo). Only the CEO can finalize or unblock the task.https://vmi3427693.tail8c1aaf.ts.net/files/...) instead of local loopback/private IPs, ensuring they are accessible to stakeholders from any network.