StavEitam/VeriCheckyBot
GitHub: StavEitam/VeriCheckyBot
一款多源威胁情报驱动的 Telegram 机器人,为以色列用户实时分析可疑链接和截图中的 URL 是否为钓鱼或诈骗。
Stars: 0 | Forks: 0
# Veri — Telegram 钓鱼检测机器人 🛡️
一款可实时检测钓鱼和诈骗链接的 Telegram 机器人,支持以**希伯来语**回复清晰的判定结果:安全、可疑或危险——并提供应对建议。
专为通过 WhatsApp、SMS、电子邮件或 Telegram 收到可疑链接,并希望获得快速、可靠的二次验证意见的以色列用户打造——无需安装应用,无需注册账号。
## 功能
- **多源威胁情报** — 交叉比对 VirusTotal、URLScan.io、Google Safe Browsing、PhishTank、OpenPhish 和 AbuseIPDB
- **短链接解析** — 在扫描前自动展开 bit.ly、t.co、did.li 及其他短链接
- **品牌仿冒检测** — 识别针对 PayPal、Bank Hapoalim、Apple、Amazon 及其他 15 多个品牌的冒充行为
- **截图 OCR** — 使用 Tesseract 从图像中提取 URL
- **希伯来语 AI 判定** — Claude 生成通俗易懂的希伯来语安全分析报告
- **智能缓存** — SQLite 缓存可避免重复扫描已知 URL,保护免费层 API 配额
- **快速路径短路** — 检测到已确认的威胁时,跳过响应缓慢的 API
## 工作原理
```
User sends message / photo
↓
bot.py — Telegram handler
↓
Extract URLs (regex or OCR from screenshot)
↓
For each URL:
├── Unshorten (if bit.ly / t.co / etc.)
│
├── Wave 1 — fast checks (~1-2s each)
│ ├── Google Safe Browsing
│ ├── PhishTank
│ ├── OpenPhish
│ ├── AbuseIPDB
│ ├── Brand lookalike detection
│ └── Heuristic flags
│
└── Wave 2 — deep checks (15-70s) — skipped if Wave 1 confirms threat
├── VirusTotal API (malicious / suspicious / harmless engine counts)
├── URLScan.io (redirect chain, final URL, risk score, tags)
└── WHOIS domain age check
↓
translator.py — sends all signals to Claude API
↓
Claude responds in Hebrew: target domain + risk level + findings + recommendation
↓
Bot replies to user
```
## 技术栈
| 组件 | 技术 |
|-----------|------------|
| 机器人框架 | python-telegram-bot 22.7 |
| URL 威胁扫描 | VirusTotal API v3 |
| 重定向 / 沙盒分析 | URLScan.io API |
| 已知钓鱼数据库 | PhishTank API |
| 实时钓鱼信息源 | OpenPhish(公共信息源) |
| 安全浏览查询 | Google Safe Browsing API v4 |
| IP 信誉 | AbuseIPDB API |
| 域名年龄与仿冒检测 | python-whois + 自定义启发式算法 |
| OCR(截图 → URL) | pytesseract + Pillow |
| 希伯来语判定生成 | Anthropic Claude API (`claude-haiku-4-5`) |
| 缓存 | 通过 `cache.py` 使用 SQLite(1 小时 TTL) |
| HTTP 客户端 | httpx (异步) |
| 密钥管理 | python-dotenv |
| 运行时 | Python 3.11+ |
## 项目结构
```
Veri/
├── .env ← API keys (gitignored — never commit)
├── .env.example ← template for required keys
├── .gitignore
├── requirements.txt
├── bot.py ← Telegram handlers, main entry point
├── config.py ← loads .env into named constants
├── cache.py ← SQLite cache with TTL
├── translator.py ← builds prompt + calls Claude API → Hebrew verdict
├── test_sources.py ← manual integration test harness
├── tests/ ← automated test suite
└── analyzer/
├── url_checker.py ← VirusTotal, URLScan, GSB, PhishTank, OpenPhish, AbuseIPDB
├── domain_intel.py ← WHOIS age check + brand lookalike detection + heuristics
└── ocr.py ← extract URLs from screenshot images
```
## 安装说明
### 前置条件
- Python 3.11+
- 系统已安装 [Tesseract OCR](https://github.com/UB-Mannheim/tesseract/wiki)
- 所需语言包:`eng` + `heb`
### 1. 克隆并创建虚拟环境
```
git clone
cd Veri
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # macOS / Linux
```
### 2. 安装依赖
```
pip install -r requirements.txt
```
### 3. 配置 API 密钥
将 `.env.example` 复制到 `.env` 并填入您的密钥:
```
TELEGRAM_TOKEN=your_telegram_token_here
VIRUSTOTAL_KEY=your_virustotal_key_here
ANTHROPIC_KEY=your_anthropic_key_here
URLSCAN_KEY=your_urlscan_key_here
GOOGLE_SAFE_BROWSING_KEY=your_google_safe_browsing_key_here
```
#### 获取 API 密钥
| 密钥 | 来源 | 免费层 |
|-----|--------|-----------|
| `TELEGRAM_TOKEN` | Telegram 上的 [@BotFather](https://t.me/BotFather) | 免费 |
| `VIRUSTOTAL_KEY` | [virustotal.com](https://www.virustotal.com) → API | 500 次/天 |
| `ANTHROPIC_KEY` | [console.anthropic.com](https://console.anthropic.com) | 按量付费 |
| `URLSCAN_KEY` | [urlscan.io](https://urlscan.io) → 账户 | 免费层 |
| `GOOGLE_SAFE_BROWSING_KEY` | Google Cloud Console → Safe Browsing API | 免费层 |
PhishTank 和 AbuseIPDB 密钥为可选项——如果没有配置,机器人会自动降级处理。
### 4. 运行机器人
```
python bot.py
```
机器人将开始轮询 Telegram。向其发送任何包含 URL 或截图的消息即可。
## 机器人行为
| 输入 | 响应 |
|-------|----------|
| 包含 URL 的文本 | 最多扫描 3 个 URL,并针对每个 URL 回复希伯来语判定结果 |
| 照片 / 截图 | 通过 OCR 提取 URL,然后按上述方式进行扫描 |
| 不包含 URL 的文本 | 提示用户粘贴消息或发送截图 |
| `/start` | 希伯来语的问候与使用说明 |
## 希伯来语判定格式
系统会将 Claude 设置为以色列网络安全专家进行提示,其返回内容为:
```
🔗 יעד הקישור: [final domain or "unknown"]
⚠️ רמת סיכון: גבוהה / בינונית / לא ניתן לאמת
📋 ממצאים: [2–3 lines summarising what was found]
🛑 המלצה: [specific action — e.g., "אל תלחץ על הקישור"]
```
嵌入在 Claude 提示词中的关键规则:
- 绝不表述为“该链接是安全的”——仅说明“未发现已知威胁”
- 短链接始终被标记为无法验证
- 存在疑虑时,以警告代替安抚
## 品牌仿冒检测
`analyzer/domain_intel.py` 会在与品牌列表进行比对之前,标准化常见的字符替换:
| 替换 | 示例 |
|---|---|
| `0 → o` | `paypa0.com` |
| `1 → l` | `app1e.com` |
| `3 → e` | `n3tflix.com` |
| `vv → w` | `vvhatsapp.com` |
**监控的品牌:** PayPal, Apple, Google, Microsoft, Amazon, Facebook, Instagram, Netflix, Bank Hapoalim, Bank Leumi, Isracard, Max, Bit, Pepper, Poalim.
## 缓存
- **存储:** SQLite(`veri_cache.db`,首次运行时自动创建)
- **TTL:** 1 小时
- **键值:** `vt:`, `us:`, `gsb:`, `pt:`, `abuse:`, `openphish:feed`
- **目的:** 避免在同一小时内重复扫描相同 URL,保护免费 API 配额
## 已知限制
- VirusTotal 免费层:每天 500 次请求
- URLScan 深度扫描需要 10–70 秒(内置异步轮询)
- OCR 准确度取决于截图质量
- 机器人将每条消息的 URL 数量限制为 3 个,以保护 API 配额
- 按消息无状态处理——不保留持久的用户历史记录
## 部署 (Render)
1. 推送到 GitHub
2. 在 [render.com](https://render.com) 创建新的 **Web Service**(免费层)
3. 设置启动命令:`python bot.py`
4. 在 Render 面板中将所有 `.env` 密钥添加为环境变量
5. 部署——机器人将持续轮询 Telegram
## 路线图
- [ ] 部署到 Render(免费层,全天候运行)
- [ ] 针对 URLScan 超时的重试逻辑
- [ ] 群聊支持(仅在 @提及时响应)
- [ ] 用户级速率限制
- [ ] `/report` 命令以标记漏报
标签:OCR, Python, SQLite, 威胁情报, 开发者工具, 无后门, 运行时操纵, 逆向工具, 钓鱼检测