- Python 100%
| .gitignore | ||
| email_config_sample.json | ||
| microcenter_monitor.py | ||
| README.md | ||
| watchlist_sample.json | ||
Microcenter-Monitor
Automated price tracker and notification bot for Micro Center PC Build Bundles (AMD & Intel). Combines deals from both the Bundle & Save promotional page and the Computer Build Bundles store catalog into a unified, deduplicated price feed.
Features
- Hybrid Scraper & 100% Coverage: Merges promo deals and catalog listings into a single list of all active bundles (AMD Ryzen, Intel Core Ultra, Xeon, and Threadripper).
- Layout-Resilient Semantic Parser: Anchors on invariant product URL links (
/product/5007xxx/) and DOM containers instead of fragile marketing CSS classes or IDs. - SKU-Keyed Alert State: Tracks alerts strictly by unique Micro Center SKU (
5007xxx). If Micro Center introduces a new SKU with an identical product description, it will alert as an independent new deal. - Directional Price-Drop Protection: Only alerts when a bundle hits a new all-time low price below your target. Ignores upward price rebounds below target to eliminate alert fatigue.
- Anti-Bot Bypass: Uses
curl_cffiwith Safari TLS impersonation to bypass Cloudflare Turnstile bot challenges. - Multi-Channel Alerts: Sends email alerts via SMTP and/or local desktop notifications via
plyer. - Store Selection: Supports querying specific local retail stores via
--store <id>(defaults to029Web/Online).
Installation & Setup
- Clone the repository
- Set up Python Virtual Environment:
python3 -m venv .venv source .venv/bin/activate pip install curl_cffi beautifulsoup4 plyer - Initialize Configuration Files:
cp watchlist_sample.json watchlist.json cp email_config_sample.json email_config.json - Configure Email Credentials (
email_config.json):{ "EMAIL_FROM": "alerts@yourdomain.com", "EMAIL_TO": "you@yourdomain.com", "SMTP_HOST": "smtp.yourprovider.com", "SMTP_PORT": 465, "SMTP_USER": "username", "SMTP_PASS": "app_password" }
How to Set Alerts
Alerts are configured in watchlist.json as a simple JSON object mapping search keywords or SKUs to maximum target prices:
{
"9800X3D": 650.00,
"285K": 750.00,
"7800X3D": 550.00,
"5007509": 850.00
}
Matching Rules
The monitor uses token-normalized matching:
- CPU Model: Matches exact model tokens (e.g.
"9800X3D"matchesAMD Ryzen 7 9800X3D, but will not false-match"9800"). - Specific SKU: You can track an exact bundle by its 7-digit SKU (e.g.
"5007509": 850.00). - Component / Board Spec: You can match motherboard chipsets or phrases (e.g.
"MSI B850": 700.00or"X870E": 900.00). - Case-Insensitive:
"9800x3d"and"9800X3D"behave identically. - Punctuation & Symbols: Trademark symbols (
™,®), commas, and hyphens are automatically normalized into spaces.
How the Alert System Works
flowchart TD
A["Scraped Bundle (SKU 5007xxx, Price, Title, Parts)"] --> B{"Matches keyword in watchlist.json?"}
B -- No --> Z["Skip Alert"]
B -- Yes --> C{"Is Price <= Target Price?"}
C -- No --> D{"Was SKU previously alerted?"}
D -- Yes --> E["Reset Alert State (Price rebounded above target)"]
D -- No --> Z
C -- Yes --> F["Check SQLite alert_state for SKU"]
F --> G{"Never alerted OR Price < Last Alerted Price?"}
G -- No (Unchanged or higher price) --> H["Suppress Alert (Prevent Spam)"]
G -- Yes (New deal or deeper discount) --> I["1. Dispatch Email & Desktop Notification<br>2. Save (SKU, Price, Timestamp) to alert_state"]
Key Behaviors
- New SKUs Always Alert: Even if a bundle has the exact same components and title as an existing bundle, a new SKU (
5007xxx) has no prior alert entry and will trigger a fresh alert. - First Match Only: If a bundle matches multiple keywords in your watchlist (e.g.,
"9800X3D"and"MSI B850"), only one alert is dispatched. - Downwards-Only Alerts:
- Price drops from $700 → $580 (target $600): ALERT SENT.
- Price rebounds from $580 → $595: SUPPRESSED (did not drop lower than $580).
- Price drops further from $580 → $520: ALERT SENT (new deeper discount!).
- Auto-Reset on Price Hikes: If a price goes back above your target (e.g. $520 → $750), the alert state resets. When it drops below $600 again in the future, you receive a fresh notification.
Reviewing & Managing Alerts
1. Preview a Search Term
Test any keyword before adding it to watchlist.json to see which bundles match and whether they would trigger an alert:
# Preview matching bundles and their current prices
python3 microcenter_monitor.py --preview "9800X3D"
# Preview with a target price to see which bundles would alert vs above target
python3 microcenter_monitor.py --preview "9800X3D" --target 900.00
2. View All Current Bundles & Prices
Scrapes live Micro Center deals and prints all bundles, prices, components, and SKUs without altering your database:
python3 microcenter_monitor.py --list
3. Review Triggered Alerts
View all bundles that have currently triggered alerts, the price at which they alerted, and the timestamp:
python3 microcenter_monitor.py --alerts
Example Output:
================================================================================
ACTIVE RECORDED ALERTS (1 Total) [2026-09-13 16:00:00]
================================================================================
SKU: 5007509 | Last Alerted: $599.99 | Alerted At: 2026-09-13 14:30:00
Title: AMD Ryzen 7 9800X3D, MSI B850 Gaming Pro WiFi6E AM5, G.Skill Flare X5 Series 32GB DDR5-6000 Kit, Computer Build Bundle
================================================================================
4. Clear / Reset Alert History
To clear all recorded alerts so that all currently qualifying deals re-trigger immediately on the next check:
python3 microcenter_monitor.py --clear-alerts
5. Check a Specific Store
Pass --store with a 3-digit store code (e.g. 141 for Tustin, CA; 191 for Santa Clara, CA; 085 for Fairfax, VA):
python3 microcenter_monitor.py --store 141
6. Generate Historical CSV Reports
Export logged price history to CSV and email it:
# All-time history
python3 microcenter_monitor.py --report all
# Last 30 days
python3 microcenter_monitor.py --report 30d
# Last year
python3 microcenter_monitor.py --report 365d
Automation
To run the monitor continuously in the background, set up a cron job:
crontab -e
Add an entry to check every 30 minutes:
*/30 * * * * /path/to/Microcenter-Monitor/.venv/bin/python3 /path/to/Microcenter-Monitor/microcenter_monitor.py >> ~/mc_monitor.log 2>&1