# qiuzhao **Repository Path**: git_bai/qiuzhao ## Basic Information - **Project Name**: qiuzhao - **Description**: 个人vibe coding秋招扫描 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: codex/phase-5-6 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-11 - **Last Updated**: 2026-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # recruit-radar-2027 Private, manually triggered 2027 campus recruitment radar built with Streamlit. The project follows `/Users/a221209/Desktop/2027秋招扫描器-最终技术路线-Codex开发版.md`. ## Current Status Implemented: - Project skeleton, Streamlit entry point, pages, quality tooling, and smoke test. - Local CSV recruitment storage, manual entry, list filtering, user status, notes, and Excel export. - Source configuration storage. - Safe manual scan service with SSRF URL validation, robots checks, a unified HTTP client, static HTML and article adapters, and fixture-backed tests. - Deterministic parsing for 2027 graduation year, recruitment batch, locations, position categories, dates, deadlines, canonical URLs, dedup fingerprints, change detection, and confidence scoring. - Google Sheets persistence with automatic local CSV fallback when credentials are absent or unusable. - Mobile-friendly recruitment cards, desktop table view, diagnostics summary, and default public source configuration. Not implemented yet: - A live Streamlit Community Cloud app has not been created from this local branch. ## Local Development Use Python 3.12. ```bash python -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip python -m pip install -r requirements.txt ruff check . pytest -q python -m streamlit run app.py ``` ## Persistence By default, the app stores data under `data/*.csv`. To use Google Sheets, configure both values below in `.streamlit/secrets.toml` or as environment variables: ```toml [google_sheets] spreadsheet_id = "your-spreadsheet-id" service_account_json = "{\"client_email\":\"...\"}" ``` Equivalent environment variables: ```bash export GOOGLE_SHEETS_SPREADSHEET_ID="your-spreadsheet-id" export GOOGLE_SHEETS_SERVICE_ACCOUNT_JSON='{"client_email":"..."}' ``` The service account must have edit access to the target spreadsheet. If the Google Sheets configuration is missing or invalid, the app falls back to local CSV and the settings page reports the fallback reason without exposing secrets. ## Default Sources `config/sources.yaml` includes ten public company recruiting entrances: - Tencent: `https://join.qq.com/` - Alibaba: `https://campus-talent.alibaba.com/` - ByteDance: `https://jobs.bytedance.com/campus` - Meituan: `https://campus.meituan.com/` - JD: `https://zhaopin.jd.com/` - Baidu: `https://talent.baidu.com/` - Huawei: `https://career.huawei.com/cn/campus-recruitment` - NetEase: `https://hr.163.com/campus/` - OPPO: `https://careers.oppo.com/university/oppo/campus/` - Xiaomi: `https://hr.xiaomi.com/campus` Representative local fixtures live under `tests/fixtures/html/`; tests parse those fixtures and do not depend on live recruitment sites. Several modern recruiting portals are JavaScript-heavy, so their source tags include `needs_review:javascript_heavy`. Do not add Playwright or browser automation for MVP scanning. To seed these sources into the active storage backend: ```bash python scripts/seed_sources.py ``` Robots spot check on July 11, 2026: - `200`: Tencent, ByteDance, Meituan, JD, Huawei, NetEase, OPPO - `404`: Alibaba, Baidu, Xiaomi `404` for `robots.txt` means no robots file was found during the spot check; app scans still go through the unified robots checker and safe HTTP client at runtime. ## Streamlit Community Cloud Deployment remains a user-owned step because it requires GitHub, Streamlit, Google Cloud, and Sheet-sharing actions. 1. Create a private GitHub repository and push this project. 2. In Streamlit Community Cloud, create a private app from the repository and set the entrypoint to `app.py`. 3. Add the `[google_sheets]` secrets shown above, or leave them empty to run with local CSV in development-style mode. 4. Share the target Google Sheet with the service account `client_email`. 5. Open the app and verify: login works, page load does not scan, manual scan button is the only external fetch path, list view loads, state update persists, and Excel export downloads. Do not paste credentials into source files, GitHub issues, logs, screenshots, or the diagnostics page. ## Safety Principle The application must not scan automatically. External websites may only be accessed after the user explicitly clicks a scan or parse button.