Install
openclaw skills install @huagavin/bidding-hunterAutomated government procurement bid discovery engine. Scans multiple Chinese procurement platforms, matches configurable keywords, tracks bid statuses, and delivers deadline-aware reports. Users configure their own keywords and monitoring targets; built-in adapters cover 5 major platforms with an extensible plugin model for adding more.
openclaw skills install @huagavin/bidding-hunterA config-driven, reusable bid discovery engine that automates the tedious process of monitoring Chinese government procurement platforms.
Compatible with any AI assistant that can execute CLI tools: OpenClaw, Claude Code, Codex CLI, Cursor Agent, and similar platforms. The skill is platform-agnostic — all operations are exposed through the bidding-hunter CLI and standard shell commands.
ANY bidding-hunter task MUST use the existing tools below. You are FORBIDDEN from writing ad-hoc scripts, inline Node.js, curl, web_fetch, or any other approach.
| Tool | Purpose | Command |
|---|---|---|
bidding-hunter CLI | All operations: scan, report, list, status, stats, export, remind, init, create-adapter, test-platform, config-validate | bidding-hunter <command> |
scripts/explore-platform.js | Explore a new platform's structure before writing an adapter | node scripts/explore-platform.js --url <url> [--recon] |
templates/platform-adapter.js | Template for creating new platform adapters | Used by bidding-hunter create-adapter |
| Platform adapters | src/platforms/*.js — scan() methods executed by the scanner | Called internally by bidding-hunter scan |
| Core modules | scanner, matcher, database, reporter, detail-fetcher, reminder, notifier | Called internally by the CLI |
scrape_*.js, fetch_*.js, test_*.js, inline node -e "...", curl, web_fetch, or any one-off scraping code.scan() method. All browser orchestration is handled by the scanner.bidding-hunter scan → bidding-hunter report.Existing tool fails
→ Read the tool's source code
→ Fix the bug in the tool itself (edit src/*.js, bin/*.js, scripts/*.js, templates/*.js)
→ Run tests: node --test tests/*.test.js
→ Re-run the tool
→ If the tool is fundamentally broken beyond repair: refactor the tool, record in memory/YYYY-MM-DD.md
Key principle: Fix the tool, don't work around it. Every workaround creates technical debt that compounds across sessions.
Memory requirement: After ANY code change to the bidding-hunter project (including bug fixes, adapter changes, config schema updates), write a note to memory/YYYY-MM-DD.md recording what was changed and why.
# Create initial config
bidding-hunter init
# Edit config with YOUR keywords
# vim ~/.bidding-hunter/config.yaml
# Run a scan
bidding-hunter scan
# View results
bidding-hunter report
Edit ~/.bidding-hunter/config.yaml — this is where YOU define what to search for:
matching:
search_queries: # What to type into platform search boxes
- "建筑工程"
- "信息化"
tiers: # Multi-tier keyword matching
high:
label: "L1"
keywords: ["建筑工程", "土建施工", "信息系统"]
medium:
label: "L2"
keywords: ["系统集成", "运维服务"]
low:
label: "L3"
keywords: ["市政工程", "园林绿化"]
blacklist: # Filter these out
- "中标"
- "成交"
- "废标"
- "更正"
Important: The agent should NOT decide keywords — the user provides them via config.
platforms:
enabled:
- beijing # 北京公共资源交易平台
- hebei # 河北省招标投标公共服务平台
- liaoning # 辽宁省公共资源交易平台
- dalian # 大连市公共资源交易平台
- national # 全国公共资源交易平台 (6 data sources)
bidding-hunter scan
This runs a deterministic pipeline: scan → match → ingest → detail fetch → reminders → report.
# List tracked entries
bidding-hunter list --status tracked
# Mark as tracked
bidding-hunter status --id 5 --status tracked
# Update bid progress
bidding-hunter status --id 5 --bid-status submitted
# Check reminders
bidding-hunter remind
When a user asks you to run or manage bidding discovery:
bidding-hunter init, then guide the user to configure keywordsbidding-hunter scan — this is deterministic, no LLM neededbidding-hunter report and present findings to the userbidding-hunter status# Let the agent explore
node scripts/explore-platform.js --url https://new-site.ggzy.gov.cn/ --recon
# Then create adapter from findings
bidding-hunter create-adapter --name new-site
# Implement extraction logic based on exploration results
# Test it
bidding-hunter test-platform --name new-site
| ID | Platform | Strategy |
|---|---|---|
beijing | 北京公共资源交易平台 | URL pagination, extraction |
hebei | 河北省招标投标公共服务平台 | fullsearch.html URL search + filter |
liaoning | 辽宁省公共资源交易平台 | API-based extraction + session cookie |
dalian | 大连市公共资源交易平台 | URL pagination |
national | 全国公共资源交易平台 | 6 data sources via UI interaction |
Explore the platform structure:
node scripts/explore-platform.js --url https://new-site.gov.cn/ --recon
This navigates to the site and captures structural hints.
Create adapter template:
bidding-hunter create-adapter --name new-site
Implement the scan() method with:
extractItems() function with correct CSS selectorsTest:
bidding-hunter test-platform --name new-site
Enable in config:
platforms:
enabled:
- new-site
# View database stats
bidding-hunter stats
# Export for analysis
bidding-hunter export --format csv > bids.csv
Add to crontab:
0 16 * * * bidding-hunter scan --config ~/.bidding-hunter/config.yaml
Or use OpenClaw cron with the bidding-hunter scan command.
Configure webhook channels in config:
notifications:
channels:
- type: feishu
webhook: "${FEISHU_WEBHOOK_URL}"
- type: slack
webhook: "${SLACK_WEBHOOK_URL}"
| Problem | Solution |
|---|---|
| Platform returns no data | Site may have changed — run test-platform to debug selectors |
| Browser launch fails | Ensure Chromium is installed: npx playwright install chromium |
| Database locked | Another scan is running — wait or remove ~/.bidding-hunter/.lock |
| Network timeouts | Increase scan.retry_stairs timeouts in config |
~/.bidding-hunter/config.yaml~/.bidding-hunter/data.db (SQLite)~/.bidding-hunter/scan_results/YYYY-MM-DD/~/.bidding-hunter/platforms/*.js