Iran Chemical Database — an HTTrack-powered live crawling system that builds a dated, auditable, BEST-EFFORT index of confirmed and unresolved chemical offerings discovered in configured public Iranian supplier catalogues. Discovers and mirrors supplier websites with HTTrack (polite crawling, robots-aware), extracts catalogue entries from local mirrors (HTML/JSON-LD/PDF/Excel/DOCX/JSON-API), classifies with a configurable inclusion policy (research_only | lab_or_research | all_identifiable_catalogue) plus explicit structure-first organic classification, validates with RDKit/PubChem, and maintains a live PostgreSQL database with FastAPI + Streamlit interfaces. Coverage, crawl states and rejection reasons are measured and published — never claimed complete. Installation provides software, not a populated dataset. v2.6 adds a WooCommerce/WordPress REST + sitemap engine (public /wp-json/wc/store/v1/products), a fingerprint-annotated seed list (dead/parked/geo-blocked/WooCommerce per-URL), geo-block detection, and a fixed Celery dispatch path. v2.10 adds a SOCIAL CATALOGUE engine: content-verified public Telegram channels (t.me/s/<chan> — no login/API key, not geo-blocked) are mirrored with bounded-parallel backward pagination to the true channel beginning and incremental resync, then parsed locally into molecules via a curated Persian/Latin alias dictionary + CAS-anchored fallback + PubChem enrichment, with a role-aware listing discriminator, unit-anchored price extraction, domain-aware grade classification, forwarded-from channel discovery, and /api/v1/social/* endpoints. v2.11 enforces a HARD Iranian-suppliers-ONLY scope rule: an evidence-based country gate (Enamad trust-seal, شناسه ملی/کد اقتصادی/کد پستی registry IDs, .ir ccTLD, +98 telephony, IRR pricing, Iranian hosting) requires at least two INDEPENDENT signal families and zero foreign disqualifiers (multinational-owned domain, foreign ccTLD, foreign HQ statement) before any supplier is admitted, defaulting to DENY; it distinguishes supplier nationality from product brand so Iranian importers reselling Merck/Sigma/TCI are kept while the multinationals themselves are rejected, and records auditable per-vendor provenance exposed via /api/v1/social/country-policy and tools/audit_country.py. v2.12 hardens Telegram extraction: a structured field extractor reads supplier catalogue lines (SKU, brand, IUPAC name, purity, grade, pack size normalised to g/ml, availability) so posts are resolved by SHAPE instead of only by a curated alias dictionary, lifting the live corpus from 84 to 240 molecules; a Persian/Farsi language gate requires every channel to be Iranian AND to publish Persian (Arabic-script and English-only channels are refused, with Persian-vs-Arabic disambiguation); a cached PubChem resolver makes re-parses free; and one-command retrieval (social_crawl fetch|search --query --brand --in-stock --with-price --out file.csv|json|xlsx, plus /api/v1/social/search) makes the data trivial to pull. Persian NLP support, Playwright + network-recording fallback for JS/API catalogues, Celery scheduling, Docker deployment. v2.16 adds the 651-row market-verified seed (every row backed by a real crawled listing; unified evidence schema), the one-command tools/export_verified.py pipeline (gates -> CID dedupe at admission -> unified schema -> provenance hash per row, zero same-CID rows), the provider-resilient AI normalization hop chain (src/utils/ai_hopchain.py, arena router.py first, env-key providers with failover/adaptive budgets after), exhaustive ordered relay failover with a per-host working-method cache (fetch_with_failover), .env.example restoration, and 14 new regression tests; v2.15 expanded the baseline to 692 deduped molecules; v2.14 added the seed-baseline machinery (data/seed_export/, tools/seed_load.py, src/utils/seed_db.py). v2.17 grows the market-verified seed from 651 to 873 molecules (+224) from a deep historical Telegram sweep (14,907 -> 29,841 posts across 12 channels), backfills canonical_smiles on 615 existing rows after PubChem retired the CanonicalSMILES property (use SMILES/ConnectivitySMILES/IsomericSMILES), and fixes a false-organic gate: carbon is now matched as element C via regex C(?![a-z]) instead of a bare substring test that admitted CuO4S, CaCl2, ClH and Cu as organic (29 rows relabelled inorganic, 3 rows re-verified against PubChem where the CID disagreed with the row's own InChIKey, 2 duplicate structures merged). For academic procurement research.

Install

openclaw skills install @orionshaowswmw/iran-chem-database