iknowkungfubar/freelance-lead-gen
GitHub: iknowkungfubar/freelance-lead-gen
一款自动化自由职业线索发现、AI 评分筛选与个性化联系草稿生成的接包辅助工具,内置完整的人工审查工作流。
Stars: 1 | Forks: 0
# 自由职业 Lead Gen
**Freelance Lead Gen** 自动化发现 Upwork、LinkedIn、Freelancer 和各大求职板上的自由职业及合同机会。它结合基于规则的评分和 LLM 驱动的分析来筛选线索,并生成带有反 AI 检测质量门禁的个性化联系草稿。在执行任何操作之前,所有内容都会呈现在终端 UI 中供人工审查。
## 快速入门
### 1. 获取 API Key
本系统使用 LLM (AI) 来筛选线索并生成联系草稿。
您需要从受支持的提供商处获取 API key:
- **[OpenCode](https://opencode.ai)** (推荐) — 10 美元免费额度,无需订阅
- **OpenAI** — 标准 API key
- 任何兼容 OpenAI 的提供商
### 2. 一键启动 (Docker)
```
docker run -p 8080:8080 -e LLM_API_KEY=*** ghcr.io/iknowkungfubar/freelance-lead-gen
```
然后打开 http://localhost:8080 查看健康状态。
### 3. 快速启动向导 (Python)
```
pip install freelance-lead-gen
freelance-lead-gen quickstart
```
### 4. 手动设置
将 `.env.example` 复制为 `.env`,填入您的 API key,然后:
```
freelance-lead-gen init
freelance-lead-gen discover --dry-run
freelance-lead-gen serve
```
### 5. 平台凭证
为了从 Upwork、LinkedIn 和 Freelancer 抓取机会,系统需要使用您的账户凭证登录每个平台。
- 您需要在每个想要监控的平台上拥有一个**免费账户**
- 浏览器自动化会在发现过程中使用您的凭证自动登录
- 凭证**本地**存储在 `.env` 中,除平台本身外绝不发送至任何其他地方
将您的凭证添加到 `.env` 中:
```
UPWORK_USERNAME=your_email@example.com
UPWORK_PASSWORD=your_password
LINKEDIN_USERNAME=your_email@example.com
LINKEDIN_PASSWORD=your_password
FREELANCER_USERNAME=your_email@example.com
FREELANCER_PASSWORD=your_password
```
## 功能特性
- **多平台发现** — 自动抓取 Upwork、LinkedIn、Freelancer 以及可配置的求职板,并使用针对特定平台的反机器人配置
- **AI 驱动的资格审核** — 结合基于规则的评分和 AI 驱动的技能/职位/预算分析,并进行等级划分 (HIGH / POTENTIAL / LOW)
- **个性化联系** — 生成量身定制的提案草稿,并带有反 AI 检测质量门禁,以确保语言自然
- **验证 pipeline** — 对每份草稿进行可读性评分、禁用短语扫描、AI 标记检测和结构检查
- **HITL (Human-in-the-Loop)** — 在终端 UI 中,所有联系草稿在提交前都需要经过人工审查和批准
- **隐身浏览器自动化** — 指纹轮换、模拟人类鼠标移动、高斯抖动延迟,以及可选的 `playwright-stealth` 集成,以避免被平台检测
- **可配置的调度** — 基于 APScheduler 的定期发现运行,支持可配置的时间间隔和每日上限
- **目标每天 50 条线索** — 旨在每天处理来自不同搜索查询的多达 50 条合格线索
- **丰富的终端 UI** — 使用 Textual 构建的仪表板、线索列表、详细视图、内容编辑器和审查队列
- **无自主提交** — 代理负责发现、筛选、起草和验证 — 但绝不提交。所有出站操作必须通过 HITL 门禁。
## 架构
系统采用分阶段的 pipeline 架构。机会按顺序流经每个阶段,并在每个阶段持久化到 SQLite。
```
graph LR
subgraph Discovery
DA[Discovery Agent]
EX[Platform Extractors]
MB[Managed Browser]
end
subgraph Filtering
FP[Filtering Pipeline]
PM[Profile Matcher]
LLM1[LLM Scorer]
end
subgraph Personalization
PA[Personalization Agent]
LLM2[LLM Generator]
AQ[Anti-AI Quality Gate]
end
subgraph Verification
VA[Verification Agent]
end
subgraph HITL
TUI[Terminal UI / Review Queue]
HUMAN[Human Reviewer]
end
DA --> FP
FP --> PA
PA --> VA
VA --> TUI
TUI -->|approve/reject| HUMAN
EX --> DA
MB --> EX
PM --> FP
LLM1 --> FP
LLM2 --> PA
AQ --> PA
```
**数据流:** 原始线索 → 结构化机会 → 评分与分层 → 个性化草稿 → 已验证草稿 → 人工审查 → 批准提交(手动)。
## 快速开始
最快的上手方式是交互式**快速启动向导**:
```
pip install freelance-lead-gen
freelance-lead-gen quickstart
```
向导将引导您在 2 分钟内完成 API key 和平台凭证的设置,
随后您就可以开始了:
```
freelance-lead-gen discover # find opportunities
freelance-lead-gen review # review and approve drafts
```
### 手动设置(替代方案)
用于开发或需要完全控制时,请克隆存储库并手动设置:
```
# Clone the repository
git clone https://github.com/iknowkungfubar/freelance-lead-gen.git
cd freelance-lead-gen
# 使用 uv 安装(推荐)
uv venv
source .venv/bin/activate
uv sync
# 安装 Playwright browsers
playwright install chromium
# 复制并编辑配置
cp .env.example .env
# 编辑 .env 并填入你的 LLM API key 和平台凭据
# 初始化数据库
freelance-lead-gen init
# 运行 discovery(可选 — 按你的配置进行 enrich)
freelance-lead-gen discover
# 启动 review TUI
freelance-lead-gen review
# 或运行完整 pipeline
freelance-lead-gen pipeline
```
## 配置
所有配置均通过环境变量或项目根目录下的 `.env` 文件进行管理。将 `.env.example` 复制为 `.env` 并填入您的值。
### LLM
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `LLM_PROVIDER` | `opencode` | 提供商名称(用于日志记录/路由) |
| `LLM_MODEL` | `deepseek-v4-flash` | 模型标识符 |
| `LLM_BASE_URL` | `https://opencode.ai/zen/go/v1` | API 基础 URL (兼容 OpenAI) |
| `LLM_API_KEY` | — | API key |
| `LLM_MAX_RETRIES` | `3` | 最大 API 调用重试次数 |
| `LLM_TIMEOUT_SECONDS` | `120` | 请求超时时间(秒) |
### Browser
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `BROWSER_HEADLESS` | `false` | 以无头模式运行浏览器 |
| `BROWSER_USER_DATA_DIR` | `./browser_data` | 浏览器用户数据目录的路径 |
| `BROWSER_PROFILE_NAME` | `Default` | 要使用的浏览器配置文件名称 |
| `BROWSER_VIEWPORT_WIDTH` | `1920` | 默认视口宽度 (px) |
| `BROWSER_VIEWPORT_HEIGHT` | `1080` | 默认视口高度 (px) |
### Discovery
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `DISCOVERY_MAX_DAILY` | `50` | 每天处理的最大机会数 |
| `DISCOVERY_SCHEDULE_INTERVAL_MINUTES` | `60` | 发现轮次之间的间隔(分钟) |
| `DISCOVERY_SEARCH_QUERIES` | `AI automation,AI readiness assessment,…` | 以逗号分隔的搜索查询 |
### Database
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `DATABASE_PATH` | `./data/leads.db` | SQLite 数据库文件路径 |
| `DATABASE_ECHO` | `false` | 记录所有 SQL 语句(调试) |
| `DATABASE_POOL_SIZE` | `5` | 连接池大小 |
| `DATABASE_POOL_OVERFLOW` | `10` | 最大溢出连接数 |
### HITL (Human-in-the-Loop)
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `HITL_ENABLED` | `true` | 启用 HITL 审查门禁 |
| `HITL_AUTO_APPROVE` | `false` | 在未经人工审查的情况下自动批准联系草稿 |
| `HITL_REVIEW_TIMEOUT_SECONDS` | `300` | 等待人工审查的最长秒数,超过则跳过 |
### Platforms
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `PLATFORMS_ENABLED` | `upwork,linkedin,freelancer` | 以逗号分隔的已启用平台列表 |
### 平台凭证
这些仅通过环境变量设置(绝不硬编码):
| 变量 | 描述 |
|----------|-------------|
| `UPWORK_USERNAME` | Upwork 账户邮箱/用户名 |
| `UPWORK_PASSWORD` | Upwork 账户密码 |
| `LINKEDIN_USERNAME` | LinkedIn 账户邮箱/用户名 |
| `LINKEDIN_PASSWORD` | LinkedIn 账户密码 |
| `FREELANCER_USERNAME` | Freelancer.com 账户用户名 |
| `FREELANCER_PASSWORD` | Freelancer.com 账户密码 |
## CLI 命令
| 命令 | 描述 |
|---------|-------------|
| `init` | 初始化数据库并创建 schema(幂等) |
| `discover` | 运行发现阶段 — 在已启用的平台上搜索新机会 |
| `pipeline` | 运行完整的 pipeline(发现 → 过滤 → 个性化 → 验证 → HITL) |
| `review` | 打开终端 UI,专注于审查队列以批准草稿 |
| `list` | 列出带有可选过滤器(状态、平台、限制)的机会 |
| `stats` | 显示聚合 pipeline 统计信息和平台细分数据 |
| `quickstart` | 交互式首次设置向导 — 在 2 分钟内配置 API key 和平台 |
| `serve` | 启动调度程序守护进程以进行定期发现运行 |
```
freelance-lead-gen --help
freelance-lead-gen init
freelance-lead-gen list --status qualified --limit 20
freelance-lead-gen stats
```
## 平台设置
### Upwork
1. 将您的凭证添加到 `.env` 中:`UPWORK_USERNAME` 和 `UPWORK_PASSWORD`
2. Upwork 提取器使用带身份验证的标准搜索界面
3. 反机器人配置:启用隐身、模拟人类鼠标移动、随机延迟
### LinkedIn
1. 将您的凭证添加到 `.env` 中:`LINKEDIN_USERNAME` 和 `LINKEDIN_PASSWORD`
2. LinkedIn 提取器使用基于关键字并带有分页的职位搜索
3. 反机器人配置:启用隐身、保守延迟、会话持久化
### Freelancer
1. 将您的凭证添加到 `.env` 中:`FREELANCER_USERNAME` 和 `FREELANCER_PASSWORD`
2. Freelancer 提取器使用公开的项目列表页面
3. 反机器人配置:具有更长随机延迟的增强型隐身
### 求职板(通用)
求职板使用带有基于 CSS 选择器配置的 `GenericPlaywrightExtractor`。公共板块无需身份验证。通过 `PLATFORMS_ENABLED` 变量进行配置。
### 添加新平台
请参阅[开发指南](docs/development.md#adding-a-new-platform)以获取有关创建自定义平台提取器的分步说明。
## 安全与 HITL (Human-in-the-Loop)
本系统将**安全和人工监督**作为核心理念进行设计:
- **代理绝不自主提交任何内容** — 它负责发现、筛选、起草和验证,但所有出站通信都需要通过审查队列获得明确的人工批准
- **HITL 审查门禁** — 每一份联系草稿在提交前都会呈现在终端 UI 中供人工审查
- **草稿版本控制** — 所有草稿的更改都会被追踪并保留完整的版本历史记录;您随时可以查看更改的内容
- **禁用短语检测** — 验证代理会在草稿进入审查阶段之前扫描有问题的语言模式
- **反 AI 内容门禁** — 可读性评分和 AI 标记检测有助于保持生成的内容自然,并避免被平台检测到
## 开发
```
# 安装 dev dependencies
uv sync --group dev
# 运行 tests
pytest
# 运行 coverage
pytest --cov=freelance_lead_gen --cov-report=term-missing
# Lint
ruff check src/
# Format
ruff format src/
# Type check
mypy src/
```
请参阅[开发指南](docs/development.md)了解详细的设置、测试规范和平台集成说明。
## 项目结构
```
freelance-lead-gen/
├── src/freelance_lead_gen/
│ ├── cli.py # Click CLI entry point
│ ├── llm.py # LLM client (OpenAI-compatible)
│ ├── agents/ # Pipeline agents
│ │ ├── orchestrator.py # LeadGenOrchestrator
│ │ ├── filtering_agent.py # Filtering & scoring
│ │ ├── personalization_agent.py # Outreach draft generation
│ │ ├── verification_agent.py # Quality & safety checks
│ │ └── profile_matcher.py # Skill/title similarity scoring
│ ├── config/ # Settings and prompt templates
│ │ ├── settings.py # Pydantic models for all config
│ │ └── prompts.py # LLM prompt templates
│ ├── discovery/ # Browser automation & extraction
│ │ ├── browser.py # ManagedBrowser (Playwright wrapper)
│ │ ├── discovery_agent.py # Coordination of extraction runs
│ │ ├── extractor.py # GenericPlaywrightExtractor
│ │ ├── scheduler.py # APScheduler periodic runner
│ │ └── platforms/ # Per-platform extractors
│ ├── models/ # Pydantic domain models
│ │ ├── opportunity.py
│ │ ├── pipeline.py
│ │ └── platform.py
│ ├── storage/ # Database layer
│ │ ├── database.py # SQLAlchemy async engine
│ │ ├── migrations.py # Inline migration runner
│ │ └── repository.py # OpportunityRepository
│ ├── ui/ # Textual terminal UI
│ │ ├── app.py # TUI application
│ │ ├── dashboard.py # Dashboard screen
│ │ ├── lead_list.py # Lead listing screen
│ │ ├── lead_detail.py # Lead detail screen
│ │ ├── content_editor.py # Draft editor screen
│ │ ├── review_queue.py # Review queue screen
│ │ └── widgets.py # Shared UI widgets
│ └── utils/ # Utilities
│ ├── fingerprint.py # Browser fingerprint generation
│ └── logging.py # Structured logging config
├── tests/ # Test suite
├── docs/ # Documentation
│ ├── architecture.md
│ ├── development.md
│ └── security.md
└── .github/ # CI/CD, issue templates
```
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
*使用 Playwright、SQLAlchemy、Textual 和结构化的 LLM pipeline 构建。*
标签:DLL 劫持, Petitpotam, 商业爬虫, 大语言模型, 客户线索挖掘, 浏览器自动化, 特征检测, 终端用户界面, 请求拦截, 逆向工具